Skip to content

Conversation

weikangsong
Copy link
Contributor

@weikangsong weikangsong commented Feb 3, 2025

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:

  1. Adds deployment scripts for circle_6900_v1 contracts
  2. Deployment script support multi-chain deploy.
  3. Adds README for how the scripts and artifacts are generated, as well as the future chain expansion instructions.

Checklist

  • Did you add new tests and confirm all tests pass? (yarn test)
  • Did you update relevant docs? (docs are found in the docs folder)
  • Do your commits follow the Conventional Commits standard?
  • Does your PR title also follow the Conventional Commits standard?
  • If you have a breaking change, is it correctly reflected in your commit message? (e.g. feat!: breaking change)
  • Did you run lint (yarn lint) and fix any issues?
  • Did you run formatter (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.

Copy link
Contributor

@huaweigu huaweigu left a 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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

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");
Copy link
Contributor

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.

Copy link
Contributor Author

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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

@huaweigu
Copy link
Contributor

huaweigu commented Feb 3, 2025

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();
Copy link
Contributor

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

Copy link
Contributor Author

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}
Copy link
Contributor

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

Copy link
Contributor Author

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?

@huaweigu
Copy link
Contributor

huaweigu commented Feb 4, 2025 via email

@@ -0,0 +1,59 @@
/*
Copy link
Contributor

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?

Copy link
Contributor Author

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

@weikangsong
Copy link
Contributor Author

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: @.**>

what is the naming convention you're referring to?

@weikangsong weikangsong marked this pull request as ready for review February 13, 2025 18:26

`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
Copy link
Contributor

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.

@huaweigu huaweigu merged commit a0fdf60 into circlefin:master Feb 20, 2025
6 checks passed
huaweigu pushed a commit that referenced this pull request Feb 21, 2025
🤖 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants