{ "address": "0xAC5fa7A8D3e803ECb771C5ca113055C816E266cE", "abi": [ { "inputs": [ { "internalType": "contract IOpsProxyFactory", "name": "_opsProxyFactory", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "execAddresses", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "fee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeToken", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "nonce1Balance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" }, { "internalType": "address", "name": "_taskCreator", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "bytes", "name": "", "type": "bytes" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onCreateTask", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "opsProxyFactory", "outputs": [ { "internalType": "contract IOpsProxyFactory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "taskId", "type": "bytes32" }, { "internalType": "address", "name": "taskCreator", "type": "address" }, { "internalType": "address", "name": "execAddress", "type": "address" }, { "internalType": "bytes", "name": "execData", "type": "bytes" } ], "name": "postExecCall", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" }, { "internalType": "address", "name": "_taskCreator", "type": "address" } ], "name": "preCancelTask", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_taskCreator", "type": "address" }, { "internalType": "address", "name": "_execAddress", "type": "address" } ], "name": "preCreateTask", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" }, { "internalType": "address", "name": "_taskCreator", "type": "address" }, { "internalType": "address", "name": "_execAddress", "type": "address" }, { "internalType": "bytes", "name": "_execData", "type": "bytes" } ], "name": "preExecCall", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "bytes", "name": "execData", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "taskCreator", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "enum LibDataTypes.Module", "name": "", "type": "uint8" } ], "name": "taskModuleAddresses", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "timedTask", "outputs": [ { "internalType": "uint128", "name": "nextExec", "type": "uint128" }, { "internalType": "uint128", "name": "interval", "type": "uint128" } ], "stateMutability": "view", "type": "function" } ], "transactionHash": "0x2a4bdd054856595e2168c125fb65a94d419c2c3a0c78f02f4f4710596e2d41a0", "receipt": { "to": null, "from": "0xD9BeF6C69B6CAB3d651534c46541d21cC2b36723", "contractAddress": "0xAC5fa7A8D3e803ECb771C5ca113055C816E266cE", "transactionIndex": 0, "gasUsed": "1139050", "logsBloom": "0x00000000000000000010000000000000000000000000000000000000000004000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000104000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000002000000000000100000000000000000000000000000000000000000000000000000400000000000000000100000", "blockHash": "0x764de2b3ed76775cbba3aa76a3f910ab4bf5f71a203625240bca84984070a3c0", "transactionHash": "0x2a4bdd054856595e2168c125fb65a94d419c2c3a0c78f02f4f4710596e2d41a0", "logs": [ { "transactionIndex": 0, "blockNumber": 6186567, "transactionHash": "0x2a4bdd054856595e2168c125fb65a94d419c2c3a0c78f02f4f4710596e2d41a0", "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000d9bef6c69b6cab3d651534c46541d21cc2b36723", "0x000000000000000000000000915a2284d28bd93de7d6f31173b981204bb666e6" ], "data": "0x00000000000000000000000000000000000000000000000000143bccb8237eca00000000000000000000000000000000000000000000000003bc64239a66b16000000000000000000000000000000000000000000000005ce4f28f32507b497000000000000000000000000000000000000000000000000003a82856e243329600000000000000000000000000000000000000000000005ce506caff089ec83a", "logIndex": 0, "blockHash": "0x764de2b3ed76775cbba3aa76a3f910ab4bf5f71a203625240bca84984070a3c0" } ], "blockNumber": 6186567, "cumulativeGasUsed": "1139050", "status": 1, "byzantium": true }, "args": ["0xd10461ed54a6264c6a770F6a958Ee89C8f1B227f"], "numDeployments": 1, "solcInputHash": "cbdbea7c3520531d2f6235911ca6ac38", "metadata": "{\"compiler\":{\"version\":\"0.8.14+commit.80d49f37\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IOpsProxyFactory\",\"name\":\"_opsProxyFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"execAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nonce1Balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_taskCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onCreateTask\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"opsProxyFactory\",\"outputs\":[{\"internalType\":\"contract IOpsProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"taskId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"taskCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"execAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"execData\",\"type\":\"bytes\"}],\"name\":\"postExecCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_taskCreator\",\"type\":\"address\"}],\"name\":\"preCancelTask\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_taskCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_execAddress\",\"type\":\"address\"}],\"name\":\"preCreateTask\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_taskCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_execAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_execData\",\"type\":\"bytes\"}],\"name\":\"preExecCall\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"execData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"taskCreator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum LibDataTypes.Module\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"taskModuleAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"timedTask\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"nextExec\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"interval\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onCreateTask(bytes32,address,address,bytes,bytes)\":{\"params\":{\"execAddress\":\"Address of contract that should be called.\",\"execData\":\"Execution data to be called with / function selector if execution data is yet to be determined.\",\"initModuleArg\":\"Encoded arguments for module if any.\",\"taskCreator\":\"The address which created the task.\",\"taskId\":\"Unique hash of the task created.\"}},\"postExecCall(bytes32,address,address,bytes)\":{\"params\":{\"execAddress\":\"Address of contract that should be called.\",\"execData\":\"Execution data to be called with / function selector if execution data is yet to be determined.\",\"taskCreator\":\"The address which created the task.\",\"taskId\":\"Unique hash of the task created.\"}},\"preCancelTask(bytes32,address)\":{\"details\":\"Modules can override taskCreator.\",\"params\":{\"taskCreator\":\"The address which created the task.\",\"taskId\":\"Unique hash of the task created.\"},\"returns\":{\"_0\":\"address Overriden or original taskCreator.\"}},\"preCreateTask(address,address)\":{\"details\":\"_taskCreator cannot create task to other user's proxy\",\"params\":{\"execAddress\":\"Address of contract that should be called.\",\"taskCreator\":\"The address which created the task.\"},\"returns\":{\"_0\":\"address Overriden or original taskCreator.\",\"_1\":\"address Overriden or original execAddress.\"}},\"preExecCall(bytes32,address,address,bytes)\":{\"details\":\"_execData is encoded with proxy's `executeCall` function unless _execAddress is OpsProxy which assumes that _execData is encoded with `executeCall` or `batchExecuteCall`.\",\"params\":{\"execAddress\":\"Address of contract that should be called.\",\"execData\":\"Execution data to be called with / function selector if execution data is yet to be determined.\",\"taskCreator\":\"The address which created the task.\",\"taskId\":\"Unique hash of the task created.\"},\"returns\":{\"_0\":\"address Overriden or original execution address.\",\"execData\":\"bytes Overriden or original execution data.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onCreateTask(bytes32,address,address,bytes,bytes)\":{\"notice\":\"Initiates task module whenever `createTask` is being called.\"},\"postExecCall(bytes32,address,address,bytes)\":{\"notice\":\"Called during `exec` and after execAddress is called.\"},\"preCancelTask(bytes32,address)\":{\"notice\":\"Called before taskId is removed from _createdTasks[].\"},\"preCreateTask(address,address)\":{\"notice\":\"Called before generating taskId.\"},\"preExecCall(bytes32,address,address,bytes)\":{\"notice\":\"Called during `exec` and before execAddress is called.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/taskModules/ProxyModule.sol\":\"ProxyModule\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastvalue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastvalue;\\n // Update the index for the moved value\\n set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n return _values(set._inner);\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9772845c886f87a3aab315f8d6b68aa599027c20f441b131cd4afaf65b588900\",\"license\":\"MIT\"},\"contracts/AutomateStorage.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\nimport {\\n EnumerableSet\\n} from \\\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\\\";\\nimport {LibDataTypes} from \\\"./libraries/LibDataTypes.sol\\\";\\n\\n/**\\n * @notice Storage layout of Automate smart contract.\\n */\\n// solhint-disable max-states-count\\nabstract contract AutomateStorage {\\n mapping(bytes32 => address) public taskCreator; ///@dev Deprecated\\n mapping(bytes32 => address) public execAddresses; ///@dev Deprecated\\n mapping(address => EnumerableSet.Bytes32Set) internal _createdTasks;\\n\\n uint256 public fee;\\n address public feeToken;\\n\\n ///@dev Appended State\\n mapping(bytes32 => LibDataTypes.Time) public timedTask; ///@dev Deprecated\\n mapping(LibDataTypes.Module => address) public taskModuleAddresses;\\n mapping(bytes32 => uint256) public nonce1Balance; ///@dev Deprecated\\n}\\n\",\"keccak256\":\"0xdc7009675d6be9436f1223a82c64b80f8f2ef8c2a594298bf6d5db8b201d45f8\",\"license\":\"UNLICENSED\"},\"contracts/interfaces/IOpsProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\n\\ninterface IOpsProxy {\\n /**\\n * @notice Emitted when proxy calls a contract successfully in `executeCall`\\n *\\n * @param target Address of contract that is called\\n * @param data Data used in the call.\\n * @param value Native token value used in the call.\\n * @param returnData Data returned by the call.\\n */\\n event ExecuteCall(\\n address indexed target,\\n bytes data,\\n uint256 value,\\n bytes returnData\\n );\\n\\n /**\\n * @notice Multicall to different contracts with different datas.\\n *\\n * @param targets Addresses of contracts to be called.\\n * @param datas Datas for each contract call.\\n * @param values Native token value for each contract call.\\n */\\n function batchExecuteCall(\\n address[] calldata targets,\\n bytes[] calldata datas,\\n uint256[] calldata values\\n ) external payable;\\n\\n /**\\n * @notice Call to a single contract.\\n *\\n * @param target Address of contracts to be called.\\n * @param data Data for contract call.\\n * @param value Native token value for contract call.\\n */\\n function executeCall(\\n address target,\\n bytes calldata data,\\n uint256 value\\n ) external payable;\\n\\n /**\\n * @return address Ops smart contract address\\n */\\n function ops() external view returns (address);\\n\\n /**\\n * @return address Owner of the proxy\\n */\\n function owner() external view returns (address);\\n\\n /**\\n * @return uint256 version of OpsProxy.\\n */\\n function version() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1b6e349287dfeb2735da8d3f7ae0aa5865996f7dd58622773b449a76bcaf881a\",\"license\":\"MIT\"},\"contracts/interfaces/IOpsProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\n\\ninterface IOpsProxyFactory {\\n /**\\n * @notice Emitted when an OpsProxy is deployed.\\n *\\n * @param deployer Address which initiated the deployment\\n * @param owner The address which the proxy is for.\\n * @param proxy Address of deployed proxy.\\n */\\n event DeployProxy(\\n address indexed deployer,\\n address indexed owner,\\n address indexed proxy\\n );\\n\\n /**\\n * @notice Emitted when OpsProxy implementation to be deployed is changed.\\n *\\n * @param oldImplementation Previous OpsProxy implementation.\\n * @param newImplementation Current OpsProxy implementation.\\n */\\n event SetImplementation(\\n address indexed oldImplementation,\\n address indexed newImplementation\\n );\\n\\n /**\\n * @notice Emitted when OpsProxy implementation is added or removed from whitelist.\\n *\\n * @param implementation OpsProxy implementation.\\n * @param whitelisted Added or removed from whitelist.\\n */\\n event UpdateWhitelistedImplementation(\\n address indexed implementation,\\n bool indexed whitelisted\\n );\\n\\n /**\\n * @notice Deploys OpsProxy for the msg.sender.\\n *\\n * @return proxy Address of deployed proxy.\\n */\\n function deploy() external returns (address payable proxy);\\n\\n /**\\n * @notice Deploys OpsProxy for another address.\\n *\\n * @param owner Address to deploy the proxy for.\\n *\\n * @return proxy Address of deployed proxy.\\n */\\n function deployFor(address owner) external returns (address payable proxy);\\n\\n /**\\n * @notice Sets the OpsProxy implementation that will be deployed by OpsProxyFactory.\\n *\\n * @param newImplementation New implementation to be set.\\n */\\n function setImplementation(address newImplementation) external;\\n\\n /**\\n * @notice Add or remove OpsProxy implementation from the whitelist.\\n *\\n * @param implementation OpsProxy implementation.\\n * @param whitelist Added or removed from whitelist.\\n */\\n function updateWhitelistedImplementations(\\n address implementation,\\n bool whitelist\\n ) external;\\n\\n /**\\n * @notice Determines the OpsProxy address when it is not deployed.\\n *\\n * @param account Address to determine the proxy address for.\\n */\\n function determineProxyAddress(address account)\\n external\\n view\\n returns (address);\\n\\n /**\\n * @return address Proxy address owned by account.\\n * @return bool Whether if proxy is deployed\\n */\\n function getProxyOf(address account) external view returns (address, bool);\\n\\n /**\\n * @return address Owner of deployed proxy.\\n */\\n function ownerOf(address proxy) external view returns (address);\\n\\n /**\\n * @return bool Whether if implementation is whitelisted.\\n */\\n function whitelistedImplementations(address implementation)\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xf4852a06be6f35a0671cf951f455fb9a58320c0908914c3ab9e62f9d27affe2b\",\"license\":\"MIT\"},\"contracts/interfaces/ITaskModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.12;\\n\\n// solhint-disable max-line-length\\ninterface ITaskModule {\\n /**\\n * @notice Called before generating taskId.\\n * @dev Modules can override execAddress or taskCreator. {See ProxyModule-preCreateTask}\\n *\\n * @param taskCreator The address which created the task.\\n * @param execAddress Address of contract that should be called.\\n *\\n * @return address Overriden or original taskCreator.\\n * @return address Overriden or original execAddress.\\n */\\n function preCreateTask(address taskCreator, address execAddress)\\n external\\n returns (address, address);\\n\\n /**\\n * @notice Initiates task module whenever `createTask` is being called.\\n *\\n * @param taskId Unique hash of the task created.\\n * @param taskCreator The address which created the task.\\n * @param execAddress Address of contract that should be called.\\n * @param execData Execution data to be called with / function selector if execution data is yet to be determined.\\n * @param initModuleArg Encoded arguments for module if any.\\n */\\n function onCreateTask(\\n bytes32 taskId,\\n address taskCreator,\\n address execAddress,\\n bytes calldata execData,\\n bytes calldata initModuleArg\\n ) external;\\n\\n /**\\n * @notice Called before taskId is removed from _createdTasks[].\\n * @dev Modules can override taskCreator.\\n *\\n * @param taskId Unique hash of the task created.\\n * @param taskCreator The address which created the task.\\n *\\n * @return address Overriden or original taskCreator.\\n */\\n function preCancelTask(bytes32 taskId, address taskCreator)\\n external\\n returns (address);\\n\\n /**\\n * @notice Called during `exec` and before execAddress is called.\\n *\\n * @param taskId Unique hash of the task created.\\n * @param taskCreator The address which created the task.\\n * @param execAddress Address of contract that should be called.\\n * @param execData Execution data to be called with / function selector if execution data is yet to be determined.\\n *\\n * @return address Overriden or original execution address.\\n * @return bytes Overriden or original execution data.\\n */\\n function preExecCall(\\n bytes32 taskId,\\n address taskCreator,\\n address execAddress,\\n bytes calldata execData\\n ) external returns (address, bytes memory);\\n\\n /**\\n * @notice Called during `exec` and after execAddress is called.\\n *\\n * @param taskId Unique hash of the task created.\\n * @param taskCreator The address which created the task.\\n * @param execAddress Address of contract that should be called.\\n * @param execData Execution data to be called with / function selector if execution data is yet to be determined.\\n */\\n function postExecCall(\\n bytes32 taskId,\\n address taskCreator,\\n address execAddress,\\n bytes calldata execData\\n ) external;\\n}\\n\",\"keccak256\":\"0xd537257852c23ce7d0bc392b03aba1efd750be372d64a01edf1c726ef7c4274d\",\"license\":\"MIT\"},\"contracts/libraries/LibDataTypes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.12;\\n\\n// solhint-disable max-line-length\\nlibrary LibDataTypes {\\n /**\\n * @notice Whitelisted modules that are available for users to customise conditions and specifications of their tasks.\\n *\\n * @param RESOLVER Use dynamic condition & input data for execution. {See ResolverModule.sol}\\n * @param DEPRECATED_TIME deprecated\\n * @param PROXY Creates a dedicated caller (msg.sender) to be used when executing the task. {See ProxyModule.sol}\\n * @param SINGLE_EXEC Task is cancelled after one execution. {See SingleExecModule.sol}\\n * @param WEB3_FUNCTION Use off-chain condition & input data for execution. {See Web3FunctionModule.sol}\\n * @param TRIGGER Repeated execution of task ata a specified timing and interval or cron. {See TriggerModule.sol}\\n */\\n enum Module {\\n RESOLVER,\\n DEPRECATED_TIME, // @deprecated\\n PROXY,\\n SINGLE_EXEC,\\n WEB3_FUNCTION,\\n TRIGGER\\n }\\n\\n /**\\n * @notice Struct to contain modules and their relative arguments that are used for task creation.\\n *\\n * @param modules List of selected modules.\\n * @param args Arguments of modules if any. Pass \\\"0x\\\" for modules which does not require args {See encodeModuleArg}\\n */\\n struct ModuleData {\\n Module[] modules;\\n bytes[] args;\\n }\\n\\n /**\\n * @notice Struct for time module.\\n *\\n * @param nextExec Time when the next execution should occur.\\n * @param interval Time interval between each execution.\\n */\\n struct Time {\\n uint128 nextExec;\\n uint128 interval;\\n }\\n\\n /**\\n * @notice Types of trigger\\n *\\n * @param TIME Time triggered tasks, starting at a specific time and triggered intervally\\n * @param CRON Cron triggered tasks, triggered according to the cron conditions\\n */\\n enum TriggerType {\\n TIME,\\n CRON,\\n EVENT,\\n BLOCK\\n }\\n\\n /**\\n * @notice Struct for trigger module\\n *\\n * @param triggerType Type of the trigger\\n * @param triggerConfig Trigger configuration that shuold be parsed according to triggerType\\n */\\n struct TriggerModuleData {\\n TriggerType triggerType;\\n bytes triggerConfig;\\n }\\n}\\n\",\"keccak256\":\"0x7307461a03c5bb31eef8b01b029fd898d45a495349498466c6238a6474c4edc2\",\"license\":\"MIT\"},\"contracts/taskModules/ProxyModule.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\n\\nimport {TaskModuleBase} from \\\"./TaskModuleBase.sol\\\";\\nimport {IOpsProxy} from \\\"../interfaces/IOpsProxy.sol\\\";\\nimport {IOpsProxyFactory} from \\\"../interfaces/IOpsProxyFactory.sol\\\";\\n\\ncontract ProxyModule is TaskModuleBase {\\n IOpsProxyFactory public immutable opsProxyFactory;\\n\\n constructor(IOpsProxyFactory _opsProxyFactory) {\\n opsProxyFactory = _opsProxyFactory;\\n }\\n\\n /**\\n * @inheritdoc TaskModuleBase\\n */\\n function onCreateTask(\\n bytes32,\\n address _taskCreator,\\n address,\\n bytes calldata,\\n bytes calldata\\n ) external override {\\n _deployIfNoProxy(_taskCreator);\\n }\\n\\n /**\\n * @inheritdoc TaskModuleBase\\n * @dev _taskCreator cannot create task to other user's proxy\\n */\\n function preCreateTask(address _taskCreator, address _execAddress)\\n external\\n view\\n override\\n returns (address, address)\\n {\\n address ownerOfExecAddress = opsProxyFactory.ownerOf(_execAddress);\\n\\n if (ownerOfExecAddress != address(0)) {\\n // creating task to proxy\\n require(\\n _taskCreator == ownerOfExecAddress ||\\n _taskCreator == _execAddress,\\n \\\"ProxyModule: Only owner of proxy\\\"\\n );\\n\\n return (ownerOfExecAddress, _execAddress);\\n } else {\\n address ownerOfTaskCreator = opsProxyFactory.ownerOf(_taskCreator);\\n\\n if (ownerOfTaskCreator != address(0)) {\\n // creating task to non proxy, with proxy\\n // give task ownership to proxy owner\\n return (ownerOfTaskCreator, _execAddress);\\n }\\n\\n // creating task to non proxy, without proxy\\n return (_taskCreator, _execAddress);\\n }\\n }\\n\\n function preCancelTask(bytes32, address _taskCreator)\\n external\\n view\\n override\\n returns (address)\\n {\\n address ownerOfTaskCreator = opsProxyFactory.ownerOf(_taskCreator);\\n\\n if (ownerOfTaskCreator != address(0)) {\\n return ownerOfTaskCreator;\\n }\\n\\n return _taskCreator;\\n }\\n\\n /**\\n * @inheritdoc TaskModuleBase\\n * @dev _execData is encoded with proxy's `executeCall` function\\n * unless _execAddress is OpsProxy which assumes that _execData is encoded\\n * with `executeCall` or `batchExecuteCall`.\\n */\\n function preExecCall(\\n bytes32,\\n address _taskCreator,\\n address _execAddress,\\n bytes calldata _execData\\n ) external view override returns (address, bytes memory execData) {\\n (address proxy, ) = opsProxyFactory.getProxyOf(_taskCreator);\\n\\n execData = _execAddress == proxy\\n ? _execData\\n : _encodeWithOpsProxy(_execAddress, _execData);\\n\\n _execAddress = proxy;\\n\\n return (_execAddress, execData);\\n }\\n\\n function _deployIfNoProxy(address _taskCreator) private {\\n bool isTaskCreatorProxy = opsProxyFactory.ownerOf(_taskCreator) !=\\n address(0);\\n\\n if (!isTaskCreatorProxy) {\\n (, bool deployed) = opsProxyFactory.getProxyOf(_taskCreator);\\n if (!deployed) opsProxyFactory.deployFor(_taskCreator);\\n }\\n }\\n\\n function _encodeWithOpsProxy(address _execAddress, bytes calldata _execData)\\n private\\n pure\\n returns (bytes memory)\\n {\\n return\\n abi.encodeWithSelector(\\n IOpsProxy.executeCall.selector,\\n _execAddress,\\n _execData,\\n 0\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe681a040fb7054876217145013a02ba86e73aaf06ec69940a0a7ce80a9c6a657\",\"license\":\"UNLICENSED\"},\"contracts/taskModules/TaskModuleBase.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\n\\nimport {AutomateStorage} from \\\"../AutomateStorage.sol\\\";\\nimport {ITaskModule} from \\\"../interfaces/ITaskModule.sol\\\";\\n\\n// solhint-disable no-empty-blocks\\nabstract contract TaskModuleBase is AutomateStorage, ITaskModule {\\n ///@inheritdoc ITaskModule\\n function preCreateTask(address _taskCreator, address _execAddress)\\n external\\n virtual\\n override\\n returns (address, address)\\n {\\n return (_taskCreator, _execAddress);\\n }\\n\\n ///@inheritdoc ITaskModule\\n function onCreateTask(\\n bytes32,\\n address,\\n address,\\n bytes calldata,\\n bytes calldata\\n ) external virtual override {}\\n\\n ///@inheritdoc ITaskModule\\n function preCancelTask(bytes32, address _taskCreator)\\n external\\n virtual\\n override\\n returns (address)\\n {\\n return _taskCreator;\\n }\\n\\n ///@inheritdoc ITaskModule\\n function preExecCall(\\n bytes32,\\n address,\\n address _execAddress,\\n bytes calldata _execData\\n ) external virtual override returns (address, bytes memory) {\\n return (_execAddress, _execData);\\n }\\n\\n ///@inheritdoc ITaskModule\\n function postExecCall(\\n bytes32 taskId,\\n address taskCreator,\\n address execAddress,\\n bytes calldata execData\\n ) external virtual override {}\\n}\\n\",\"keccak256\":\"0x231bcf0d6af7d2e0f96eb4eb83285fe0ea0d64d3aa937c6af29779cf653af695\",\"license\":\"UNLICENSED\"}},\"version\":1}", "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001508380380620015088339818101604052810190620000379190620000f0565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000122565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000a48262000077565b9050919050565b6000620000b88262000097565b9050919050565b620000ca81620000ab565b8114620000d657600080fd5b50565b600081519050620000ea81620000bf565b92915050565b60006020828403121562000109576200010862000072565b5b60006200011984828501620000d9565b91505092915050565b6080516113996200016f600039600081816102ee01528181610463015281816105e50152818161075f0152818161078901528181610913015281816109ce0152610a6f01526113996000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063b0ccbdf01161008c578063ba1d0ff411610066578063ba1d0ff41461024c578063c10304f71461026a578063cd3d4fb91461029b578063ddca3f43146102cb576100cf565b8063b0ccbdf0146101e3578063b2db0b41146101ff578063b81cd8661461021b576100cf565b806314ae9926146100d45780632e6e0bd014610104578063647846a5146101345780636d2dd29f1461015257806376474e6a14610182578063ac21631a146101b3575b600080fd5b6100ee60048036038101906100e99190610c37565b6102e9565b6040516100fb9190610c86565b60405180910390f35b61011e60048036038101906101199190610ca1565b6103d0565b60405161012b9190610c86565b60405180910390f35b61013c610403565b6040516101499190610c86565b60405180910390f35b61016c60048036038101906101679190610ca1565b610429565b6040516101799190610c86565b60405180910390f35b61019c60048036038101906101979190610cce565b61045c565b6040516101aa929190610d0e565b60405180910390f35b6101cd60048036038101906101c89190610ca1565b6106d0565b6040516101da9190610d50565b60405180910390f35b6101fd60048036038101906101f89190610dd0565b6106e8565b005b61021960048036038101906102149190610e8c565b6106fa565b005b61023560048036038101906102309190610ca1565b610701565b604051610243929190610f3f565b60405180910390f35b61025461075d565b6040516102619190610fc7565b60405180910390f35b610284600480360381019061027f9190610e8c565b610781565b60405161029292919061107b565b60405180910390f35b6102b560048036038101906102b091906110d0565b6108bf565b6040516102c29190610c86565b60405180910390f35b6102d36108f2565b6040516102e09190610d50565b60405180910390f35b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016103459190610c86565b602060405180830381865afa158015610362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103869190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103c557809150506103ca565b829150505b92915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e856040518263ffffffff1660e01b81526004016104ba9190610c86565b602060405180830381865afa1580156104d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fb9190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105e1578073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061059657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b6105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc9061119c565b60405180910390fd5b808492509250506106c9565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e876040518263ffffffff1660e01b815260040161063c9190610c86565b602060405180830381865afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067d9190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106c05780859350935050506106c9565b85859350935050505b9250929050565b60076020528060005260406000206000915090505481565b6106f1866108f8565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c886040518263ffffffff1660e01b81526004016107e09190610c86565b6040805180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082091906111f4565b5090508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461086657610861868686610b11565b6108ac565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050505b9150809550859250509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60008073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b815260040161096a9190610c86565b602060405180830381865afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190611112565b73ffffffffffffffffffffffffffffffffffffffff161415905080610b0d5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c846040518263ffffffff1660e01b8152600401610a259190610c86565b6040805180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6591906111f4565b91505080610b0b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166374912cd2846040518263ffffffff1660e01b8152600401610ac69190610c86565b6020604051808303816000875af1158015610ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b099190611272565b505b505b5050565b60606354132d7860e01b8484846000604051602401610b339493929190611323565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b600080fd5b600080fd5b6000819050919050565b610bb681610ba3565b8114610bc157600080fd5b50565b600081359050610bd381610bad565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c0482610bd9565b9050919050565b610c1481610bf9565b8114610c1f57600080fd5b50565b600081359050610c3181610c0b565b92915050565b60008060408385031215610c4e57610c4d610b99565b5b6000610c5c85828601610bc4565b9250506020610c6d85828601610c22565b9150509250929050565b610c8081610bf9565b82525050565b6000602082019050610c9b6000830184610c77565b92915050565b600060208284031215610cb757610cb6610b99565b5b6000610cc584828501610bc4565b91505092915050565b60008060408385031215610ce557610ce4610b99565b5b6000610cf385828601610c22565b9250506020610d0485828601610c22565b9150509250929050565b6000604082019050610d236000830185610c77565b610d306020830184610c77565b9392505050565b6000819050919050565b610d4a81610d37565b82525050565b6000602082019050610d656000830184610d41565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610d9057610d8f610d6b565b5b8235905067ffffffffffffffff811115610dad57610dac610d70565b5b602083019150836001820283011115610dc957610dc8610d75565b5b9250929050565b600080600080600080600060a0888a031215610def57610dee610b99565b5b6000610dfd8a828b01610bc4565b9750506020610e0e8a828b01610c22565b9650506040610e1f8a828b01610c22565b955050606088013567ffffffffffffffff811115610e4057610e3f610b9e565b5b610e4c8a828b01610d7a565b9450945050608088013567ffffffffffffffff811115610e6f57610e6e610b9e565b5b610e7b8a828b01610d7a565b925092505092959891949750929550565b600080600080600060808688031215610ea857610ea7610b99565b5b6000610eb688828901610bc4565b9550506020610ec788828901610c22565b9450506040610ed888828901610c22565b935050606086013567ffffffffffffffff811115610ef957610ef8610b9e565b5b610f0588828901610d7a565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610f3981610f14565b82525050565b6000604082019050610f546000830185610f30565b610f616020830184610f30565b9392505050565b6000819050919050565b6000610f8d610f88610f8384610bd9565b610f68565b610bd9565b9050919050565b6000610f9f82610f72565b9050919050565b6000610fb182610f94565b9050919050565b610fc181610fa6565b82525050565b6000602082019050610fdc6000830184610fb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561101c578082015181840152602081019050611001565b8381111561102b576000848401525b50505050565b6000601f19601f8301169050919050565b600061104d82610fe2565b6110578185610fed565b9350611067818560208601610ffe565b61107081611031565b840191505092915050565b60006040820190506110906000830185610c77565b81810360208301526110a28184611042565b90509392505050565b600681106110b857600080fd5b50565b6000813590506110ca816110ab565b92915050565b6000602082840312156110e6576110e5610b99565b5b60006110f4848285016110bb565b91505092915050565b60008151905061110c81610c0b565b92915050565b60006020828403121561112857611127610b99565b5b6000611136848285016110fd565b91505092915050565b600082825260208201905092915050565b7f50726f78794d6f64756c653a204f6e6c79206f776e6572206f662070726f7879600082015250565b600061118660208361113f565b915061119182611150565b602082019050919050565b600060208201905081810360008301526111b581611179565b9050919050565b60008115159050919050565b6111d1816111bc565b81146111dc57600080fd5b50565b6000815190506111ee816111c8565b92915050565b6000806040838503121561120b5761120a610b99565b5b6000611219858286016110fd565b925050602061122a858286016111df565b9150509250929050565b600061123f82610bd9565b9050919050565b61124f81611234565b811461125a57600080fd5b50565b60008151905061126c81611246565b92915050565b60006020828403121561128857611287610b99565b5b60006112968482850161125d565b91505092915050565b82818337600083830152505050565b60006112ba8385610fed565b93506112c783858461129f565b6112d083611031565b840190509392505050565b6000819050919050565b600060ff82169050919050565b600061130d611308611303846112db565b610f68565b6112e5565b9050919050565b61131d816112f2565b82525050565b60006060820190506113386000830187610c77565b818103602083015261134b8185876112ae565b905061135a6040830184611314565b9594505050505056fea26469706673582212202c637e56ec4c2d97f4765f89cd20f240d157d5e76acfc6ec202285fcdf2f135864736f6c634300080e0033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063b0ccbdf01161008c578063ba1d0ff411610066578063ba1d0ff41461024c578063c10304f71461026a578063cd3d4fb91461029b578063ddca3f43146102cb576100cf565b8063b0ccbdf0146101e3578063b2db0b41146101ff578063b81cd8661461021b576100cf565b806314ae9926146100d45780632e6e0bd014610104578063647846a5146101345780636d2dd29f1461015257806376474e6a14610182578063ac21631a146101b3575b600080fd5b6100ee60048036038101906100e99190610c37565b6102e9565b6040516100fb9190610c86565b60405180910390f35b61011e60048036038101906101199190610ca1565b6103d0565b60405161012b9190610c86565b60405180910390f35b61013c610403565b6040516101499190610c86565b60405180910390f35b61016c60048036038101906101679190610ca1565b610429565b6040516101799190610c86565b60405180910390f35b61019c60048036038101906101979190610cce565b61045c565b6040516101aa929190610d0e565b60405180910390f35b6101cd60048036038101906101c89190610ca1565b6106d0565b6040516101da9190610d50565b60405180910390f35b6101fd60048036038101906101f89190610dd0565b6106e8565b005b61021960048036038101906102149190610e8c565b6106fa565b005b61023560048036038101906102309190610ca1565b610701565b604051610243929190610f3f565b60405180910390f35b61025461075d565b6040516102619190610fc7565b60405180910390f35b610284600480360381019061027f9190610e8c565b610781565b60405161029292919061107b565b60405180910390f35b6102b560048036038101906102b091906110d0565b6108bf565b6040516102c29190610c86565b60405180910390f35b6102d36108f2565b6040516102e09190610d50565b60405180910390f35b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016103459190610c86565b602060405180830381865afa158015610362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103869190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103c557809150506103ca565b829150505b92915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e856040518263ffffffff1660e01b81526004016104ba9190610c86565b602060405180830381865afa1580156104d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fb9190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105e1578073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061059657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b6105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc9061119c565b60405180910390fd5b808492509250506106c9565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e876040518263ffffffff1660e01b815260040161063c9190610c86565b602060405180830381865afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067d9190611112565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106c05780859350935050506106c9565b85859350935050505b9250929050565b60076020528060005260406000206000915090505481565b6106f1866108f8565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c886040518263ffffffff1660e01b81526004016107e09190610c86565b6040805180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082091906111f4565b5090508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461086657610861868686610b11565b6108ac565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050505b9150809550859250509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60008073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b815260040161096a9190610c86565b602060405180830381865afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190611112565b73ffffffffffffffffffffffffffffffffffffffff161415905080610b0d5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c846040518263ffffffff1660e01b8152600401610a259190610c86565b6040805180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6591906111f4565b91505080610b0b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166374912cd2846040518263ffffffff1660e01b8152600401610ac69190610c86565b6020604051808303816000875af1158015610ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b099190611272565b505b505b5050565b60606354132d7860e01b8484846000604051602401610b339493929190611323565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b600080fd5b600080fd5b6000819050919050565b610bb681610ba3565b8114610bc157600080fd5b50565b600081359050610bd381610bad565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c0482610bd9565b9050919050565b610c1481610bf9565b8114610c1f57600080fd5b50565b600081359050610c3181610c0b565b92915050565b60008060408385031215610c4e57610c4d610b99565b5b6000610c5c85828601610bc4565b9250506020610c6d85828601610c22565b9150509250929050565b610c8081610bf9565b82525050565b6000602082019050610c9b6000830184610c77565b92915050565b600060208284031215610cb757610cb6610b99565b5b6000610cc584828501610bc4565b91505092915050565b60008060408385031215610ce557610ce4610b99565b5b6000610cf385828601610c22565b9250506020610d0485828601610c22565b9150509250929050565b6000604082019050610d236000830185610c77565b610d306020830184610c77565b9392505050565b6000819050919050565b610d4a81610d37565b82525050565b6000602082019050610d656000830184610d41565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610d9057610d8f610d6b565b5b8235905067ffffffffffffffff811115610dad57610dac610d70565b5b602083019150836001820283011115610dc957610dc8610d75565b5b9250929050565b600080600080600080600060a0888a031215610def57610dee610b99565b5b6000610dfd8a828b01610bc4565b9750506020610e0e8a828b01610c22565b9650506040610e1f8a828b01610c22565b955050606088013567ffffffffffffffff811115610e4057610e3f610b9e565b5b610e4c8a828b01610d7a565b9450945050608088013567ffffffffffffffff811115610e6f57610e6e610b9e565b5b610e7b8a828b01610d7a565b925092505092959891949750929550565b600080600080600060808688031215610ea857610ea7610b99565b5b6000610eb688828901610bc4565b9550506020610ec788828901610c22565b9450506040610ed888828901610c22565b935050606086013567ffffffffffffffff811115610ef957610ef8610b9e565b5b610f0588828901610d7a565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610f3981610f14565b82525050565b6000604082019050610f546000830185610f30565b610f616020830184610f30565b9392505050565b6000819050919050565b6000610f8d610f88610f8384610bd9565b610f68565b610bd9565b9050919050565b6000610f9f82610f72565b9050919050565b6000610fb182610f94565b9050919050565b610fc181610fa6565b82525050565b6000602082019050610fdc6000830184610fb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561101c578082015181840152602081019050611001565b8381111561102b576000848401525b50505050565b6000601f19601f8301169050919050565b600061104d82610fe2565b6110578185610fed565b9350611067818560208601610ffe565b61107081611031565b840191505092915050565b60006040820190506110906000830185610c77565b81810360208301526110a28184611042565b90509392505050565b600681106110b857600080fd5b50565b6000813590506110ca816110ab565b92915050565b6000602082840312156110e6576110e5610b99565b5b60006110f4848285016110bb565b91505092915050565b60008151905061110c81610c0b565b92915050565b60006020828403121561112857611127610b99565b5b6000611136848285016110fd565b91505092915050565b600082825260208201905092915050565b7f50726f78794d6f64756c653a204f6e6c79206f776e6572206f662070726f7879600082015250565b600061118660208361113f565b915061119182611150565b602082019050919050565b600060208201905081810360008301526111b581611179565b9050919050565b60008115159050919050565b6111d1816111bc565b81146111dc57600080fd5b50565b6000815190506111ee816111c8565b92915050565b6000806040838503121561120b5761120a610b99565b5b6000611219858286016110fd565b925050602061122a858286016111df565b9150509250929050565b600061123f82610bd9565b9050919050565b61124f81611234565b811461125a57600080fd5b50565b60008151905061126c81611246565b92915050565b60006020828403121561128857611287610b99565b5b60006112968482850161125d565b91505092915050565b82818337600083830152505050565b60006112ba8385610fed565b93506112c783858461129f565b6112d083611031565b840190509392505050565b6000819050919050565b600060ff82169050919050565b600061130d611308611303846112db565b610f68565b6112e5565b9050919050565b61131d816112f2565b82525050565b60006060820190506113386000830187610c77565b818103602083015261134b8185876112ae565b905061135a6040830184611314565b9594505050505056fea26469706673582212202c637e56ec4c2d97f4765f89cd20f240d157d5e76acfc6ec202285fcdf2f135864736f6c634300080e0033", "devdoc": { "kind": "dev", "methods": { "onCreateTask(bytes32,address,address,bytes,bytes)": { "params": { "execAddress": "Address of contract that should be called.", "execData": "Execution data to be called with / function selector if execution data is yet to be determined.", "initModuleArg": "Encoded arguments for module if any.", "taskCreator": "The address which created the task.", "taskId": "Unique hash of the task created." } }, "postExecCall(bytes32,address,address,bytes)": { "params": { "execAddress": "Address of contract that should be called.", "execData": "Execution data to be called with / function selector if execution data is yet to be determined.", "taskCreator": "The address which created the task.", "taskId": "Unique hash of the task created." } }, "preCancelTask(bytes32,address)": { "details": "Modules can override taskCreator.", "params": { "taskCreator": "The address which created the task.", "taskId": "Unique hash of the task created." }, "returns": { "_0": "address Overriden or original taskCreator." } }, "preCreateTask(address,address)": { "details": "_taskCreator cannot create task to other user's proxy", "params": { "execAddress": "Address of contract that should be called.", "taskCreator": "The address which created the task." }, "returns": { "_0": "address Overriden or original taskCreator.", "_1": "address Overriden or original execAddress." } }, "preExecCall(bytes32,address,address,bytes)": { "details": "_execData is encoded with proxy's `executeCall` function unless _execAddress is OpsProxy which assumes that _execData is encoded with `executeCall` or `batchExecuteCall`.", "params": { "execAddress": "Address of contract that should be called.", "execData": "Execution data to be called with / function selector if execution data is yet to be determined.", "taskCreator": "The address which created the task.", "taskId": "Unique hash of the task created." }, "returns": { "_0": "address Overriden or original execution address.", "execData": "bytes Overriden or original execution data." } } }, "version": 1 }, "userdoc": { "kind": "user", "methods": { "onCreateTask(bytes32,address,address,bytes,bytes)": { "notice": "Initiates task module whenever `createTask` is being called." }, "postExecCall(bytes32,address,address,bytes)": { "notice": "Called during `exec` and after execAddress is called." }, "preCancelTask(bytes32,address)": { "notice": "Called before taskId is removed from _createdTasks[]." }, "preCreateTask(address,address)": { "notice": "Called before generating taskId." }, "preExecCall(bytes32,address,address,bytes)": { "notice": "Called during `exec` and before execAddress is called." } }, "version": 1 }, "storageLayout": { "storage": [ { "astId": 2271, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "taskCreator", "offset": 0, "slot": "0", "type": "t_mapping(t_bytes32,t_address)" }, { "astId": 2276, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "execAddresses", "offset": 0, "slot": "1", "type": "t_mapping(t_bytes32,t_address)" }, { "astId": 2282, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "_createdTasks", "offset": 0, "slot": "2", "type": "t_mapping(t_address,t_struct(Bytes32Set)1247_storage)" }, { "astId": 2284, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "fee", "offset": 0, "slot": "3", "type": "t_uint256" }, { "astId": 2286, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "feeToken", "offset": 0, "slot": "4", "type": "t_address" }, { "astId": 2292, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "timedTask", "offset": 0, "slot": "5", "type": "t_mapping(t_bytes32,t_struct(Time)5500_storage)" }, { "astId": 2298, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "taskModuleAddresses", "offset": 0, "slot": "6", "type": "t_mapping(t_enum(Module)5487,t_address)" }, { "astId": 2302, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "nonce1Balance", "offset": 0, "slot": "7", "type": "t_mapping(t_bytes32,t_uint256)" } ], "types": { "t_address": { "encoding": "inplace", "label": "address", "numberOfBytes": "20" }, "t_array(t_bytes32)dyn_storage": { "base": "t_bytes32", "encoding": "dynamic_array", "label": "bytes32[]", "numberOfBytes": "32" }, "t_bytes32": { "encoding": "inplace", "label": "bytes32", "numberOfBytes": "32" }, "t_enum(Module)5487": { "encoding": "inplace", "label": "enum LibDataTypes.Module", "numberOfBytes": "1" }, "t_mapping(t_address,t_struct(Bytes32Set)1247_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct EnumerableSet.Bytes32Set)", "numberOfBytes": "32", "value": "t_struct(Bytes32Set)1247_storage" }, "t_mapping(t_bytes32,t_address)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => address)", "numberOfBytes": "32", "value": "t_address" }, "t_mapping(t_bytes32,t_struct(Time)5500_storage)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => struct LibDataTypes.Time)", "numberOfBytes": "32", "value": "t_struct(Time)5500_storage" }, "t_mapping(t_bytes32,t_uint256)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32", "value": "t_uint256" }, "t_mapping(t_enum(Module)5487,t_address)": { "encoding": "mapping", "key": "t_enum(Module)5487", "label": "mapping(enum LibDataTypes.Module => address)", "numberOfBytes": "32", "value": "t_address" }, "t_struct(Bytes32Set)1247_storage": { "encoding": "inplace", "label": "struct EnumerableSet.Bytes32Set", "members": [ { "astId": 1246, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "_inner", "offset": 0, "slot": "0", "type": "t_struct(Set)1053_storage" } ], "numberOfBytes": "64" }, "t_struct(Set)1053_storage": { "encoding": "inplace", "label": "struct EnumerableSet.Set", "members": [ { "astId": 1048, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "_values", "offset": 0, "slot": "0", "type": "t_array(t_bytes32)dyn_storage" }, { "astId": 1052, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "_indexes", "offset": 0, "slot": "1", "type": "t_mapping(t_bytes32,t_uint256)" } ], "numberOfBytes": "64" }, "t_struct(Time)5500_storage": { "encoding": "inplace", "label": "struct LibDataTypes.Time", "members": [ { "astId": 5497, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "nextExec", "offset": 0, "slot": "0", "type": "t_uint128" }, { "astId": 5499, "contract": "contracts/taskModules/ProxyModule.sol:ProxyModule", "label": "interval", "offset": 16, "slot": "0", "type": "t_uint128" } ], "numberOfBytes": "32" }, "t_uint128": { "encoding": "inplace", "label": "uint128", "numberOfBytes": "16" }, "t_uint256": { "encoding": "inplace", "label": "uint256", "numberOfBytes": "32" } } } }