-
Notifications
You must be signed in to change notification settings - Fork 28
feat: Add bytecode deployment script #68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can reuse [the same script](https://github.com/circlefin/buidl-wallet-contracts/tree/master/script) and include "V2" in the file name. For the new contracts, this bytecode deployment approach will be the default.
*/ | ||
pragma solidity 0.8.24; | ||
|
||
address constant ENTRY_POINT = 0x0000000071727De22E5E9d8BAf0edAc6f37da032; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd like to keep /bytecode-deploy separate from existing scripts and avoid making changes to existing scripts
contract DeployPluginManagerScript is Script { | ||
error DeployFailed(); | ||
|
||
address internal constant DETERMINISTIC_DEPLOYMENT_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
string memory path = string.concat(root, "/script/bytecode-deploy/build-output/PluginManager.json"); | ||
string memory json = vm.readFile(path); | ||
|
||
bytes32 salt = bytes32("0x202501291645"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
make this configurable?
getSaltFromEnvOrDefault
- if the env has overridden value, then use it, otherwise default to a value 0.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used a salt mined for 7 leading zeros on the address, it's better to leave it in each deployment script since they're contract bytecode specific.
contract DeployUpgradableMSCAFactoryScript is Script { | ||
error DeployFailed(); | ||
|
||
address internal constant DETERMINISTIC_DEPLOYMENT_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
Please also fill in the PR description when it's moved to "ready for review". |
import {Script, console} from "forge-std/src/Script.sol"; | ||
|
||
contract DeployUpgradableMSCAFactoryScript is Script { | ||
error DeployFailed(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could add this to a new Errors.sol and share it across scripts
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
@@ -0,0 +1 @@ | |||
{"abi":[{"type":"function","name":"NAME","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"addAllowedRecipients","inputs":[{"name":"recipients","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAllowedRecipients","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"onInstall","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onUninstall","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pluginManifest","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct PluginManifest","components":[{"name":"interfaceIds","type":"bytes4[]","internalType":"bytes4[]"},{"name":"dependencyInterfaceIds","type":"bytes4[]","internalType":"bytes4[]"},{"name":"executionFunctions","type":"bytes4[]","internalType":"bytes4[]"},{"name":"permittedExecutionSelectors","type":"bytes4[]","internalType":"bytes4[]"},{"name":"permitAnyExternalAddress","type":"bool","internalType":"bool"},{"name":"canSpendNativeToken","type":"bool","internalType":"bool"},{"name":"permittedExternalCalls","type":"tuple[]","internalType":"struct ManifestExternalCallPermission[]","components":[{"name":"externalAddress","type":"address","internalType":"address"},{"name":"permitAnySelector","type":"bool","internalType":"bool"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]},{"name":"userOpValidationFunctions","type":"tuple[]","internalType":"struct ManifestAssociatedFunction[]","components":[{"name":"executionSelector","type":"bytes4","internalType":"bytes4"},{"name":"associatedFunction","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]}]},{"name":"runtimeValidationFunctions","type":"tuple[]","internalType":"struct ManifestAssociatedFunction[]","components":[{"name":"executionSelector","type":"bytes4","internalType":"bytes4"},{"name":"associatedFunction","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]}]},{"name":"preUserOpValidationHooks","type":"tuple[]","internalType":"struct ManifestAssociatedFunction[]","components":[{"name":"executionSelector","type":"bytes4","internalType":"bytes4"},{"name":"associatedFunction","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]}]},{"name":"preRuntimeValidationHooks","type":"tuple[]","internalType":"struct ManifestAssociatedFunction[]","components":[{"name":"executionSelector","type":"bytes4","internalType":"bytes4"},{"name":"associatedFunction","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]}]},{"name":"executionHooks","type":"tuple[]","internalType":"struct ManifestExecutionHook[]","components":[{"name":"selector","type":"bytes4","internalType":"bytes4"},{"name":"preExecHook","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]},{"name":"postExecHook","type":"tuple","internalType":"struct ManifestFunction","components":[{"name":"functionType","type":"uint8","internalType":"enum ManifestAssociatedFunctionType"},{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"dependencyIndex","type":"uint256","internalType":"uint256"}]}]}]}],"stateMutability":"pure"},{"type":"function","name":"pluginMetadata","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct PluginMetadata","components":[{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"author","type":"string","internalType":"string"},{"name":"permissionDescriptors","type":"tuple[]","internalType":"struct SelectorPermission[]","components":[{"name":"functionSelector","type":"bytes4","internalType":"bytes4"},{"name":"permissionDescription","type":"string","internalType":"string"}]}]}],"stateMutability":"pure"},{"type":"function","name":"postExecutionHook","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"preExecHookData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"preExecutionHook","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"sender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"context","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"preRuntimeValidationHook","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"preUserOpValidationHook","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"removeAllowedRecipients","inputs":[{"name":"recipients","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"runtimeValidationFunction","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"sender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"userOpValidationFunction","inputs":[{"name":"functionId","type":"uint8","internalType":"uint8"},{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"validationData","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"AllowedAddressesAdded","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"recipients","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"AllowedAddressesNotRemoved","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AllowedAddressesRemoved","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"recipients","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"error","name":"AlreadyInitialized","inputs":[]},{"type":"error","name":"CallDataIsNotEmpty","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"FailToAddRecipient","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"}]},{"type":"error","name":"FailToRemoveRecipient","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidTargetCodeLength","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"NotImplemented","inputs":[{"name":"selector","type":"bytes4","internalType":"bytes4"},{"name":"functionId","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"NotInitialized","inputs":[]},{"type":"error","name":"UnauthorizedRecipient","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"}]},{"type":"error","name":"Unsupported","inputs":[]}],"bytecode":{"object":"0x6080806040523461001657611c56908161001c8239f35b600080fdfe6080806040526004908136101561001557600080fd5b60003560e01c90816301ffc9a714610d0b575080630ae779e114610c425780630c7ecd8414610c255780631128186d14610be8578063118a53891461095f57806315b76b841461093d57806346d60eb2146106c957806347b19eee146108e75780636d61fe70146108425780638a91b0e31461073a578063a3f4df7e146106e0578063bfd151c1146106c9578063c4db8dd9146106b4578063c7763130146101115763cf01c349146100c657600080fd5b3461010c57602036600319011261010c57356001600160a01b038116810361010c576100fc6100f761010892611940565b611a02565b60405191829182611043565b0390f35b600080fd5b3461010c57600036600319011261010c5761012a611520565b50610133611520565b61013b610f31565b60038152606036602083013780604083015261015e6323d8cf7760e11b91611249565b52630ae779e160e01b6101746040830151611256565b5263cf01c34960e01b61018a6040830151611266565b5261019361158c565b6101208201526102bd6101a4610f12565b6001815260006020820152600060408201526101e86101c1610edd565b635b0e93fb60e11b928382526020820152610120850151906101e282611249565b52611249565b506102826101f4610f12565b91600183526002602084015260006040840152610239610212610edd565b631a7e6adf60e11b9485825260208201526101208701519061023382611256565b52611256565b5061024261158c565b610140860152610250610f12565b60018152600160208201526000604082015261026a610edd565b9182526020820152610140850151906101e282611249565b5061028b610f12565b6001815260036020820152600060408201526102a5610edd565b91825260208201526101408301519061023382611256565b506102ec6102c9610f12565b6002815260403660208301376020830181905263043140ed60e01b918291611249565b526102fa6020830151611256565b52610378610306610f12565b60028152600060208201526001604082015261032061158c565b60e0840152610350610330610edd565b6323d8cf7760e11b81526020810183905260e0850151906101e282611249565b50610359610edd565b90630ae779e160e01b8252602082015260e08301519061023382611256565b50610381610f12565b9060028252600060208301526000604083015261039c610f12565b6003815260006020820152600060408201526103b6610f31565b926003845260005b6060811061067c575061042b90839461010061045a9501526104026103e1610edd565b6323d8cf7760e11b815260208101839052610100870151906101e282611249565b5061040b610edd565b90630ae779e160e01b825260208201526101008501519061023382611256565b50610434610edd565b9063cf01c34960e01b825260208201526101008301519061045482611266565b52611266565b50610463610edd565b600181526020368183013780825263412b922360e11b9061048390611249565b526040518091602082526104f06104da6104c46104ae845161018060208801526101a0870190610f75565b6020850151868203601f19016040880152610f75565b6040840151858203601f19016060870152610f75565b6060830151848203601f19016080860152610f75565b6080820151151560a084015260a0820151151560c084015260c082015190601f198482030160e0850152815180825260208201916020808360051b8301019401926000915b838310610625578780886105906105786105608b60e0850151601f1987830301610100880152610fef565b610100840151858203601f1901610120870152610fef565b610120830151848203601f1901610140860152610fef565b6105ae6101408301519161016092601f198683030184870152610fef565b91015190601f19838203016101808401526020808351928381520192019060005b8181106105dd575050500390f35b91935091602060e06001926106176040885163ffffffff851b815116845261060b8682015187860190610fb3565b01516080830190610fb3565b0194019101918493926105cf565b91939596509193602080610669600193601f19868203018752606060408b51878060a01b038151168452858101511515868501520151918160408201520190610f75565b9701930193019092879695949293610535565b602090610687610edd565b60008152610693610f12565b600081526000848201526000604082015283820152828288010152016103be565b3461010c576106c236610e99565b5050611396565b3461010c576106d736610e04565b50505050611396565b3461010c57600036600319011261010c576101086106fc610edd565b602081527f436f6c642053746f72616765204164647265737320426f6f6b20506c7567696e6020820152604051918291602083526020830190610e59565b503461010c57602036600319011261010c578035906001600160401b03821161010c5761076991369101610dd7565b50506107776100f733611940565b6113888151106000146108195760408051338152637c9c64bb60e11b6020820152600091810191909152600160608201815b156107c9575b600091815260808320600061fffe198254169155916107a9565b600182161580610810575b6107af575050507f8342bc442963161fe55b209fbfc4dafccac754f61a43438af2615c68dac75ed36040518061080b339482611043565b0390a2005b508115156107d4565b50337fe7286f689afa21e4be11e804963cab3150095657dda0d218dc22bf2eb0c682ca600080a2005b503461010c57602036600319011261010c5780356001600160401b039182821161010c5761087291369101610dd7565b8092919261087c57005b82019160208184031261010c57803591821161010c57019080601f8301121561010c578160206108ae933591016114d3565b6108b78161173c565b7f2762cf05265ec47ebbfe12ce03afa1f82fa948b789548da6e83f3a083ffb10e46040518061080b339482611043565b3461010c5761080b7f2762cf05265ec47ebbfe12ce03afa1f82fa948b789548da6e83f3a083ffb10e461091936610d77565b61092f61092a9492943683876114d3565b61173c565b6040519182913395836110c2565b3461010c57602061095761095036610e99565b509061142a565b604051908152f35b3461010c57600036600319011261010c576109786113c4565b506109816113c4565b610989610edd565b906020918281527f436f6c642053746f72616765204164647265737320426f6f6b20506c7567696e8382015281526109bf610edd565b60058152640312e302e360dc1b838201528282019081526109de610edd565b90601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000008483015260408301918252610a17610f31565b906003825260005b606080821015610a4957908691610a34610edd565b90600082528382015282828601015201610a1f565b5050909391610b6d9060608501958652610add610a64610edd565b60108152610aa86f41646472657373426f6f6b577269746560801b918288820152610a8d610edd565b906323d8cf7760e11b8252888201528951906101e282611249565b50610ab1610edd565b906010825286820152610ac2610edd565b90630ae779e160e01b82528682015287519061023382611256565b50610b27610ae9610edd565b600f81526e1059191c995cdcd09bdbdad4995859608a1b86820152610b0c610edd565b9063cf01c34960e01b82528682015287519061045482611266565b50610b5c610b46604051968688525160808789015260a0880190610e59565b935193601f199485888303016040890152610e59565b905183868303016060870152610e59565b9351918184860301608085015282519081865280860181808460051b8901019501936000975b848910610ba05787870388f35b9091929394958480610bd6838686600196030188526040838c5163ffffffff60e01b815116845201519181858201520190610e59565b98019401980197919094939294610b93565b503461010c57604036600319011261010c5780359060ff8216820361010c57602435906001600160401b03821161010c576106c291369101610dd7565b3461010c57610c40610c3636610e04565b93915091506112ce565b005b503461010c57610c5136610d77565b909160005b828110610c905760405133907f8342bc442963161fe55b209fbfc4dafccac754f61a43438af2615c68dac75ed3908061080b8789836110c2565b610cbe6bffffffffffffffffffffffff19610cb4610caf848789611088565b6110ae565b60601b16336115e4565b15610ccb57600101610c56565b610cd992610caf9294611088565b6040805163e3bee48360e01b8152339381019384526001600160a01b03909216602084015290918291010390fd5b0390fd5b823461010c57602036600319011261010c57359063ffffffff60e01b821680920361010c5760209163412b922360e11b8114908115610d4c575b5015158152f35b63043140ed60e01b811491508115610d66575b5083610d45565b6301ffc9a760e01b14905083610d5f565b90602060031983011261010c576004356001600160401b039283821161010c578060238301121561010c57816004013593841161010c5760248460051b8301011161010c576024019190565b35906001600160a01b038216820361010c57565b9181601f8401121561010c578235916001600160401b03831161010c576020838186019501011161010c57565b90608060031983011261010c5760043560ff8116810361010c57916024356001600160a01b038116810361010c579160443591606435906001600160401b03821161010c57610e5591600401610dd7565b9091565b919082519283825260005b848110610e85575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610e64565b9060031960608184011261010c5760043560ff8116810361010c5792602435916001600160401b03831161010c57826101209203011261010c576004019060443590565b60405190604082018281106001600160401b03821117610efc57604052565b634e487b7160e01b600052604160045260246000fd5b60405190606082018281106001600160401b03821117610efc57604052565b60405190608082018281106001600160401b03821117610efc57604052565b6040519190601f01601f191682016001600160401b03811183821017610efc57604052565b90815180825260208080930193019160005b828110610f95575050505090565b83516001600160e01b03191685529381019392810192600101610f87565b80516005811015610fd9576040918291845260ff60208201511660208501520151910152565b634e487b7160e01b600052602160045260246000fd5b90815180825260208080930193019160005b82811061100f575050505090565b9091929382608060019261103783895163ffffffff60e01b8151168452015184830190610fb3565b01950193929101611001565b602090602060408183019282815285518094520193019160005b82811061106b575050505090565b83516001600160a01b03168552938101939281019260010161105d565b91908110156110985760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361010c5790565b909160406020928260208201602083525201929160005b8281106110e7575050505090565b909192938280600192838060a01b036110ff89610dc3565b168152019501939291016110d9565b6001600160401b038111610efc5760051b60200190565b81601f8201121561010c578035906001600160401b038211610efc57611154601f8301601f1916602001610f50565b928284526020838301011161010c57816000926020809301838601378301015290565b602090818184031261010c5780356001600160401b039182821161010c57019083601f8301121561010c5781356111b56111b08261110e565b610f50565b94848087848152019260051b8501019381851161010c57858101925b8584106111e2575050505050505090565b833585811161010c5782019060609081601f19848703011261010c57611206610f12565b6112118a8501610dc3565b8152604092838501358b8301528401359288841161010c5761123a878c80979681970101611125565b908201528152019301926111d1565b8051156110985760200190565b8051600110156110985760400190565b8051600210156110985760600190565b80518210156110985760209160051b010190565b9160608383031261010c5782356001600160a01b038116810361010c579260208101359260408201356001600160401b03811161010c576112cb9201611125565b90565b90919060019060ff1681810361130c5750508060041161010c578160046112fb9261130a9401910161128a565b916001600160a01b03166116c6565b565b90929060031461132857604051634851657960e11b8152600490fd5b8160041161010c57600461133f9282019101611177565b80519060005b8281106113525750505050565b83906113906001600160a01b036113698386611276565b51511660206113788487611276565b51015160406113878588611276565b510151916116c6565b01611345565b6040516384b9b37960e01b81526000356001600160e01b031916600482015260ff9091166024820152604490fd5b60405190608082018281106001600160401b03821117610efc57604052606080838181528160208201528160408201520152565b903590601e198136030182121561010c57018035906001600160401b03821161010c5760200191813603831361010c57565b60ff168061146157508060606114419201906113f8565b8060041161010c578160046112fb9261145c9401910161128a565b600090565b60021461147a57604051634851657960e11b8152600490fd5b8060606114889201906113f8565b908160041161010c5760046114a09282019101611177565b80519060005b8281106114b557505050600090565b6001906114cd6001600160a01b036113698386611276565b016114a6565b9092916114e26111b08561110e565b93808552602092602086019160051b810192831161010c57905b8282106115095750505050565b83809161151584610dc3565b8152019101906114fc565b6040519061018082018281106001600160401b03821117610efc5760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b611594610f12565b90600282528160005b604090818110156115df576020916115b3610edd565b9060008252839060006115c4610f12565b9181835281848401528201528183015282850101520161159d565b505050565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820181905261ffff19909216606082018181526080808420805493969594909392871580156116be575b6116b4576001908660015b15611687575b508691815283832080549061fffe1990818316918c83146116635750509261163a565b95509798999a50509480945061fffc92506002915016931691161717905555600190565b600181161590816116aa575b501561169f5738611640565b509496505050505050565b9050151538611693565b5093955050505050565b50831561162f565b906116d192916117f6565b60408051338152637c9c64bb60e11b60208201526000918101919091526080906bffffffffffffffffffffffff198360601b1660608201522054156117135750565b6040516375f4229560e11b81523360048201526001600160a01b03919091166024820152604490fd5b80519060005b82811061174e57505050565b6117746bffffffffffffffffffffffff196117698385611276565b5160601b16336118b1565b1561178157600101611742565b610d07916001600160a01b039161179791611276565b51604051635b01bbf160e01b815233600482015291166001600160a01b031660248201529081906044820190565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526112cb92910190610e59565b9181156118365780516118175750506001600160a01b038116156117135790565b604051630c4f82d960e41b8152918291610d07918533600486016117c5565b91803b1561189357505061184981611a66565b906001600160a01b039081831615611882575b81831615611870575b508116156117135790565b61187b919250611b7c565b9038611865565b915061188d82611b07565b9161185c565b610d07836040519384936347662f4160e01b855233600486016117c5565b9061ffff191690811561193957604080516001600160a01b039092168252637c9c64bb60e11b60208301526000908201526060810182815260808220805490929061193057600160809252209182549283158015611926575b1561191a57600193505555600190565b90600217905555600190565b506001841661190a565b50505050600090565b5050600090565b906040519160018060a01b03168252637c9c64bb60e11b602083015260008060408401526000906060840160019460018252608090608081205492604051948860808701995b6119a3575b5050505050506001820160051b016080016040528252565b90919293949681881615806119f9575b156119f35761fffe198816908201600581901b8801870182905297600216156119ea5783528085852054915b959493929195611986565b508082916119df565b9661198b565b508715156119b3565b805160005b818110611a1357505090565b80611a2060019285611276565b5160601c611a2e8286611276565b5201611a07565b906020825192015163ffffffff60e01b908181169360048110611a5757505050565b60040360031b82901b16169150565b6001600160e01b0319611a7882611a35565b1663a9059cbb60e01b81148015611af7575b8015611ae7575b8015611ad7575b15611ab457506044815110611aae576024015190565b50600090565b6323b872dd60e01b14611ac75750600090565b6064815110611aae576044015190565b5063a457c2d760e01b8114611a98565b50633950935160e01b8114611a91565b5063095ea7b360e01b8114611a8a565b6001600160e01b0319611b1982611a35565b1663a22cb46560e01b8103611b3957506044815110611aae576024015190565b637921219560e11b8103611b58575060c4815110611aae576044015190565b631759616b60e11b14611b6b5750600090565b610104815110611aae576044015190565b6001600160e01b0319611b8e82611a35565b1663a22cb46560e01b81148015611c10575b15611bb657506044815110611aae576024015190565b632142170760e11b81148015611c00575b15611bdd57506064815110611aae576044015190565b635c46a7ef60e11b14611bf05750600090565b60a4815110611aae576044015190565b506323b872dd60e01b8114611bc7565b5063095ea7b360e01b8114611ba056fea2646970667358221220a7e886c84c80dd49991af127505092f93de2f237ec1d45cf5a2601a08664e1ca64736f6c63430008180033","sourceMap":"3685:15744:18:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004908136101561001557600080fd5b60003560e01c90816301ffc9a714610d0b575080630ae779e114610c425780630c7ecd8414610c255780631128186d14610be8578063118a53891461095f57806315b76b841461093d57806346d60eb2146106c957806347b19eee146108e75780636d61fe70146108425780638a91b0e31461073a578063a3f4df7e146106e0578063bfd151c1146106c9578063c4db8dd9146106b4578063c7763130146101115763cf01c349146100c657600080fd5b3461010c57602036600319011261010c57356001600160a01b038116810361010c576100fc6100f761010892611940565b611a02565b60405191829182611043565b0390f35b600080fd5b3461010c57600036600319011261010c5761012a611520565b50610133611520565b61013b610f31565b60038152606036602083013780604083015261015e6323d8cf7760e11b91611249565b52630ae779e160e01b6101746040830151611256565b5263cf01c34960e01b61018a6040830151611266565b5261019361158c565b6101208201526102bd6101a4610f12565b6001815260006020820152600060408201526101e86101c1610edd565b635b0e93fb60e11b928382526020820152610120850151906101e282611249565b52611249565b506102826101f4610f12565b91600183526002602084015260006040840152610239610212610edd565b631a7e6adf60e11b9485825260208201526101208701519061023382611256565b52611256565b5061024261158c565b610140860152610250610f12565b60018152600160208201526000604082015261026a610edd565b9182526020820152610140850151906101e282611249565b5061028b610f12565b6001815260036020820152600060408201526102a5610edd565b91825260208201526101408301519061023382611256565b506102ec6102c9610f12565b6002815260403660208301376020830181905263043140ed60e01b918291611249565b526102fa6020830151611256565b52610378610306610f12565b60028152600060208201526001604082015261032061158c565b60e0840152610350610330610edd565b6323d8cf7760e11b81526020810183905260e0850151906101e282611249565b50610359610edd565b90630ae779e160e01b8252602082015260e08301519061023382611256565b50610381610f12565b9060028252600060208301526000604083015261039c610f12565b6003815260006020820152600060408201526103b6610f31565b926003845260005b6060811061067c575061042b90839461010061045a9501526104026103e1610edd565b6323d8cf7760e11b815260208101839052610100870151906101e282611249565b5061040b610edd565b90630ae779e160e01b825260208201526101008501519061023382611256565b50610434610edd565b9063cf01c34960e01b825260208201526101008301519061045482611266565b52611266565b50610463610edd565b600181526020368183013780825263412b922360e11b9061048390611249565b526040518091602082526104f06104da6104c46104ae845161018060208801526101a0870190610f75565b6020850151868203601f19016040880152610f75565b6040840151858203601f19016060870152610f75565b6060830151848203601f19016080860152610f75565b6080820151151560a084015260a0820151151560c084015260c082015190601f198482030160e0850152815180825260208201916020808360051b8301019401926000915b838310610625578780886105906105786105608b60e0850151601f1987830301610100880152610fef565b610100840151858203601f1901610120870152610fef565b610120830151848203601f1901610140860152610fef565b6105ae6101408301519161016092601f198683030184870152610fef565b91015190601f19838203016101808401526020808351928381520192019060005b8181106105dd575050500390f35b91935091602060e06001926106176040885163ffffffff851b815116845261060b8682015187860190610fb3565b01516080830190610fb3565b0194019101918493926105cf565b91939596509193602080610669600193601f19868203018752606060408b51878060a01b038151168452858101511515868501520151918160408201520190610f75565b9701930193019092879695949293610535565b602090610687610edd565b60008152610693610f12565b600081526000848201526000604082015283820152828288010152016103be565b3461010c576106c236610e99565b5050611396565b3461010c576106d736610e04565b50505050611396565b3461010c57600036600319011261010c576101086106fc610edd565b602081527f436f6c642053746f72616765204164647265737320426f6f6b20506c7567696e6020820152604051918291602083526020830190610e59565b503461010c57602036600319011261010c578035906001600160401b03821161010c5761076991369101610dd7565b50506107776100f733611940565b6113888151106000146108195760408051338152637c9c64bb60e11b6020820152600091810191909152600160608201815b156107c9575b600091815260808320600061fffe198254169155916107a9565b600182161580610810575b6107af575050507f8342bc442963161fe55b209fbfc4dafccac754f61a43438af2615c68dac75ed36040518061080b339482611043565b0390a2005b508115156107d4565b50337fe7286f689afa21e4be11e804963cab3150095657dda0d218dc22bf2eb0c682ca600080a2005b503461010c57602036600319011261010c5780356001600160401b039182821161010c5761087291369101610dd7565b8092919261087c57005b82019160208184031261010c57803591821161010c57019080601f8301121561010c578160206108ae933591016114d3565b6108b78161173c565b7f2762cf05265ec47ebbfe12ce03afa1f82fa948b789548da6e83f3a083ffb10e46040518061080b339482611043565b3461010c5761080b7f2762cf05265ec47ebbfe12ce03afa1f82fa948b789548da6e83f3a083ffb10e461091936610d77565b61092f61092a9492943683876114d3565b61173c565b6040519182913395836110c2565b3461010c57602061095761095036610e99565b509061142a565b604051908152f35b3461010c57600036600319011261010c576109786113c4565b506109816113c4565b610989610edd565b906020918281527f436f6c642053746f72616765204164647265737320426f6f6b20506c7567696e8382015281526109bf610edd565b60058152640312e302e360dc1b838201528282019081526109de610edd565b90601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000008483015260408301918252610a17610f31565b906003825260005b606080821015610a4957908691610a34610edd565b90600082528382015282828601015201610a1f565b5050909391610b6d9060608501958652610add610a64610edd565b60108152610aa86f41646472657373426f6f6b577269746560801b918288820152610a8d610edd565b906323d8cf7760e11b8252888201528951906101e282611249565b50610ab1610edd565b906010825286820152610ac2610edd565b90630ae779e160e01b82528682015287519061023382611256565b50610b27610ae9610edd565b600f81526e1059191c995cdcd09bdbdad4995859608a1b86820152610b0c610edd565b9063cf01c34960e01b82528682015287519061045482611266565b50610b5c610b46604051968688525160808789015260a0880190610e59565b935193601f199485888303016040890152610e59565b905183868303016060870152610e59565b9351918184860301608085015282519081865280860181808460051b8901019501936000975b848910610ba05787870388f35b9091929394958480610bd6838686600196030188526040838c5163ffffffff60e01b815116845201519181858201520190610e59565b98019401980197919094939294610b93565b503461010c57604036600319011261010c5780359060ff8216820361010c57602435906001600160401b03821161010c576106c291369101610dd7565b3461010c57610c40610c3636610e04565b93915091506112ce565b005b503461010c57610c5136610d77565b909160005b828110610c905760405133907f8342bc442963161fe55b209fbfc4dafccac754f61a43438af2615c68dac75ed3908061080b8789836110c2565b610cbe6bffffffffffffffffffffffff19610cb4610caf848789611088565b6110ae565b60601b16336115e4565b15610ccb57600101610c56565b610cd992610caf9294611088565b6040805163e3bee48360e01b8152339381019384526001600160a01b03909216602084015290918291010390fd5b0390fd5b823461010c57602036600319011261010c57359063ffffffff60e01b821680920361010c5760209163412b922360e11b8114908115610d4c575b5015158152f35b63043140ed60e01b811491508115610d66575b5083610d45565b6301ffc9a760e01b14905083610d5f565b90602060031983011261010c576004356001600160401b039283821161010c578060238301121561010c57816004013593841161010c5760248460051b8301011161010c576024019190565b35906001600160a01b038216820361010c57565b9181601f8401121561010c578235916001600160401b03831161010c576020838186019501011161010c57565b90608060031983011261010c5760043560ff8116810361010c57916024356001600160a01b038116810361010c579160443591606435906001600160401b03821161010c57610e5591600401610dd7565b9091565b919082519283825260005b848110610e85575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610e64565b9060031960608184011261010c5760043560ff8116810361010c5792602435916001600160401b03831161010c57826101209203011261010c576004019060443590565b60405190604082018281106001600160401b03821117610efc57604052565b634e487b7160e01b600052604160045260246000fd5b60405190606082018281106001600160401b03821117610efc57604052565b60405190608082018281106001600160401b03821117610efc57604052565b6040519190601f01601f191682016001600160401b03811183821017610efc57604052565b90815180825260208080930193019160005b828110610f95575050505090565b83516001600160e01b03191685529381019392810192600101610f87565b80516005811015610fd9576040918291845260ff60208201511660208501520151910152565b634e487b7160e01b600052602160045260246000fd5b90815180825260208080930193019160005b82811061100f575050505090565b9091929382608060019261103783895163ffffffff60e01b8151168452015184830190610fb3565b01950193929101611001565b602090602060408183019282815285518094520193019160005b82811061106b575050505090565b83516001600160a01b03168552938101939281019260010161105d565b91908110156110985760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b038116810361010c5790565b909160406020928260208201602083525201929160005b8281106110e7575050505090565b909192938280600192838060a01b036110ff89610dc3565b168152019501939291016110d9565b6001600160401b038111610efc5760051b60200190565b81601f8201121561010c578035906001600160401b038211610efc57611154601f8301601f1916602001610f50565b928284526020838301011161010c57816000926020809301838601378301015290565b602090818184031261010c5780356001600160401b039182821161010c57019083601f8301121561010c5781356111b56111b08261110e565b610f50565b94848087848152019260051b8501019381851161010c57858101925b8584106111e2575050505050505090565b833585811161010c5782019060609081601f19848703011261010c57611206610f12565b6112118a8501610dc3565b8152604092838501358b8301528401359288841161010c5761123a878c80979681970101611125565b908201528152019301926111d1565b8051156110985760200190565b8051600110156110985760400190565b8051600210156110985760600190565b80518210156110985760209160051b010190565b9160608383031261010c5782356001600160a01b038116810361010c579260208101359260408201356001600160401b03811161010c576112cb9201611125565b90565b90919060019060ff1681810361130c5750508060041161010c578160046112fb9261130a9401910161128a565b916001600160a01b03166116c6565b565b90929060031461132857604051634851657960e11b8152600490fd5b8160041161010c57600461133f9282019101611177565b80519060005b8281106113525750505050565b83906113906001600160a01b036113698386611276565b51511660206113788487611276565b51015160406113878588611276565b510151916116c6565b01611345565b6040516384b9b37960e01b81526000356001600160e01b031916600482015260ff9091166024820152604490fd5b60405190608082018281106001600160401b03821117610efc57604052606080838181528160208201528160408201520152565b903590601e198136030182121561010c57018035906001600160401b03821161010c5760200191813603831361010c57565b60ff168061146157508060606114419201906113f8565b8060041161010c578160046112fb9261145c9401910161128a565b600090565b60021461147a57604051634851657960e11b8152600490fd5b8060606114889201906113f8565b908160041161010c5760046114a09282019101611177565b80519060005b8281106114b557505050600090565b6001906114cd6001600160a01b036113698386611276565b016114a6565b9092916114e26111b08561110e565b93808552602092602086019160051b810192831161010c57905b8282106115095750505050565b83809161151584610dc3565b8152019101906114fc565b6040519061018082018281106001600160401b03821117610efc5760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b611594610f12565b90600282528160005b604090818110156115df576020916115b3610edd565b9060008252839060006115c4610f12565b9181835281848401528201528183015282850101520161159d565b505050565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820181905261ffff19909216606082018181526080808420805493969594909392871580156116be575b6116b4576001908660015b15611687575b508691815283832080549061fffe1990818316918c83146116635750509261163a565b95509798999a50509480945061fffc92506002915016931691161717905555600190565b600181161590816116aa575b501561169f5738611640565b509496505050505050565b9050151538611693565b5093955050505050565b50831561162f565b906116d192916117f6565b60408051338152637c9c64bb60e11b60208201526000918101919091526080906bffffffffffffffffffffffff198360601b1660608201522054156117135750565b6040516375f4229560e11b81523360048201526001600160a01b03919091166024820152604490fd5b80519060005b82811061174e57505050565b6117746bffffffffffffffffffffffff196117698385611276565b5160601b16336118b1565b1561178157600101611742565b610d07916001600160a01b039161179791611276565b51604051635b01bbf160e01b815233600482015291166001600160a01b031660248201529081906044820190565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526112cb92910190610e59565b9181156118365780516118175750506001600160a01b038116156117135790565b604051630c4f82d960e41b8152918291610d07918533600486016117c5565b91803b1561189357505061184981611a66565b906001600160a01b039081831615611882575b81831615611870575b508116156117135790565b61187b919250611b7c565b9038611865565b915061188d82611b07565b9161185c565b610d07836040519384936347662f4160e01b855233600486016117c5565b9061ffff191690811561193957604080516001600160a01b039092168252637c9c64bb60e11b60208301526000908201526060810182815260808220805490929061193057600160809252209182549283158015611926575b1561191a57600193505555600190565b90600217905555600190565b506001841661190a565b50505050600090565b5050600090565b906040519160018060a01b03168252637c9c64bb60e11b602083015260008060408401526000906060840160019460018252608090608081205492604051948860808701995b6119a3575b5050505050506001820160051b016080016040528252565b90919293949681881615806119f9575b156119f35761fffe198816908201600581901b8801870182905297600216156119ea5783528085852054915b959493929195611986565b508082916119df565b9661198b565b508715156119b3565b805160005b818110611a1357505090565b80611a2060019285611276565b5160601c611a2e8286611276565b5201611a07565b906020825192015163ffffffff60e01b908181169360048110611a5757505050565b60040360031b82901b16169150565b6001600160e01b0319611a7882611a35565b1663a9059cbb60e01b81148015611af7575b8015611ae7575b8015611ad7575b15611ab457506044815110611aae576024015190565b50600090565b6323b872dd60e01b14611ac75750600090565b6064815110611aae576044015190565b5063a457c2d760e01b8114611a98565b50633950935160e01b8114611a91565b5063095ea7b360e01b8114611a8a565b6001600160e01b0319611b1982611a35565b1663a22cb46560e01b8103611b3957506044815110611aae576024015190565b637921219560e11b8103611b58575060c4815110611aae576044015190565b631759616b60e11b14611b6b5750600090565b610104815110611aae576044015190565b6001600160e01b0319611b8e82611a35565b1663a22cb46560e01b81148015611c10575b15611bb657506044815110611aae576024015190565b632142170760e11b81148015611c00575b15611bdd57506064815110611aae576044015190565b635c46a7ef60e11b14611bf05750600090565b60a4815110611aae576044015190565b506323b872dd60e01b8114611bc7565b5063095ea7b360e01b8114611ba056fea2646970667358221220a7e886c84c80dd49991af127505092f93de2f237ec1d45cf5a2601a08664e1ca64736f6c63430008180033","sourceMap":"3685:15744:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;17883:58;17906:34;3685:15744;17906:34;;:::i;:::-;17883:58;:::i;:::-;3685:15744;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;:::i;:::-;;;;:::i;:::-;1615:27:8;;:::i;:::-;11433:1:18;1615:27:8;;3685:15744:18;;;;;;11390:27;3685:15744;11390:27;;:45;11445:67;1615:27:8;;;11445:67:18;;:::i;:::-;4055:18;1615:27:8;;;11522:70:18;3685:15744;11390:27;;11522;:70;:::i;:::-;4055:18;1615:27:8;;;11602:67:18;3685:15744;11390:27;;11602;:67;:::i;:::-;4055:18;11716:35;;:::i;:::-;11680:33;;;:71;13113:421;3685:15744;;:::i;:::-;11550:1;3685:15744;;;;11928:231;;3685:15744;;;11928:231;;4055:18;11761:409;1615:27:8;;:::i;:::-;11860:34:18;;;4055:18;;;;3685:15744;11800:370;;4055:18;11680:33;;;11761;:409;;;;:::i;:::-;;;:::i;:::-;;12693:410;3685:15744;;:::i;:::-;;11550:1;3685:15744;;11630:1;3685:15744;12352:237;;3685:15744;;;12352:237;;4055:18;12180:420;1615:27:8;;:::i;:::-;12279:39:18;;;4055:18;;;;3685:15744;12219:381;;4055:18;11680:33;;;12180;:420;;;;:::i;:::-;;;:::i;:::-;;12648:35;;:::i;:::-;12611:34;;;:72;3685:15744;;:::i;:::-;11550:1;3685:15744;;11550:1;3685:15744;12861:231;;3685:15744;;;12861:231;;4055:18;1615:27:8;;:::i;:::-;4055:18:18;;;3685:15744;12733:370;;4055:18;12611:34;;;12693;:410;;;;:::i;:::-;;3685:15744;;:::i;:::-;11550:1;3685:15744;;11433:1;3685:15744;13286:237;;3685:15744;;;13286:237;;4055:18;1615:27:8;;:::i;:::-;4055:18:18;;;3685:15744;13153:381;;4055:18;12611:34;;;13113;:421;;;;:::i;:::-;;13678:103;1615:27:8;;:::i;:::-;11630:1:18;1615:27:8;;3685:15744:18;;;;;;;13545:31;;:49;;;-1:-1:-1;;;8603:25:17;;;13678:103:18;:::i;:::-;4055:18;13791:103;3685:15744;13545:31;;13791;:103;:::i;:::-;4055:18;14492:211;3685:15744;;:::i;:::-;11630:1;3685:15744;;;;13960:222;;3685:15744;11550:1;3685:15744;13960:222;;4055:18;14229:35;;:::i;:::-;3685:15744;14192:34;;:72;14274:208;1615:27:8;;:::i;:::-;-1:-1:-1;;;4055:18:18;;3685:15744;14314:168;;4055:18;;;3685:15744;14192:34;;14274;;:208;:34;:208;:::i;:::-;;1615:27:8;;:::i;:::-;;;;;4055:18:18;;3685:15744;14532:171;;4055:18;3685:15744;14192:34;;14492;:211;;;;:::i;:::-;;3685:15744;;:::i;:::-;;11630:1;3685:15744;;;;14771:222;;3685:15744;;;14771:222;;4055:18;3685:15744;;:::i;:::-;11433:1;3685:15744;;;;15066:177;;3685:15744;;;15066:177;;4055:18;1615:27:8;;:::i;:::-;;11433:1:18;1615:27:8;;3685:15744:18;;;;;;;15253:35;15556:213;15253:35;;;;15779:216;15253:35;;:73;15336:210;1615:27:8;;:::i;:::-;-1:-1:-1;;;4055:18:18;;3685:15744;15377:169;;4055:18;;;15253:35;;;15336;;:210;:35;:210;:::i;:::-;;1615:27:8;;:::i;:::-;;;;;4055:18:18;;3685:15744;15597:172;;4055:18;15253:35;;;15556;:213;;;;:::i;:::-;;1615:27:8;;:::i;:::-;;;;;4055:18:18;;3685:15744;15820:175;;4055:18;15253:35;;;15779;:216;;;;:::i;:::-;;;:::i;:::-;;1615:27:8;;:::i;:::-;11550:1:18;1615:27:8;;3685:15744:18;;;;;;16006:39;;;-1:-1:-1;;;17315:36:18;16055:63;;;:::i;:::-;4055:18;3685:15744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13545:31;;3685:15744;;;;-1:-1:-1;;3685:15744:18;;;;;;:::i;:::-;;11390:27;;3685:15744;;;;-1:-1:-1;;3685:15744:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1615:27:8;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14192:34;;;3685:15744;;;14192:34;3685:15744;14192:34;;3685:15744;1615:27:8;;3685:15744:18;;;;15253:35;3685:15744;;;;:::i;:::-;15253:35;;;3685:15744;;;;-1:-1:-1;;3685:15744:18;11680:33;3685:15744;;;;:::i;:::-;11680:33;;;3685:15744;;;;-1:-1:-1;;3685:15744:18;12611:34;3685:15744;;;;:::i;:::-;;12611:34;;;3685:15744;;;1615:27:8;;;3685:15744:18;;;;;;;;;:::i;:::-;;;;1615:27:8;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11550:1;3685:15744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;1615:27:8;;;;;;;3685:15744:18;1615:27:8;3685:15744:18;11550:1;1615:27:8;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1615:27:8;;;:::i;:::-;3685:15744:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;-1:-1:-1;;3685:15744:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;:::i;:::-;6545:10;;17883:58;17906:34;6545:10;17906:34;:::i;17883:58::-;4360:4;3685:15744;;6750:45;6746:252;4360:4;;;22073:698:1;;;6545:10:18;22073:698:1;;-1:-1:-1;;;22073:698:1;;;;-1:-1:-1;22073:698:1;;;;;;;263:1:2;19671:164:1;;;263:1:2;7675:267:1;;;;;3685:15744:18;19671:164:1;;;;;;3685:15744:18;18982:66:1;;22967:50;;18976:72;23180:49;;7675:267;;;;263:1:2;18712:53:1;;7897:19;:43;;;7675:267;;7897:43;;;;6866:47:18;3685:15744;;6545:10;6866:47;6545:10;6866:47;;;:::i;:::-;;;;3685:15744;7897:43:1;7920:20;;;;7897:43;;6746:252:18;6545:10;;6949:38;3685:15744;6949:38;;3685:15744;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;:::i;:::-;6158:16;;;;6154:210;;3685:15744;6154:210;6220:29;;3685:15744;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6278:10;;;:::i;:::-;6308:45;3685:15744;;6330:10;6308:45;6330:10;6308:45;;;:::i;3685:15744::-;;;;5041:45;;3685:15744;;;:::i;:::-;5000:26;3685:15744;;;;;;;;:::i;:::-;5000:26;:::i;:::-;3685:15744;;5063:10;;;;5041:45;;;:::i;3685:15744::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;16326:20;;3685:15744;;:::i;:::-;;;;-1:-1:-1;;;3685:15744:18;;;;16356:16;;;:35;;;3685:15744;;:::i;:::-;;1679:7:8;3685:15744:18;;1679:7:8;;;;;3685:15744:18;16401:15;;:31;;;1615:27:8;;:::i;:::-;;16536:1:18;1615:27:8;;3685:15744:18;1615:27:8;;;;;;;;;;;;;:::i;:::-;;3685:15744:18;1615:27:8;;;;;;;;;;;;;;;;;;;;;3685:15744:18;1615:27:8;;16478:30:18;;:60;;;16745:190;3685:15744;;:::i;:::-;1615:27:8;3685:15744:18;;16548:187;-1:-1:-1;;;1615:27:8;;;;;;;;:::i;:::-;;;;;4055:18:18;;16584:151;;;4055:18;16548:30;;:187;;;;:::i;:::-;;3685:15744;;:::i;:::-;;1615:27:8;3685:15744:18;;1615:27:8;;;;;;:::i;:::-;;;;;4055:18:18;;16781:154;;;4055:18;16745:30;;:190;;;;:::i;:::-;;16945:186;3685:15744;;:::i;:::-;4055:18;3685:15744;;-1:-1:-1;;;4055:18:18;;;;1615:27:8;;:::i;:::-;;;;;4055:18:18;;16981:150;;;4055:18;16945:30;;:186;;;;:::i;:::-;;3685:15744;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1615:27:8;;;3685:15744:18;;;;;;;;;;;:::i;:::-;;;;;;;;1615:27:8;3685:15744:18;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16776:1;3685:15744;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;5338:13;;3685:15744;5353:10;;;;;;3685:15744;;5418:10;;5578:47;;3685:15744;5578:47;3685:15744;;;5578:47;:::i;5365:3::-;5389:75;-1:-1:-1;;5449:13:18;;;;;;:::i;:::-;;:::i;:::-;3685:15744;;;5418:10;5389:75;:::i;:::-;5388:76;5384:170;;3685:15744;;5338:13;;5384:170;5525:13;;;;;;:::i;:::-;3685:15744;;;-1:-1:-1;;;5491:48:18;;5418:10;5491:48;;;3685:15744;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;5491:48;;;;;;;3685:15744;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17300:51:18;;;:91;;;;3685:15744;;;;;;;17300:91;-1:-1:-1;;;8588:40:17;;;-1:-1:-1;8588:80:17;;;;17300:91:18;;;;;8588:80:17;-1:-1:-1;;;861:40:6;;-1:-1:-1;8588:80:17;;;3685:15744:18;;;-1:-1:-1;;3685:15744:18;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;3685:15744:18;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;3685:15744:18;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1615:27:8;;3685:15744:18;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3685:15744:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;3685:15744:18;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;3685:15744:18;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;3685:15744:18;;;;;-1:-1:-1;3685:15744:18;;;;;;;;;;;;;;;;-1:-1:-1;3685:15744:18;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;1615:27:8;3685:15744:18;;-1:-1:-1;;3685:15744:18;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;3685:15744:18;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;1615:27:8;;;;3685:15744:18;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;16776:1;3685:15744;;;;;;;:::o;:::-;;;16976:1;3685:15744;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;:::i;:::-;;:::o;9146:1521::-;;;;9345:59;;3685:15744;;9325:80;;;9345:59;;3685:15744;;;;;;;9786:47;3685:15744;9786:47;;9900:10;9786:47;;3685:15744;;9786:47;:::i;:::-;3685:15744;-1:-1:-1;;;;;3685:15744:18;9900:10;:::i;:::-;9925:7::o;9321:1310::-;9952:86;;;9972:65;9952:86;9948:683;;3685:15744;;-1:-1:-1;;;10647:13:18;;3685:15744;;10647:13;9948:683;3685:15744;;;;;;10365:30;;;;3685:15744;;10365:30;:::i;:::-;3685:15744;;10457:13;-1:-1:-1;10472:10:18;;;;;;10614:7;;;;:::o;10484:3::-;3685:15744;;10572:13;-1:-1:-1;;;;;10539:8:18;3685:15744;10539:8;;:::i;:::-;;3685:15744;;10556:14;:8;;;;:::i;:::-;;:14;3685:15744;10572:13;:8;;;;:::i;:::-;;:13;;;;:::i;:::-;3685:15744;10457:13;;6928:192:17;3685:15744:18;;-1:-1:-1;;;7078:35:17;;7093:7;;-1:-1:-1;;;;;;7093:7:17;7078:35;;;3685:15744:18;;;;;;;;;;;7078:35:17;3685:15744:18;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;:::o;7393:1716::-;3685:15744;;7629:80;;;8167:15;;;;;;;;:::i;:::-;3685:15744;;;;;8156:58;3685:15744;8156:58;;8281:10;8156:58;;3685:15744;;8156:58;:::i;8281:10::-;7649:59;8306:31;:::o;7625:1448::-;8378:65;8358:86;8354:719;;3685:15744;;-1:-1:-1;;;9089:13:18;;3685:15744;;9089:13;8354:719;8782:15;;;;;;;:::i;:::-;3685:15744;;;;;;;8771:41;;;;3685:15744;;8771:41;:::i;:::-;3685:15744;;8874:13;7649:59;8889:10;;;;;;9031:31;;;7649:59;9031:31;:::o;8901:3::-;3685:15744;;8989:13;-1:-1:-1;;;;;8956:8:18;3685:15744;8956:8;;:::i;8989:13::-;3685:15744;8874:13;;3685:15744;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3685:15744:18;;;;-1:-1:-1;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;1615:27:8;;:::i;:::-;;11630:1:18;1615:27:8;;3685:15744:18;-1:-1:-1;3685:15744:18;;;;;;;;;;1615:27:8;;;:::i;:::-;3685:15744:18;-1:-1:-1;3685:15744:18;;;;-1:-1:-1;3685:15744:18;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3779:1736:1:-;22073:698;;;-1:-1:-1;;;;;22073:698:1;;;;;-1:-1:-1;;;22073:698:1;;;;-1:-1:-1;22073:698:1;;;;;;-1:-1:-1;;3685:15744:18;;;19671:164:1;;;;;;;;;;22967:50;;3685:15744:18;;3779:1736:1;-1:-1:-1;19671:164:1;;22967:50;4189:26;;:53;;;;3779:1736;4185:132;;263:1:2;4369:18:1;;263:1:2;4397:1090:1;;;;;5434:51;;19671:164;;;;;;22967:50;;18982:66;;;18976:72;;;;4625:26;;;;4621:761;;5395:20;;4397:1090;;;4621:761;5263:25;;;;;;;;;;;;19380:6;5263:25;;490:1:2;5263:25:1;;;19358:30;;18976:72;;5211:48;:78;23180:49;;;263:1:2;5356:11:1;:::o;4397:1090::-;263:1:2;18712:53:1;;5434:23;:51;;;;4397:1090;5434:51;;;;4397:1090;;;5434:51;-1:-1:-1;5434:51:1;;-1:-1:-1;;;;;;3779:1736:1:o;5434:51::-;5461:24;;;;5434:51;;;4185:132;-1:-1:-1;4294:12:1;;-1:-1:-1;;;;;4294:12:1:o;4189:53::-;4219:23;;;4189:53;;7010:346:18;;7145:42;7010:346;;7145:42;:::i;:::-;22073:698:1;;;7230:10:18;22073:698:1;;-1:-1:-1;;;22073:698:1;;;;-1:-1:-1;22073:698:1;;;;;;;19671:164;;3685:15744:18;;;;;;;19671:164:1;;;;22967:50;12518:25;7197:153:18;;7010:346;:::o;7197:153::-;3685:15744;;-1:-1:-1;;;7295:44:18;;7230:10;7295:44;;;3685:15744;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;5491:48;17404:367;3685:15744;;17535:13;17547:1;17550:10;;;;;;17404:367;;;:::o;17562:3::-;17586:77;-1:-1:-1;;17643:18:18;;;;:::i;:::-;3685:15744;;;;17612:10;17586:77;:::i;:::-;17585:78;17581:174;;3685:15744;;17535:13;;17581:174;17690:50;;-1:-1:-1;;;;;3685:15744:18;17721:18;;;:::i;:::-;3685:15744;;;-1:-1:-1;;;17690:50:18;;17612:10;17690:50;;;3685:15744;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;-1:-1:-1;;;;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18068:1359::-;;18195:10;;;;3685:15744;;18300:113;;-1:-1:-1;;;;;;;3685:15744:18;;18430:20;18426:178;;18617:13;:::o;18300:113::-;3685:15744;;-1:-1:-1;;;18347:51:18;;3685:15744;;;18347:51;;3685:15744;18366:10;18347:51;;;;:::i;18191:1230::-;18746:18;;;:23;18742:125;;18990:29;;;;;:::i;:::-;3685:15744;-1:-1:-1;;;;;3685:15744:18;;;;19037:23;19033:105;;18191:1230;3685:15744;;;19155:23;19151:104;;18191:1230;3685:15744;;;19272:23;19268:113;;19394:16;:::o;19151:104::-;19210:30;;;;;:::i;:::-;19151:104;;;;19033:105;19092:31;;;;;:::i;:::-;19033:105;;;18742:125;18796:56;3685:15744;;;18796:56;;;;;;;;18820:10;18796:56;;;;:::i;2079:1325:1:-;;3685:15744:18;;;2270:26:1;;;2266:110;;22073:698;;;-1:-1:-1;;;;;22073:698:1;;;;;-1:-1:-1;;;22073:698:1;;;;-1:-1:-1;22073:698:1;;;;19671:164;;;;;;;;;22967:50;;19671:164;;22073:698;2536:109;;263:1:2;19671:164:1;;;;22967:50;;;2816:18;;;:38;;;;2079:1325;2812:564;;;263:1:2;23180:49:1;;;;263:1:2;2079:1325:1;:::o;2812:564::-;3299:28;490:1:2;3299:28:1;23180:49;;;263:1:2;2079:1325:1;:::o;2816:38::-;18712:53;263:1:2;18712:53:1;;2816:38;;2536:109;2622:12;;;;17547:1:18;2622:12:1;:::o;2266:110::-;2353:12;;17547:1:18;2353:12:1;:::o;15638:2947::-;;22073:698;;3685:15744:18;;;;;;22073:698:1;;;;;;;;;;3685:15744:18;;22073:698:1;;;;3685:15744:18;19671:164:1;;;;263:1:2;19671:164:1;263:1:2;19671:164:1;;;;;;;22967:50;16803:822;22073:698;16803:822;;;19671:164;16803:822;;17635:651;263:1:2;;;17635:651:1;-1:-1:-1;;;;;;263:1:2;18339:240:1;;18022:83;18339:240;;19671:164;18339:240;22073:698;18339:240;;;15638:2947::o;17635:651::-;18712:53;;;;;;;;;17642:19;:43;;;17635:651;17642:43;;;-1:-1:-1;;18976:72:1;;3685:15744:18;;;18022:83:1;;;;;;;;;;;3685:15744:18;490:1:2;18855:21:1;:26;490:1:2;;19671:164:1;;;;;;22967:50;18118:158;;17635:651;;;;;;;;18118:158;18242:19;;;18118:158;;;17642:43;;;;;17665:20;;;;17642:43;;1147:581:10;3685:15744:18;;-1:-1:-1;1493:10:10;;;;;;1705:16;;1147:581;:::o;1505:3::-;1524:21;;3685:15744:18;1524:21:10;;;:::i;:::-;3685:15744:18;1543:2:10;3685:15744:18;1524:21:10;;;;:::i;:::-;4055:18:18;3685:15744;1478:13:10;;3685:15744:18;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;3685:15744:18:o;2928:1116:11:-;-1:-1:-1;;;;;;3039:12:11;;;:::i;:::-;3685:15744:18;-1:-1:-1;;;3078:36:11;;:75;;;;2928:1116;3078:131;;;;2928:1116;3078:171;;;;2928:1116;3061:950;;;3685:15744:18;2526:2:11;3685:15744:18;;3340:41:11;3336:97;;2459:2;8700:157;;3520:63;:::o;3336:97::-;3401:17;3416:1;3401:17;:::o;3061:950::-;-1:-1:-1;;;3604:40:11;3600:411;;3061:950;4035:1;2928:1116;:::o;3600:411::-;2154:3;3685:15744:18;;3740:35:11;3736:91;;2526:2;8700:157;;3943:57;:::o;3078:171::-;-1:-1:-1;;;;3213:36:11;;3078:171;;:131;-1:-1:-1;;;;3173:36:11;;3078:131;;:75;-1:-1:-1;;;;3118:35:11;;3078:75;;4509:1780;-1:-1:-1;;;;;;4622:12:11;;;:::i;:::-;3685:15744:18;-1:-1:-1;;;4648:47:11;;4660:35;;3685:15744:18;2526:2:11;3685:15744:18;;4775:41:11;4771:97;;2459:2;8700:157;;4955:63;:::o;4644:1612::-;-1:-1:-1;;;5039:46:11;;5051:34;;3685:15744:18;2309:3:11;3685:15744:18;;5257:46:11;5253:102;;2526:2;8700:157;;5471:57;:::o;5035:1221::-;-1:-1:-1;;;5549:51:11;5545:711;;5035:1221;6280:1;4509:1780;:::o;5545:711::-;2385:3;3685:15744:18;;5968:52:11;5964:108;;2526:2;8700:157;;6188:57;:::o;6805:1634::-;-1:-1:-1;;;;;;6917:12:11;;;:::i;:::-;3685:15744:18;-1:-1:-1;;;6943:46:11;;:86;;;;6805:1634;6939:1467;;;3685:15744:18;2526:2:11;3685:15744:18;;7176:41:11;7172:97;;2459:2;8700:157;;7356:63;:::o;6939:1467::-;-1:-1:-1;;;7440:37:11;;:82;;;;6939:1467;7436:970;;;3685:15744:18;2154:3:11;3685:15744:18;;7620:35:11;7616:91;;2526:2;8700:157;;7823:57;:::o;7436:970::-;-1:-1:-1;;;7901:48:11;7897:509;;7436:970;8430:1;6805:1634;:::o;7897:509::-;2239:3;3685:15744:18;;8109:61:11;8105:117;;2526:2;8700:157;;8338:57;:::o;7440:82::-;-1:-1:-1;;;;7481:41:11;;7440:82;;6943:86;-1:-1:-1;;;;6993:36:11;;6943:86;","linkReferences":{}},"methodIdentifiers":{"NAME()":"a3f4df7e","addAllowedRecipients(address[])":"47b19eee","getAllowedRecipients(address)":"cf01c349","onInstall(bytes)":"6d61fe70","onUninstall(bytes)":"8a91b0e3","pluginManifest()":"c7763130","pluginMetadata()":"118a5389","postExecutionHook(uint8,bytes)":"1128186d","preExecutionHook(uint8,address,uint256,bytes)":"46d60eb2","preRuntimeValidationHook(uint8,address,uint256,bytes)":"0c7ecd84","preUserOpValidationHook(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":"15b76b84","removeAllowedRecipients(address[])":"0ae779e1","runtimeValidationFunction(uint8,address,uint256,bytes)":"bfd151c1","supportsInterface(bytes4)":"01ffc9a7","userOpValidationFunction(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":"c4db8dd9"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallDataIsNotEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"FailToAddRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"FailToRemoveRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"InvalidTargetCodeLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"}],\"name\":\"NotImplemented\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"UnauthorizedRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unsupported\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"AllowedAddressesAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AllowedAddressesNotRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"AllowedAddressesRemoved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"addAllowedRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getAllowedRecipients\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onInstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onUninstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pluginManifest\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes4[]\",\"name\":\"interfaceIds\",\"type\":\"bytes4[]\"},{\"internalType\":\"bytes4[]\",\"name\":\"dependencyInterfaceIds\",\"type\":\"bytes4[]\"},{\"internalType\":\"bytes4[]\",\"name\":\"executionFunctions\",\"type\":\"bytes4[]\"},{\"internalType\":\"bytes4[]\",\"name\":\"permittedExecutionSelectors\",\"type\":\"bytes4[]\"},{\"internalType\":\"bool\",\"name\":\"permitAnyExternalAddress\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"canSpendNativeToken\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"externalAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"permitAnySelector\",\"type\":\"bool\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct ManifestExternalCallPermission[]\",\"name\":\"permittedExternalCalls\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"executionSelector\",\"type\":\"bytes4\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"associatedFunction\",\"type\":\"tuple\"}],\"internalType\":\"struct ManifestAssociatedFunction[]\",\"name\":\"userOpValidationFunctions\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"executionSelector\",\"type\":\"bytes4\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"associatedFunction\",\"type\":\"tuple\"}],\"internalType\":\"struct ManifestAssociatedFunction[]\",\"name\":\"runtimeValidationFunctions\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"executionSelector\",\"type\":\"bytes4\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"associatedFunction\",\"type\":\"tuple\"}],\"internalType\":\"struct ManifestAssociatedFunction[]\",\"name\":\"preUserOpValidationHooks\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"executionSelector\",\"type\":\"bytes4\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"associatedFunction\",\"type\":\"tuple\"}],\"internalType\":\"struct ManifestAssociatedFunction[]\",\"name\":\"preRuntimeValidationHooks\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"preExecHook\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"enum ManifestAssociatedFunctionType\",\"name\":\"functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"dependencyIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct ManifestFunction\",\"name\":\"postExecHook\",\"type\":\"tuple\"}],\"internalType\":\"struct ManifestExecutionHook[]\",\"name\":\"executionHooks\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PluginManifest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pluginMetadata\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"author\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"functionSelector\",\"type\":\"bytes4\"},{\"internalType\":\"string\",\"name\":\"permissionDescription\",\"type\":\"string\"}],\"internalType\":\"struct SelectorPermission[]\",\"name\":\"permissionDescriptors\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PluginMetadata\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"preExecHookData\",\"type\":\"bytes\"}],\"name\":\"postExecutionHook\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"preExecutionHook\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"preRuntimeValidationHook\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"}],\"name\":\"preUserOpValidationHook\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"removeAllowedRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"runtimeValidationFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"functionId\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"}],\"name\":\"userOpValidationFunction\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This plugin serves as an enhanced version of the AddressBookPlugin, incorporating additional limitations on target contracts. It necessitates verification of ownership through either native semi-MSCA mechanisms or a dedicated plugin function designed for full MSCA compliance. 1. For semi-MSCA with native validation such as SingleOwnerMSCA, please provide the follow dependency during installation a. FunctionReference(mscaAddr, uint8(SingleOwnerMSCA.FunctionId.NATIVE_RUNTIME_VALIDATION_OWNER_OR_SELF)) b. FunctionReference(mscaAddr, uint8(SingleOwnerMSCA.FunctionId.NATIVE_USER_OP_VALIDATION_OWNER)) 2. For full MSCA with plugin validation such as UpgradableMSCA, please provide the follow dependency during installation a. FunctionReference(singleOwnerPluginAddr, uint8(ISingleOwnerPlugin.FunctionId.RUNTIME_VALIDATION_OWNER_OR_SELF)) b. FunctionReference(singleOwnerPluginAddr, uint8(ISingleOwnerPlugin.FunctionId.USER_OP_VALIDATION_OWNER)) Both runtime and userOp validations should be covered. Design: 1. For token transfers, verify support for the function selector; if unsupported, reject the transaction. This validation is bypassed for native transfers. 2. Extract the recipient's address from the transaction's calldata for token transfers, or from the target for native transfers. 3. If the recipient's address is not specified (== address(0)) within the calldata, reject the transaction. 4. Validate the recipient against the on-chain address book; validate the target if value > 0 && recipient != target; unauthorized addresses result in transaction rejection. 5. If the recipient is authorized, proceed with the transaction.\",\"kind\":\"dev\",\"methods\":{\"addAllowedRecipients(address[])\":{\"details\":\"Add allowed recipient. Can only be called by the current msg.sender.\"},\"getAllowedRecipients(address)\":{\"details\":\"Returns the allowed addresses of the current MSCA.\"},\"onInstall(bytes)\":{\"details\":\"Called by the modular account during `installPlugin`.\",\"params\":{\"data\":\"Optional bytes array to be decoded and used by the plugin to setup initial plugin data for the modular account.\"}},\"onUninstall(bytes)\":{\"details\":\"Called by the modular account during `uninstallPlugin`.\",\"params\":{\"data\":\"Optional bytes array to be decoded and used by the plugin to clear plugin data for the modular account.\"}},\"pluginManifest()\":{\"details\":\"Upon initial installation of this plugin without designating approved recipients, it is critical to utilize addAllowedRecipients() before making use of the execute() function. It is advisable against embedding the addAllowedRecipients() function within the calldata destined for execute(), due to execute() being protected by specific hooks associated with this plugin. Additionally, it should be noted that when addAllowedRecipients() is accessed through the MSCA fallback function, it does not trigger these hooks.\"},\"pluginMetadata()\":{\"details\":\"This metadata MUST stay constant over time.\",\"returns\":{\"_0\":\"A metadata struct describing the plugin.\"}},\"postExecutionHook(uint8,bytes)\":{\"details\":\"To indicate the entire call should revert, the function MUST revert.\",\"params\":{\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"preExecHookData\":\"The context returned by its associated pre execution hook.\"}},\"preExecutionHook(uint8,address,uint256,bytes)\":{\"details\":\"To indicate the entire call should revert, the function MUST revert.\",\"params\":{\"data\":\"The calldata sent.\",\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"sender\":\"The caller address.\",\"value\":\"The call value.\"},\"returns\":{\"context\":\"Context to pass to a post execution hook, if present. An empty bytes array MAY be returned.\"}},\"preRuntimeValidationHook(uint8,address,uint256,bytes)\":{\"details\":\"To indicate the entire call should revert, the function MUST revert.\",\"params\":{\"data\":\"The calldata sent.\",\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"sender\":\"The caller address.\",\"value\":\"The call value.\"}},\"preUserOpValidationHook(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"details\":\"Pre user operation validation hooks MUST NOT return an authorizer value other than 0 or 1.\",\"params\":{\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"userOp\":\"The user operation.\",\"userOpHash\":\"The user operation hash.\"},\"returns\":{\"validationData\":\"Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes).\"}},\"removeAllowedRecipients(address[])\":{\"details\":\"Remove allowed recipient. Can only be called by the current msg.sender.\"},\"runtimeValidationFunction(uint8,address,uint256,bytes)\":{\"details\":\"To indicate the entire call should revert, the function MUST revert.\",\"params\":{\"data\":\"The calldata sent.\",\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"sender\":\"The caller address.\",\"value\":\"The call value.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30,000 gas. Supporting the IPlugin interface is a requirement for plugin installation (PluginManager). This is also used by the modular account to prevent StandardExecutor functions from making calls to plugins.\",\"params\":{\"interfaceId\":\"The interface ID to check for support.\"},\"returns\":{\"_0\":\"True if the contract supports `interfaceId`.\"}},\"userOpValidationFunction(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"params\":{\"functionId\":\"An identifier that routes the call to different internal implementations, should there be more than one.\",\"userOp\":\"The user operation.\",\"userOpHash\":\"The user operation hash.\"},\"returns\":{\"validationData\":\"Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes).\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onInstall(bytes)\":{\"notice\":\"Initialize plugin data for the modular account.\"},\"onUninstall(bytes)\":{\"notice\":\"Clear plugin data for the modular account.\"},\"pluginMetadata()\":{\"notice\":\"Describe the metadata of the plugin.\"},\"postExecutionHook(uint8,bytes)\":{\"notice\":\"Run the post execution hook specified by the `functionId`.\"},\"preExecutionHook(uint8,address,uint256,bytes)\":{\"notice\":\"Run the pre execution hook specified by the `functionId`.\"},\"preRuntimeValidationHook(uint8,address,uint256,bytes)\":{\"notice\":\"Run the pre runtime validation hook specified by the `functionId`.\"},\"preUserOpValidationHook(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"notice\":\"Run the pre user operation validation hook specified by the `functionId`.\"},\"runtimeValidationFunction(uint8,address,uint256,bytes)\":{\"notice\":\"Run the runtime validationFunction specified by the `functionId`.\"},\"userOpValidationFunction(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"notice\":\"Run the user operation validationFunction specified by the `functionId`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/ColdStorageAddressBookPlugin.sol\":\"ColdStorageAddressBookPlugin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@account-abstraction/=lib/account-abstraction/\",\":@erc6900/reference-implementation/=node_modules/@erc6900/reference-implementation/src/\",\":@eth-infinitism/account-abstraction/=lib/account-abstraction/contracts/\",\":@fcl/=node_modules/fcl/solidity/src/\",\":@modular-account-libs/=node_modules/@modular-account-libs/src/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@solady/=node_modules/solady/src/\",\":forge-std/=node_modules/forge-std/\"],\"viaIR\":true},\"sources\":{\"lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"node_modules/@modular-account-libs/src/libraries/AssociatedLinkedListSetLib.sol\":{\"keccak256\":\"0x9081ac2c98e28cbd85aa916b64ad22f3d0916341dda2c4a5bb405d701040b7d8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eeda63168b4a6ef5e41f2a5019c7163bf857d5614fa5a4058975b4bad39a330f\",\"dweb:/ipfs/QmTPQBitkjRJFyUTSTECrQkBea6xjox4DPsKjgDZjh5TMh\"]},\"node_modules/@modular-account-libs/src/libraries/Constants.sol\":{\"keccak256\":\"0x6b33202ef458f45c496d24ff99e9104be0f82e9adc4452b9cc2484b9e61d00c0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://00018bd36c27139d1e230fc94ec58575d87a84943b6fad1aa9074686d4241bad\",\"dweb:/ipfs/QmWVi4mYnoBzRNobyJA6VQ1dWLmzhxMZW7ArTYFjWZZNWi\"]},\"node_modules/@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"keccak256\":\"0x6caffc9cfdc623eca9f87a686071708af5d5c17454d65022843fdddbc53c0cce\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ecf8c7ed1f8ff443c181f64496ae380ee02e61dcd2ed120e1e997837a926f182\",\"dweb:/ipfs/QmWASYTrZPF2MrcpC3EBmxx6RgtZ5Fr4jwrsmB7ZF7qhDC\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/common/Constants.sol\":{\"keccak256\":\"0xdf1a750b708702fc775e8c9a84f790d6e7d636d04164ec51dfe9a558b45346c0\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://c3755e865d20b9af144cc4f5ec65f79ae2e0695bbac89753b1f55f449efb6e81\",\"dweb:/ipfs/QmeHBRfgq2SMcdzkMLS1tSYQKb8XdKSy4PSGw26uBgFwdL\"]},\"src/common/Errors.sol\":{\"keccak256\":\"0x9cfef91ae11c0061389ebddc49299db3961f315c51714f195305b215a67eff7a\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://cacff5cbe1fc07ea0e85807d3bda52b96f7ea2bce9152061f4a4c614b7311542\",\"dweb:/ipfs/QmNUchbXX92SUFji7AyxGhXHmdZ9grcnHb7Cg8AqRXppZZ\"]},\"src/libs/CastLib.sol\":{\"keccak256\":\"0x8cf61fe6bbc04d9c5f34b7c13eafe73e48a09dcb400d2d1857b21182ad8c439f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://812c9a182acfff9d1a942ac6450af4c8f60b8b4bc50b7fccdef4baa109b7f047\",\"dweb:/ipfs/QmczW9rNqdViG3YkJP7fKCTbwzMHS6oe5mH3f92UQjSqki\"]},\"src/libs/RecipientAddressLib.sol\":{\"keccak256\":\"0x021ef5f99b5d7a312bed13b9c7b9785de5e7744baba6d5041ef6d6ebee1b1e8e\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://730a4ddb81c9a60c3dc4170af85e5886942b8a0fc8d3ae5bf8c6a9452ca88cc2\",\"dweb:/ipfs/QmY2CtzDhtK3CfEH71fydMo3REh5Cp6r14Bdhvij6LDGAt\"]},\"src/msca/6900/shared/common/Errors.sol\":{\"keccak256\":\"0x6c0697fb3959257772b7fa5f277f2a42b289201f1db68920eb4a71e45e7b06f5\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://7ff2590301d8fb136a1a494081627e53bab34187abe8b5ba304a9bf67878c70d\",\"dweb:/ipfs/QmY6kg1DuQNEZHMGLRoHLzykJfs3oioZTm91CBZefKgeg8\"]},\"src/msca/6900/v0.7/common/PluginManifest.sol\":{\"keccak256\":\"0x353a9c989f7c192f72f43628ad39ec45a7c7d73df8d76ebb83881b8278e5f8da\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://944bf9f631abe512633a5d0647e521ce69ef91faba3173a64cc453672d1afbe1\",\"dweb:/ipfs/QmfFycsZdU6mVpXP9sr7H9CzU2CbE2iZb13BQxa5gh8N3n\"]},\"src/msca/6900/v0.7/common/Structs.sol\":{\"keccak256\":\"0xf02819076c22bce75decaa5250607d9ac2c369e5ff978b5f9db437f23e84de46\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://46d85390b7f994c4240c6ca2bc7e7fd68a6085612b9bcab707a722195093ba59\",\"dweb:/ipfs/QmYYn3FywFNb3g7THmUfGKFo2K1vr5FE3bWNeGXCzeb1Dj\"]},\"src/msca/6900/v0.7/interfaces/IPlugin.sol\":{\"keccak256\":\"0x7ed24c53e66bd4b93e7eea2b2673bdb1799e5c90ff0749d4af61e898cf548be1\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://cbe3e1795a01016bc5c92f77158b2e00b8035c3d763ecd21615e2b653da6dced\",\"dweb:/ipfs/QmUY5DsFHpPh4onXbZX6cNdptYeXPDD3rSye9aqqKH5WDS\"]},\"src/msca/6900/v0.7/interfaces/IStandardExecutor.sol\":{\"keccak256\":\"0xcad6f9743a88912406cfc9923d07f145aa0015745410161db86ec363d4e2a978\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://084e70e5ffb906b83e83dfc456ba656adc2f2de683d9b07a8a537e78163c5f0c\",\"dweb:/ipfs/QmTj8TCCsg8JrJJGgWMjZrWHE1137a1fciMo7yHh5E76xp\"]},\"src/msca/6900/v0.7/plugins/BasePlugin.sol\":{\"keccak256\":\"0x52f0cd9282a1973905813a233100452d5708aecf30b693ce3e34ce43f1cb072a\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://69e5fcd52522ec830e55ec120a7f5c82dc68aab1bf765b6054d79b449feb6d55\",\"dweb:/ipfs/QmPBQRfw9sNtpcFKnYqBZgxPSNUQNjQZLvgV8W6AiPQCfk\"]},\"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/ColdStorageAddressBookPlugin.sol\":{\"keccak256\":\"0xb70d286929ce5e0c89e5e50163d8e9f52b4bc9436e465fd28d46d4dac3eb766f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://aaf8fd8c498257ff87515fc8803602e8daeae998f88e33ced297ddf69a9ee224\",\"dweb:/ipfs/QmX5oe5C7EfAsEev3KDyeJxQNPVVbJtBcKR8UvQJ8RzHqv\"]},\"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/IAddressBookPlugin.sol\":{\"keccak256\":\"0xe99651bc115182e10ac393c1bb88b59a0a3094ace6554f8691689331eaac5645\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b4c5809ddcb307d7d03781b6271e5942a37fb6cb085c31e4b38eb7ba16ebd9a0\",\"dweb:/ipfs/QmchqWnby2S5PaqzURzAUYGYuHREZzREkUrW2DTViE4EA3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"AlreadyInitialized"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"type":"error","name":"CallDataIsNotEmpty"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"type":"error","name":"FailToAddRecipient"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"type":"error","name":"FailToRemoveRecipient"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"type":"error","name":"InvalidTargetCodeLength"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"uint8","name":"functionId","type":"uint8"}],"type":"error","name":"NotImplemented"},{"inputs":[],"type":"error","name":"NotInitialized"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"type":"error","name":"UnauthorizedRecipient"},{"inputs":[],"type":"error","name":"Unsupported"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address[]","name":"recipients","type":"address[]","indexed":false}],"type":"event","name":"AllowedAddressesAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"AllowedAddressesNotRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address[]","name":"recipients","type":"address[]","indexed":false}],"type":"event","name":"AllowedAddressesRemoved","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"addAllowedRecipients"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getAllowedRecipients","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onInstall"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onUninstall"},{"inputs":[],"stateMutability":"pure","type":"function","name":"pluginManifest","outputs":[{"internalType":"struct PluginManifest","name":"","type":"tuple","components":[{"internalType":"bytes4[]","name":"interfaceIds","type":"bytes4[]"},{"internalType":"bytes4[]","name":"dependencyInterfaceIds","type":"bytes4[]"},{"internalType":"bytes4[]","name":"executionFunctions","type":"bytes4[]"},{"internalType":"bytes4[]","name":"permittedExecutionSelectors","type":"bytes4[]"},{"internalType":"bool","name":"permitAnyExternalAddress","type":"bool"},{"internalType":"bool","name":"canSpendNativeToken","type":"bool"},{"internalType":"struct ManifestExternalCallPermission[]","name":"permittedExternalCalls","type":"tuple[]","components":[{"internalType":"address","name":"externalAddress","type":"address"},{"internalType":"bool","name":"permitAnySelector","type":"bool"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}]},{"internalType":"struct ManifestAssociatedFunction[]","name":"userOpValidationFunctions","type":"tuple[]","components":[{"internalType":"bytes4","name":"executionSelector","type":"bytes4"},{"internalType":"struct ManifestFunction","name":"associatedFunction","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]}]},{"internalType":"struct ManifestAssociatedFunction[]","name":"runtimeValidationFunctions","type":"tuple[]","components":[{"internalType":"bytes4","name":"executionSelector","type":"bytes4"},{"internalType":"struct ManifestFunction","name":"associatedFunction","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]}]},{"internalType":"struct ManifestAssociatedFunction[]","name":"preUserOpValidationHooks","type":"tuple[]","components":[{"internalType":"bytes4","name":"executionSelector","type":"bytes4"},{"internalType":"struct ManifestFunction","name":"associatedFunction","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]}]},{"internalType":"struct ManifestAssociatedFunction[]","name":"preRuntimeValidationHooks","type":"tuple[]","components":[{"internalType":"bytes4","name":"executionSelector","type":"bytes4"},{"internalType":"struct ManifestFunction","name":"associatedFunction","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]}]},{"internalType":"struct ManifestExecutionHook[]","name":"executionHooks","type":"tuple[]","components":[{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"struct ManifestFunction","name":"preExecHook","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]},{"internalType":"struct ManifestFunction","name":"postExecHook","type":"tuple","components":[{"internalType":"enum ManifestAssociatedFunctionType","name":"functionType","type":"uint8"},{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"uint256","name":"dependencyIndex","type":"uint256"}]}]}]}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"pluginMetadata","outputs":[{"internalType":"struct PluginMetadata","name":"","type":"tuple","components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"author","type":"string"},{"internalType":"struct SelectorPermission[]","name":"permissionDescriptors","type":"tuple[]","components":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"string","name":"permissionDescription","type":"string"}]}]}]},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"bytes","name":"preExecHookData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"postExecutionHook"},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"preExecutionHook","outputs":[{"internalType":"bytes","name":"context","type":"bytes"}]},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"preRuntimeValidationHook"},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"preUserOpValidationHook","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}]},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"removeAllowedRecipients"},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"runtimeValidationFunction"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"functionId","type":"uint8"},{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"userOpValidationFunction","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"addAllowedRecipients(address[])":{"details":"Add allowed recipient. Can only be called by the current msg.sender."},"getAllowedRecipients(address)":{"details":"Returns the allowed addresses of the current MSCA."},"onInstall(bytes)":{"details":"Called by the modular account during `installPlugin`.","params":{"data":"Optional bytes array to be decoded and used by the plugin to setup initial plugin data for the modular account."}},"onUninstall(bytes)":{"details":"Called by the modular account during `uninstallPlugin`.","params":{"data":"Optional bytes array to be decoded and used by the plugin to clear plugin data for the modular account."}},"pluginManifest()":{"details":"Upon initial installation of this plugin without designating approved recipients, it is critical to utilize addAllowedRecipients() before making use of the execute() function. It is advisable against embedding the addAllowedRecipients() function within the calldata destined for execute(), due to execute() being protected by specific hooks associated with this plugin. Additionally, it should be noted that when addAllowedRecipients() is accessed through the MSCA fallback function, it does not trigger these hooks."},"pluginMetadata()":{"details":"This metadata MUST stay constant over time.","returns":{"_0":"A metadata struct describing the plugin."}},"postExecutionHook(uint8,bytes)":{"details":"To indicate the entire call should revert, the function MUST revert.","params":{"functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","preExecHookData":"The context returned by its associated pre execution hook."}},"preExecutionHook(uint8,address,uint256,bytes)":{"details":"To indicate the entire call should revert, the function MUST revert.","params":{"data":"The calldata sent.","functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","sender":"The caller address.","value":"The call value."},"returns":{"context":"Context to pass to a post execution hook, if present. An empty bytes array MAY be returned."}},"preRuntimeValidationHook(uint8,address,uint256,bytes)":{"details":"To indicate the entire call should revert, the function MUST revert.","params":{"data":"The calldata sent.","functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","sender":"The caller address.","value":"The call value."}},"preUserOpValidationHook(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"details":"Pre user operation validation hooks MUST NOT return an authorizer value other than 0 or 1.","params":{"functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","userOp":"The user operation.","userOpHash":"The user operation hash."},"returns":{"validationData":"Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes)."}},"removeAllowedRecipients(address[])":{"details":"Remove allowed recipient. Can only be called by the current msg.sender."},"runtimeValidationFunction(uint8,address,uint256,bytes)":{"details":"To indicate the entire call should revert, the function MUST revert.","params":{"data":"The calldata sent.","functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","sender":"The caller address.","value":"The call value."}},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30,000 gas. Supporting the IPlugin interface is a requirement for plugin installation (PluginManager). This is also used by the modular account to prevent StandardExecutor functions from making calls to plugins.","params":{"interfaceId":"The interface ID to check for support."},"returns":{"_0":"True if the contract supports `interfaceId`."}},"userOpValidationFunction(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"params":{"functionId":"An identifier that routes the call to different internal implementations, should there be more than one.","userOp":"The user operation.","userOpHash":"The user operation hash."},"returns":{"validationData":"Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes)."}}},"version":1},"userdoc":{"kind":"user","methods":{"onInstall(bytes)":{"notice":"Initialize plugin data for the modular account."},"onUninstall(bytes)":{"notice":"Clear plugin data for the modular account."},"pluginMetadata()":{"notice":"Describe the metadata of the plugin."},"postExecutionHook(uint8,bytes)":{"notice":"Run the post execution hook specified by the `functionId`."},"preExecutionHook(uint8,address,uint256,bytes)":{"notice":"Run the pre execution hook specified by the `functionId`."},"preRuntimeValidationHook(uint8,address,uint256,bytes)":{"notice":"Run the pre runtime validation hook specified by the `functionId`."},"preUserOpValidationHook(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"notice":"Run the pre user operation validation hook specified by the `functionId`."},"runtimeValidationFunction(uint8,address,uint256,bytes)":{"notice":"Run the runtime validationFunction specified by the `functionId`."},"userOpValidationFunction(uint8,(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"notice":"Run the user operation validationFunction specified by the `functionId`."}},"version":1}},"settings":{"remappings":["@account-abstraction/=lib/account-abstraction/","@erc6900/reference-implementation/=node_modules/@erc6900/reference-implementation/src/","@eth-infinitism/account-abstraction/=lib/account-abstraction/contracts/","@fcl/=node_modules/fcl/solidity/src/","@modular-account-libs/=node_modules/@modular-account-libs/src/","@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/","@solady/=node_modules/solady/src/","forge-std/=node_modules/forge-std/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/ColdStorageAddressBookPlugin.sol":"ColdStorageAddressBookPlugin"},"evmVersion":"paris","libraries":{},"viaIR":true},"sources":{"lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"node_modules/@modular-account-libs/src/libraries/AssociatedLinkedListSetLib.sol":{"keccak256":"0x9081ac2c98e28cbd85aa916b64ad22f3d0916341dda2c4a5bb405d701040b7d8","urls":["bzz-raw://eeda63168b4a6ef5e41f2a5019c7163bf857d5614fa5a4058975b4bad39a330f","dweb:/ipfs/QmTPQBitkjRJFyUTSTECrQkBea6xjox4DPsKjgDZjh5TMh"],"license":"MIT"},"node_modules/@modular-account-libs/src/libraries/Constants.sol":{"keccak256":"0x6b33202ef458f45c496d24ff99e9104be0f82e9adc4452b9cc2484b9e61d00c0","urls":["bzz-raw://00018bd36c27139d1e230fc94ec58575d87a84943b6fad1aa9074686d4241bad","dweb:/ipfs/QmWVi4mYnoBzRNobyJA6VQ1dWLmzhxMZW7ArTYFjWZZNWi"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC1155/IERC1155.sol":{"keccak256":"0x6caffc9cfdc623eca9f87a686071708af5d5c17454d65022843fdddbc53c0cce","urls":["bzz-raw://ecf8c7ed1f8ff443c181f64496ae380ee02e61dcd2ed120e1e997837a926f182","dweb:/ipfs/QmWASYTrZPF2MrcpC3EBmxx6RgtZ5Fr4jwrsmB7ZF7qhDC"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4","urls":["bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7","dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"src/common/Constants.sol":{"keccak256":"0xdf1a750b708702fc775e8c9a84f790d6e7d636d04164ec51dfe9a558b45346c0","urls":["bzz-raw://c3755e865d20b9af144cc4f5ec65f79ae2e0695bbac89753b1f55f449efb6e81","dweb:/ipfs/QmeHBRfgq2SMcdzkMLS1tSYQKb8XdKSy4PSGw26uBgFwdL"],"license":"GPL-3.0-or-later"},"src/common/Errors.sol":{"keccak256":"0x9cfef91ae11c0061389ebddc49299db3961f315c51714f195305b215a67eff7a","urls":["bzz-raw://cacff5cbe1fc07ea0e85807d3bda52b96f7ea2bce9152061f4a4c614b7311542","dweb:/ipfs/QmNUchbXX92SUFji7AyxGhXHmdZ9grcnHb7Cg8AqRXppZZ"],"license":"GPL-3.0-or-later"},"src/libs/CastLib.sol":{"keccak256":"0x8cf61fe6bbc04d9c5f34b7c13eafe73e48a09dcb400d2d1857b21182ad8c439f","urls":["bzz-raw://812c9a182acfff9d1a942ac6450af4c8f60b8b4bc50b7fccdef4baa109b7f047","dweb:/ipfs/QmczW9rNqdViG3YkJP7fKCTbwzMHS6oe5mH3f92UQjSqki"],"license":"GPL-3.0-or-later"},"src/libs/RecipientAddressLib.sol":{"keccak256":"0x021ef5f99b5d7a312bed13b9c7b9785de5e7744baba6d5041ef6d6ebee1b1e8e","urls":["bzz-raw://730a4ddb81c9a60c3dc4170af85e5886942b8a0fc8d3ae5bf8c6a9452ca88cc2","dweb:/ipfs/QmY2CtzDhtK3CfEH71fydMo3REh5Cp6r14Bdhvij6LDGAt"],"license":"GPL-3.0-or-later"},"src/msca/6900/shared/common/Errors.sol":{"keccak256":"0x6c0697fb3959257772b7fa5f277f2a42b289201f1db68920eb4a71e45e7b06f5","urls":["bzz-raw://7ff2590301d8fb136a1a494081627e53bab34187abe8b5ba304a9bf67878c70d","dweb:/ipfs/QmY6kg1DuQNEZHMGLRoHLzykJfs3oioZTm91CBZefKgeg8"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/common/PluginManifest.sol":{"keccak256":"0x353a9c989f7c192f72f43628ad39ec45a7c7d73df8d76ebb83881b8278e5f8da","urls":["bzz-raw://944bf9f631abe512633a5d0647e521ce69ef91faba3173a64cc453672d1afbe1","dweb:/ipfs/QmfFycsZdU6mVpXP9sr7H9CzU2CbE2iZb13BQxa5gh8N3n"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/common/Structs.sol":{"keccak256":"0xf02819076c22bce75decaa5250607d9ac2c369e5ff978b5f9db437f23e84de46","urls":["bzz-raw://46d85390b7f994c4240c6ca2bc7e7fd68a6085612b9bcab707a722195093ba59","dweb:/ipfs/QmYYn3FywFNb3g7THmUfGKFo2K1vr5FE3bWNeGXCzeb1Dj"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/interfaces/IPlugin.sol":{"keccak256":"0x7ed24c53e66bd4b93e7eea2b2673bdb1799e5c90ff0749d4af61e898cf548be1","urls":["bzz-raw://cbe3e1795a01016bc5c92f77158b2e00b8035c3d763ecd21615e2b653da6dced","dweb:/ipfs/QmUY5DsFHpPh4onXbZX6cNdptYeXPDD3rSye9aqqKH5WDS"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/interfaces/IStandardExecutor.sol":{"keccak256":"0xcad6f9743a88912406cfc9923d07f145aa0015745410161db86ec363d4e2a978","urls":["bzz-raw://084e70e5ffb906b83e83dfc456ba656adc2f2de683d9b07a8a537e78163c5f0c","dweb:/ipfs/QmTj8TCCsg8JrJJGgWMjZrWHE1137a1fciMo7yHh5E76xp"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/plugins/BasePlugin.sol":{"keccak256":"0x52f0cd9282a1973905813a233100452d5708aecf30b693ce3e34ce43f1cb072a","urls":["bzz-raw://69e5fcd52522ec830e55ec120a7f5c82dc68aab1bf765b6054d79b449feb6d55","dweb:/ipfs/QmPBQRfw9sNtpcFKnYqBZgxPSNUQNjQZLvgV8W6AiPQCfk"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/ColdStorageAddressBookPlugin.sol":{"keccak256":"0xb70d286929ce5e0c89e5e50163d8e9f52b4bc9436e465fd28d46d4dac3eb766f","urls":["bzz-raw://aaf8fd8c498257ff87515fc8803602e8daeae998f88e33ced297ddf69a9ee224","dweb:/ipfs/QmX5oe5C7EfAsEev3KDyeJxQNPVVbJtBcKR8UvQJ8RzHqv"],"license":"GPL-3.0-or-later"},"src/msca/6900/v0.7/plugins/v1_0_0/addressbook/IAddressBookPlugin.sol":{"keccak256":"0xe99651bc115182e10ac393c1bb88b59a0a3094ace6554f8691689331eaac5645","urls":["bzz-raw://b4c5809ddcb307d7d03781b6271e5942a37fb6cb085c31e4b38eb7ba16ebd9a0","dweb:/ipfs/QmchqWnby2S5PaqzURzAUYGYuHREZzREkUrW2DTViE4EA3"],"license":"GPL-3.0-or-later"}},"version":1},"id":18} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe also add a readme here how we generate this file so others can follow
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added to main readme, does that work for you?
Can you at least use the same naming convention from other scripts?
…On Tue, Feb 4, 2025, 6:22 PM weikangsong ***@***.***> wrote:
***@***.**** commented on this pull request.
------------------------------
In script/bytecode-deploy/100_ContractAddress.sol
<https://urldefense.com/v3/__https://github.com/circlefin/buidl-wallet-contracts/pull/68*discussion_r1942026118__;Iw!!KESPuB0hxvuP98OfPa165uRs!BwoIR_xSxQqXAr-qtFw7uGMqNcuL8KGhwva6fq-wp9tfjuiKYS9BO0HrM744ca12QAQ3aYwe_bpYubz8rqyH$>
:
> + * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/ <https://urldefense.com/v3/__http://www.gnu.org/licenses/__;!!KESPuB0hxvuP98OfPa165uRs!BwoIR_xSxQqXAr-qtFw7uGMqNcuL8KGhwva6fq-wp9tfjuiKYS9BO0HrM744ca12QAQ3aYwe_bpYuV-x2szb$>>.
+ */
+pragma solidity 0.8.24;
+
+address constant ENTRY_POINT = 0x0000000071727De22E5E9d8BAf0edAc6f37da032;
I'd like to keep /bytecode-deploy separate from existing scripts and avoid
making changes to existing scripts
—
Reply to this email directly, view it on GitHub
<https://urldefense.com/v3/__https://github.com/circlefin/buidl-wallet-contracts/pull/68*discussion_r1942026118__;Iw!!KESPuB0hxvuP98OfPa165uRs!BwoIR_xSxQqXAr-qtFw7uGMqNcuL8KGhwva6fq-wp9tfjuiKYS9BO0HrM744ca12QAQ3aYwe_bpYubz8rqyH$>,
or unsubscribe
<https://urldefense.com/v3/__https://github.com/notifications/unsubscribe-auth/ACELT73QQG6HZEQ25G5ST4D2OFDC7AVCNFSM6AAAAABWMYGVBKVHI2DSMVQWIX3LMV43YUDVNRWFEZLROVSXG5CSMV3GSZLXHMZDKOJUGI3TINRVG4__;!!KESPuB0hxvuP98OfPa165uRs!BwoIR_xSxQqXAr-qtFw7uGMqNcuL8KGhwva6fq-wp9tfjuiKYS9BO0HrM744ca12QAQ3aYwe_bpYueEbjR26$>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
@@ -0,0 +1,59 @@ | |||
/* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any specific reason we're not starting from 001
for the file name?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah because foundry generates folder under ./broadcast based on script name.. if using 001, it will be conflict with existing scripts
what is the naming convention you're referring to? |
|
||
`make anvil` (if using foundry stack). To get a list of pre-funded addresses, you can look at the beginning of the logs in the `anvil` Docker container, or reference <https://github.com/foundry-rs/foundry/blob/0d8302880b79fa9c3c4aa52ab446583dece19a34/crates/anvil/README.md?plain=1#L48>. | ||
|
||
### (NEW) Deploy & Verify |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's move the deployment and verification instructions to a separate README to keep the main README concise. In the main README, we can include a reference to the deployment README.
🤖 I have created a release *beep* *boop* --- ## [2.2.0](v2.1.2...v2.2.0) (2025-02-20) ### Features * add bytecode deployment scripts ([#68](#68)) ([a0fdf60](a0fdf60)) * sync the latest development ([#72](#72)) ([4e6281f](4e6281f)) ### Miscellaneous Chores * add missing copyright header ([#70](#70)) ([431adb9](431adb9)) ### Continuous Integration * add code coverage checking script ([#58](#58)) ([517b89a](517b89a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Summary
Adds deployment script based on bytecode deployment with deterministic deployment factory
Detail
We're hitting a solidity issue when using existing deployment script for circle_6900_v1 contract deployment. We decided to use bytecode deployment instead.
I tried ai cli for code review but hitting 500 error from openai, thread: https://circlefin.slack.com/archives/C087VN6JYRW/p1739470622423289
Changeset
This PR:
Checklist
yarn test
)docs
folder)feat!: breaking change
)yarn lint
) and fix any issues?yarn format:check
) and fix any issues (yarn format:write
)?Testing
Mandatory section.
For each changeset, please highlight the tests you've added.
N/A no need to create test files for deployment scripts
Documentation
Optional section.
Link to the doc.