Source Code
Overview
GLMR Balance
GLMR Value
$0.00View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ProxyModule
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;
import {TaskModuleBase} from "./TaskModuleBase.sol";
import {IOpsProxy} from "../interfaces/IOpsProxy.sol";
import {IOpsProxyFactory} from "../interfaces/IOpsProxyFactory.sol";
contract ProxyModule is TaskModuleBase {
IOpsProxyFactory public immutable opsProxyFactory;
constructor(IOpsProxyFactory _opsProxyFactory) {
opsProxyFactory = _opsProxyFactory;
}
/**
* @inheritdoc TaskModuleBase
*/
function onCreateTask(
bytes32,
address _taskCreator,
address,
bytes calldata,
bytes calldata
) external override {
_deployIfNoProxy(_taskCreator);
}
/**
* @inheritdoc TaskModuleBase
* @dev _taskCreator cannot create task to other user's proxy
*/
function preCreateTask(address _taskCreator, address _execAddress)
external
view
override
returns (address, address)
{
address ownerOfExecAddress = opsProxyFactory.ownerOf(_execAddress);
if (ownerOfExecAddress != address(0)) {
// creating task to proxy
require(
_taskCreator == ownerOfExecAddress ||
_taskCreator == _execAddress,
"ProxyModule: Only owner of proxy"
);
return (ownerOfExecAddress, _execAddress);
} else {
address ownerOfTaskCreator = opsProxyFactory.ownerOf(_taskCreator);
if (ownerOfTaskCreator != address(0)) {
// creating task to non proxy, with proxy
// give task ownership to proxy owner
return (ownerOfTaskCreator, _execAddress);
}
// creating task to non proxy, without proxy
return (_taskCreator, _execAddress);
}
}
function preCancelTask(bytes32, address _taskCreator)
external
view
override
returns (address)
{
address ownerOfTaskCreator = opsProxyFactory.ownerOf(_taskCreator);
if (ownerOfTaskCreator != address(0)) {
return ownerOfTaskCreator;
}
return _taskCreator;
}
/**
* @inheritdoc TaskModuleBase
* @dev _execData is encoded with proxy's `executeCall` function
* unless _execAddress is OpsProxy which assumes that _execData is encoded
* with `executeCall` or `batchExecuteCall`.
*/
function preExecCall(
bytes32,
address _taskCreator,
address _execAddress,
bytes calldata _execData
) external view override returns (address, bytes memory execData) {
(address proxy, ) = opsProxyFactory.getProxyOf(_taskCreator);
execData = _execAddress == proxy
? _execData
: _encodeWithOpsProxy(_execAddress, _execData);
_execAddress = proxy;
return (_execAddress, execData);
}
function _deployIfNoProxy(address _taskCreator) private {
bool isTaskCreatorProxy = opsProxyFactory.ownerOf(_taskCreator) !=
address(0);
if (!isTaskCreatorProxy) {
(, bool deployed) = opsProxyFactory.getProxyOf(_taskCreator);
if (!deployed) opsProxyFactory.deployFor(_taskCreator);
}
}
function _encodeWithOpsProxy(address _execAddress, bytes calldata _execData)
private
pure
returns (bytes memory)
{
return
abi.encodeWithSelector(
IOpsProxy.executeCall.selector,
_execAddress,
_execData,
0
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;
import {
EnumerableSet
} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {LibDataTypes} from "./libraries/LibDataTypes.sol";
/**
* @notice Storage layout of Ops smart contract.
*/
// solhint-disable max-states-count
abstract contract OpsStorage {
mapping(bytes32 => address) public taskCreator; ///@dev Deprecated
mapping(bytes32 => address) public execAddresses; ///@dev Deprecated
mapping(address => EnumerableSet.Bytes32Set) internal _createdTasks;
uint256 public fee;
address public feeToken;
///@dev Appended State
mapping(bytes32 => LibDataTypes.Time) public timedTask;
mapping(LibDataTypes.Module => address) public taskModuleAddresses;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
interface IOpsProxy {
/**
* @notice Emitted when proxy calls a contract successfully in `executeCall`
*
* @param target Address of contract that is called
* @param data Data used in the call.
* @param value Native token value used in the call.
* @param returnData Data returned by the call.
*/
event ExecuteCall(
address indexed target,
bytes data,
uint256 value,
bytes returnData
);
/**
* @notice Multicall to different contracts with different datas.
*
* @param targets Addresses of contracts to be called.
* @param datas Datas for each contract call.
* @param values Native token value for each contract call.
*/
function batchExecuteCall(
address[] calldata targets,
bytes[] calldata datas,
uint256[] calldata values
) external payable;
/**
* @notice Call to a single contract.
*
* @param target Address of contracts to be called.
* @param data Data for contract call.
* @param value Native token value for contract call.
*/
function executeCall(
address target,
bytes calldata data,
uint256 value
) external payable;
/**
* @return address Ops smart contract address
*/
function ops() external view returns (address);
/**
* @return address Owner of the proxy
*/
function owner() external view returns (address);
/**
* @return uint256 version of OpsProxy.
*/
function version() external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
interface IOpsProxyFactory {
/**
* @notice Emitted when an OpsProxy is deployed.
*
* @param deployer Address which initiated the deployment
* @param owner The address which the proxy is for.
* @param proxy Address of deployed proxy.
*/
event DeployProxy(
address indexed deployer,
address indexed owner,
address indexed proxy
);
/**
* @notice Emitted when OpsProxy implementation to be deployed is changed.
*
* @param oldImplementation Previous OpsProxy implementation.
* @param newImplementation Current OpsProxy implementation.
*/
event SetImplementation(
address indexed oldImplementation,
address indexed newImplementation
);
/**
* @notice Emitted when OpsProxy implementation is added or removed from whitelist.
*
* @param implementation OpsProxy implementation.
* @param whitelisted Added or removed from whitelist.
*/
event UpdateWhitelistedImplementation(
address indexed implementation,
bool indexed whitelisted
);
/**
* @notice Deploys OpsProxy for the msg.sender.
*
* @return proxy Address of deployed proxy.
*/
function deploy() external returns (address payable proxy);
/**
* @notice Deploys OpsProxy for another address.
*
* @param owner Address to deploy the proxy for.
*
* @return proxy Address of deployed proxy.
*/
function deployFor(address owner) external returns (address payable proxy);
/**
* @notice Sets the OpsProxy implementation that will be deployed by OpsProxyFactory.
*
* @param newImplementation New implementation to be set.
*/
function setImplementation(address newImplementation) external;
/**
* @notice Add or remove OpsProxy implementation from the whitelist.
*
* @param implementation OpsProxy implementation.
* @param whitelist Added or removed from whitelist.
*/
function updateWhitelistedImplementations(
address implementation,
bool whitelist
) external;
/**
* @notice Determines the OpsProxy address when it is not deployed.
*
* @param account Address to determine the proxy address for.
*/
function determineProxyAddress(address account)
external
view
returns (address);
/**
* @return address Proxy address owned by account.
* @return bool Whether if proxy is deployed
*/
function getProxyOf(address account) external view returns (address, bool);
/**
* @return address Owner of deployed proxy.
*/
function ownerOf(address proxy) external view returns (address);
/**
* @return bool Whether if implementation is whitelisted.
*/
function whitelistedImplementations(address implementation)
external
view
returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
// solhint-disable max-line-length
interface ITaskModule {
/**
* @notice Called before generating taskId.
* @dev Modules can override execAddress or taskCreator. {See ProxyModule-preCreateTask}
*
* @param taskCreator The address which created the task.
* @param execAddress Address of contract that should be called.
*
* @return address Overriden or original taskCreator.
* @return address Overriden or original execAddress.
*/
function preCreateTask(address taskCreator, address execAddress)
external
returns (address, address);
/**
* @notice Initiates task module whenever `createTask` is being called.
*
* @param taskId Unique hash of the task created.
* @param taskCreator The address which created the task.
* @param execAddress Address of contract that should be called.
* @param execData Execution data to be called with / function selector if execution data is yet to be determined.
* @param initModuleArg Encoded arguments for module if any.
*/
function onCreateTask(
bytes32 taskId,
address taskCreator,
address execAddress,
bytes calldata execData,
bytes calldata initModuleArg
) external;
/**
* @notice Called before taskId is removed from _createdTasks[].
* @dev Modules can override taskCreator.
*
* @param taskId Unique hash of the task created.
* @param taskCreator The address which created the task.
*
* @return address Overriden or original taskCreator.
*/
function preCancelTask(bytes32 taskId, address taskCreator)
external
returns (address);
/**
* @notice Called during `exec` and before execAddress is called.
*
* @param taskId Unique hash of the task created.
* @param taskCreator The address which created the task.
* @param execAddress Address of contract that should be called.
* @param execData Execution data to be called with / function selector if execution data is yet to be determined.
*
* @return address Overriden or original execution address.
* @return bytes Overriden or original execution data.
*/
function preExecCall(
bytes32 taskId,
address taskCreator,
address execAddress,
bytes calldata execData
) external returns (address, bytes memory);
/**
* @notice Called during `exec` and after execAddress is called.
*
* @param taskId Unique hash of the task created.
* @param taskCreator The address which created the task.
* @param execAddress Address of contract that should be called.
* @param execData Execution data to be called with / function selector if execution data is yet to be determined.
*/
function postExecCall(
bytes32 taskId,
address taskCreator,
address execAddress,
bytes calldata execData
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
// solhint-disable max-line-length
library LibDataTypes {
/**
* @notice Whitelisted modules that are available for users to customise conditions and specifications of their tasks.
*
* @param RESOLVER Use dynamic condition & input data for execution. {See ResolverModule.sol}
* @param TIME Repeated execution of task at a specified timing and interval. {See TimeModule.sol}
* @param PROXY Creates a dedicated caller (msg.sender) to be used when executing the task. {See ProxyModule.sol}
* @param SINGLE_EXEC Task is cancelled after one execution. {See SingleExecModule.sol}
*/
enum Module {
RESOLVER,
TIME,
PROXY,
SINGLE_EXEC
}
/**
* @notice Struct to contain modules and their relative arguments that are used for task creation.
*
* @param modules List of selected modules.
* @param args Arguments of modules if any. Pass "0x" for modules which does not require args {See encodeModuleArg}
*/
struct ModuleData {
Module[] modules;
bytes[] args;
}
/**
* @notice Struct for time module.
*
* @param nextExec Time when the next execution should occur.
* @param interval Time interval between each execution.
*/
struct Time {
uint128 nextExec;
uint128 interval;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;
import {OpsStorage} from "../OpsStorage.sol";
import {ITaskModule} from "../interfaces/ITaskModule.sol";
// solhint-disable no-empty-blocks
abstract contract TaskModuleBase is OpsStorage, ITaskModule {
///@inheritdoc ITaskModule
function preCreateTask(address _taskCreator, address _execAddress)
external
virtual
override
returns (address, address)
{
return (_taskCreator, _execAddress);
}
///@inheritdoc ITaskModule
function onCreateTask(
bytes32,
address,
address,
bytes calldata,
bytes calldata
) external virtual override {}
///@inheritdoc ITaskModule
function preCancelTask(bytes32, address _taskCreator)
external
virtual
override
returns (address)
{
return _taskCreator;
}
///@inheritdoc ITaskModule
function preExecCall(
bytes32,
address,
address _execAddress,
bytes calldata _execData
) external virtual override returns (address, bytes memory) {
return (_execAddress, _execData);
}
///@inheritdoc ITaskModule
function postExecCall(
bytes32 taskId,
address taskCreator,
address execAddress,
bytes calldata execData
) external virtual override {}
}{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"},{"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"}]Contract Creation Code
60a06040523480156200001157600080fd5b50604051620014a5380380620014a58339818101604052810190620000379190620000f0565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000122565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000a48262000077565b9050919050565b6000620000b88262000097565b9050919050565b620000ca81620000ab565b8114620000d657600080fd5b50565b600081519050620000ea81620000bf565b92915050565b60006020828403121562000109576200010862000072565b5b60006200011984828501620000d9565b91505092915050565b6080516113366200016f600039600081816102a3015281816104180152818161059a015281816106fc01528181610726015281816108b00152818161096b0152610a0c01526113366000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b2db0b4111610071578063b2db0b41146101b4578063b81cd866146101d0578063ba1d0ff414610201578063c10304f71461021f578063cd3d4fb914610250578063ddca3f4314610280576100b4565b806314ae9926146100b95780632e6e0bd0146100e9578063647846a5146101195780636d2dd29f1461013757806376474e6a14610167578063b0ccbdf014610198575b600080fd5b6100d360048036038101906100ce9190610bd4565b61029e565b6040516100e09190610c23565b60405180910390f35b61010360048036038101906100fe9190610c3e565b610385565b6040516101109190610c23565b60405180910390f35b6101216103b8565b60405161012e9190610c23565b60405180910390f35b610151600480360381019061014c9190610c3e565b6103de565b60405161015e9190610c23565b60405180910390f35b610181600480360381019061017c9190610c6b565b610411565b60405161018f929190610cab565b60405180910390f35b6101b260048036038101906101ad9190610d39565b610685565b005b6101ce60048036038101906101c99190610df5565b610697565b005b6101ea60048036038101906101e59190610c3e565b61069e565b6040516101f8929190610ea8565b60405180910390f35b6102096106fa565b6040516102169190610f30565b60405180910390f35b61023960048036038101906102349190610df5565b61071e565b604051610247929190610fe4565b60405180910390f35b61026a60048036038101906102659190611039565b61085c565b6040516102779190610c23565b60405180910390f35b61028861088f565b604051610295919061107f565b60405180910390f35b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016102fa9190610c23565b602060405180830381865afa158015610317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033b91906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461037a578091505061037f565b829150505b92915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e856040518263ffffffff1660e01b815260040161046f9190610c23565b602060405180830381865afa15801561048c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b091906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610596578073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061054b57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b61058a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058190611139565b60405180910390fd5b8084925092505061067e565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e876040518263ffffffff1660e01b81526004016105f19190610c23565b602060405180830381865afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063291906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067557808593509350505061067e565b85859350935050505b9250929050565b61068e86610895565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c886040518263ffffffff1660e01b815260040161077d9190610c23565b6040805180830381865afa158015610799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bd9190611191565b5090508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610803576107fe868686610aae565b610849565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050505b9150809550859250509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60008073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016109079190610c23565b602060405180830381865afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094891906110af565b73ffffffffffffffffffffffffffffffffffffffff161415905080610aaa5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ded89a7c846040518263ffffffff1660e01b81526004016109c29190610c23565b6040805180830381865afa1580156109de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a029190611191565b91505080610aa8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166374912cd2846040518263ffffffff1660e01b8152600401610a639190610c23565b6020604051808303816000875af1158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061120f565b505b505b5050565b60606354132d7860e01b8484846000604051602401610ad094939291906112c0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b600080fd5b600080fd5b6000819050919050565b610b5381610b40565b8114610b5e57600080fd5b50565b600081359050610b7081610b4a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ba182610b76565b9050919050565b610bb181610b96565b8114610bbc57600080fd5b50565b600081359050610bce81610ba8565b92915050565b60008060408385031215610beb57610bea610b36565b5b6000610bf985828601610b61565b9250506020610c0a85828601610bbf565b9150509250929050565b610c1d81610b96565b82525050565b6000602082019050610c386000830184610c14565b92915050565b600060208284031215610c5457610c53610b36565b5b6000610c6284828501610b61565b91505092915050565b60008060408385031215610c8257610c81610b36565b5b6000610c9085828601610bbf565b9250506020610ca185828601610bbf565b9150509250929050565b6000604082019050610cc06000830185610c14565b610ccd6020830184610c14565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112610cf957610cf8610cd4565b5b8235905067ffffffffffffffff811115610d1657610d15610cd9565b5b602083019150836001820283011115610d3257610d31610cde565b5b9250929050565b600080600080600080600060a0888a031215610d5857610d57610b36565b5b6000610d668a828b01610b61565b9750506020610d778a828b01610bbf565b9650506040610d888a828b01610bbf565b955050606088013567ffffffffffffffff811115610da957610da8610b3b565b5b610db58a828b01610ce3565b9450945050608088013567ffffffffffffffff811115610dd857610dd7610b3b565b5b610de48a828b01610ce3565b925092505092959891949750929550565b600080600080600060808688031215610e1157610e10610b36565b5b6000610e1f88828901610b61565b9550506020610e3088828901610bbf565b9450506040610e4188828901610bbf565b935050606086013567ffffffffffffffff811115610e6257610e61610b3b565b5b610e6e88828901610ce3565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610ea281610e7d565b82525050565b6000604082019050610ebd6000830185610e99565b610eca6020830184610e99565b9392505050565b6000819050919050565b6000610ef6610ef1610eec84610b76565b610ed1565b610b76565b9050919050565b6000610f0882610edb565b9050919050565b6000610f1a82610efd565b9050919050565b610f2a81610f0f565b82525050565b6000602082019050610f456000830184610f21565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f85578082015181840152602081019050610f6a565b83811115610f94576000848401525b50505050565b6000601f19601f8301169050919050565b6000610fb682610f4b565b610fc08185610f56565b9350610fd0818560208601610f67565b610fd981610f9a565b840191505092915050565b6000604082019050610ff96000830185610c14565b818103602083015261100b8184610fab565b90509392505050565b6004811061102157600080fd5b50565b60008135905061103381611014565b92915050565b60006020828403121561104f5761104e610b36565b5b600061105d84828501611024565b91505092915050565b6000819050919050565b61107981611066565b82525050565b60006020820190506110946000830184611070565b92915050565b6000815190506110a981610ba8565b92915050565b6000602082840312156110c5576110c4610b36565b5b60006110d38482850161109a565b91505092915050565b600082825260208201905092915050565b7f50726f78794d6f64756c653a204f6e6c79206f776e6572206f662070726f7879600082015250565b60006111236020836110dc565b915061112e826110ed565b602082019050919050565b6000602082019050818103600083015261115281611116565b9050919050565b60008115159050919050565b61116e81611159565b811461117957600080fd5b50565b60008151905061118b81611165565b92915050565b600080604083850312156111a8576111a7610b36565b5b60006111b68582860161109a565b92505060206111c78582860161117c565b9150509250929050565b60006111dc82610b76565b9050919050565b6111ec816111d1565b81146111f757600080fd5b50565b600081519050611209816111e3565b92915050565b60006020828403121561122557611224610b36565b5b6000611233848285016111fa565b91505092915050565b82818337600083830152505050565b60006112578385610f56565b935061126483858461123c565b61126d83610f9a565b840190509392505050565b6000819050919050565b600060ff82169050919050565b60006112aa6112a56112a084611278565b610ed1565b611282565b9050919050565b6112ba8161128f565b82525050565b60006060820190506112d56000830187610c14565b81810360208301526112e881858761124b565b90506112f760408301846112b1565b9594505050505056fea264697066735822122050ecea14d3794becfcefdd20e632183256a6ee4fe00a06dbb0451f2d55f314e464736f6c634300080e0033000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d7
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b2db0b4111610071578063b2db0b41146101b4578063b81cd866146101d0578063ba1d0ff414610201578063c10304f71461021f578063cd3d4fb914610250578063ddca3f4314610280576100b4565b806314ae9926146100b95780632e6e0bd0146100e9578063647846a5146101195780636d2dd29f1461013757806376474e6a14610167578063b0ccbdf014610198575b600080fd5b6100d360048036038101906100ce9190610bd4565b61029e565b6040516100e09190610c23565b60405180910390f35b61010360048036038101906100fe9190610c3e565b610385565b6040516101109190610c23565b60405180910390f35b6101216103b8565b60405161012e9190610c23565b60405180910390f35b610151600480360381019061014c9190610c3e565b6103de565b60405161015e9190610c23565b60405180910390f35b610181600480360381019061017c9190610c6b565b610411565b60405161018f929190610cab565b60405180910390f35b6101b260048036038101906101ad9190610d39565b610685565b005b6101ce60048036038101906101c99190610df5565b610697565b005b6101ea60048036038101906101e59190610c3e565b61069e565b6040516101f8929190610ea8565b60405180910390f35b6102096106fa565b6040516102169190610f30565b60405180910390f35b61023960048036038101906102349190610df5565b61071e565b604051610247929190610fe4565b60405180910390f35b61026a60048036038101906102659190611039565b61085c565b6040516102779190610c23565b60405180910390f35b61028861088f565b604051610295919061107f565b60405180910390f35b6000807f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016102fa9190610c23565b602060405180830381865afa158015610317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033b91906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461037a578091505061037f565b829150505b92915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060007f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff166314afd79e856040518263ffffffff1660e01b815260040161046f9190610c23565b602060405180830381865afa15801561048c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b091906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610596578073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061054b57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b61058a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058190611139565b60405180910390fd5b8084925092505061067e565b60007f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff166314afd79e876040518263ffffffff1660e01b81526004016105f19190610c23565b602060405180830381865afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063291906110af565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067557808593509350505061067e565b85859350935050505b9250929050565b61068e86610895565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d781565b6000606060007f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff1663ded89a7c886040518263ffffffff1660e01b815260040161077d9190610c23565b6040805180830381865afa158015610799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bd9190611191565b5090508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610803576107fe868686610aae565b610849565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050505b9150809550859250509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60008073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff166314afd79e846040518263ffffffff1660e01b81526004016109079190610c23565b602060405180830381865afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094891906110af565b73ffffffffffffffffffffffffffffffffffffffff161415905080610aaa5760007f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff1663ded89a7c846040518263ffffffff1660e01b81526004016109c29190610c23565b6040805180830381865afa1580156109de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a029190611191565b91505080610aa8577f000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d773ffffffffffffffffffffffffffffffffffffffff166374912cd2846040518263ffffffff1660e01b8152600401610a639190610c23565b6020604051808303816000875af1158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa6919061120f565b505b505b5050565b60606354132d7860e01b8484846000604051602401610ad094939291906112c0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090509392505050565b600080fd5b600080fd5b6000819050919050565b610b5381610b40565b8114610b5e57600080fd5b50565b600081359050610b7081610b4a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ba182610b76565b9050919050565b610bb181610b96565b8114610bbc57600080fd5b50565b600081359050610bce81610ba8565b92915050565b60008060408385031215610beb57610bea610b36565b5b6000610bf985828601610b61565b9250506020610c0a85828601610bbf565b9150509250929050565b610c1d81610b96565b82525050565b6000602082019050610c386000830184610c14565b92915050565b600060208284031215610c5457610c53610b36565b5b6000610c6284828501610b61565b91505092915050565b60008060408385031215610c8257610c81610b36565b5b6000610c9085828601610bbf565b9250506020610ca185828601610bbf565b9150509250929050565b6000604082019050610cc06000830185610c14565b610ccd6020830184610c14565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112610cf957610cf8610cd4565b5b8235905067ffffffffffffffff811115610d1657610d15610cd9565b5b602083019150836001820283011115610d3257610d31610cde565b5b9250929050565b600080600080600080600060a0888a031215610d5857610d57610b36565b5b6000610d668a828b01610b61565b9750506020610d778a828b01610bbf565b9650506040610d888a828b01610bbf565b955050606088013567ffffffffffffffff811115610da957610da8610b3b565b5b610db58a828b01610ce3565b9450945050608088013567ffffffffffffffff811115610dd857610dd7610b3b565b5b610de48a828b01610ce3565b925092505092959891949750929550565b600080600080600060808688031215610e1157610e10610b36565b5b6000610e1f88828901610b61565b9550506020610e3088828901610bbf565b9450506040610e4188828901610bbf565b935050606086013567ffffffffffffffff811115610e6257610e61610b3b565b5b610e6e88828901610ce3565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610ea281610e7d565b82525050565b6000604082019050610ebd6000830185610e99565b610eca6020830184610e99565b9392505050565b6000819050919050565b6000610ef6610ef1610eec84610b76565b610ed1565b610b76565b9050919050565b6000610f0882610edb565b9050919050565b6000610f1a82610efd565b9050919050565b610f2a81610f0f565b82525050565b6000602082019050610f456000830184610f21565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f85578082015181840152602081019050610f6a565b83811115610f94576000848401525b50505050565b6000601f19601f8301169050919050565b6000610fb682610f4b565b610fc08185610f56565b9350610fd0818560208601610f67565b610fd981610f9a565b840191505092915050565b6000604082019050610ff96000830185610c14565b818103602083015261100b8184610fab565b90509392505050565b6004811061102157600080fd5b50565b60008135905061103381611014565b92915050565b60006020828403121561104f5761104e610b36565b5b600061105d84828501611024565b91505092915050565b6000819050919050565b61107981611066565b82525050565b60006020820190506110946000830184611070565b92915050565b6000815190506110a981610ba8565b92915050565b6000602082840312156110c5576110c4610b36565b5b60006110d38482850161109a565b91505092915050565b600082825260208201905092915050565b7f50726f78794d6f64756c653a204f6e6c79206f776e6572206f662070726f7879600082015250565b60006111236020836110dc565b915061112e826110ed565b602082019050919050565b6000602082019050818103600083015261115281611116565b9050919050565b60008115159050919050565b61116e81611159565b811461117957600080fd5b50565b60008151905061118b81611165565b92915050565b600080604083850312156111a8576111a7610b36565b5b60006111b68582860161109a565b92505060206111c78582860161117c565b9150509250929050565b60006111dc82610b76565b9050919050565b6111ec816111d1565b81146111f757600080fd5b50565b600081519050611209816111e3565b92915050565b60006020828403121561122557611224610b36565b5b6000611233848285016111fa565b91505092915050565b82818337600083830152505050565b60006112578385610f56565b935061126483858461123c565b61126d83610f9a565b840190509392505050565b6000819050919050565b600060ff82169050919050565b60006112aa6112a56112a084611278565b610ed1565b611282565b9050919050565b6112ba8161128f565b82525050565b60006060820190506112d56000830187610c14565b81810360208301526112e881858761124b565b90506112f760408301846112b1565b9594505050505056fea264697066735822122050ecea14d3794becfcefdd20e632183256a6ee4fe00a06dbb0451f2d55f314e464736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d7
-----Decoded View---------------
Arg [0] : _opsProxyFactory (address): 0xC815dB16D4be6ddf2685C201937905aBf338F5D7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c815db16d4be6ddf2685c201937905abf338f5d7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.