Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TimeModule
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 {LibDataTypes} from "../libraries/LibDataTypes.sol"; import {LibEvents} from "../libraries/LibEvents.sol"; // solhint-disable not-rely-on-time contract TimeModule is TaskModuleBase { ///@inheritdoc TaskModuleBase function onCreateTask( bytes32 _taskId, address, address, bytes calldata, bytes calldata _arg ) external override { (uint128 startTime, uint128 interval) = _decodeModuleArg(_arg); uint128 nextExec = uint256(startTime) > block.timestamp ? startTime : uint128(block.timestamp); timedTask[_taskId] = LibDataTypes.Time(nextExec, interval); emit LibEvents.TimerSet(_taskId, nextExec, interval); } function preCancelTask(bytes32 _taskId, address _taskCreator) external override returns (address) { delete timedTask[_taskId]; return _taskCreator; } /** * @inheritdoc TaskModuleBase * @dev Time is updated at preExec because if * SingleExec is used concurrently, it will delete timedTask. */ function preExecCall( bytes32 _taskId, address, address _execAddress, bytes calldata _execData ) external override returns (address, bytes memory) { LibDataTypes.Time memory time = timedTask[_taskId]; bool isTimedTask = time.nextExec != 0; if (isTimedTask) { require( time.nextExec <= uint128(block.timestamp), "TimeModule: Too early" ); uint128 timeDiff = uint128(block.timestamp) - time.nextExec; uint128 intervals = (timeDiff / time.interval) + 1; timedTask[_taskId].nextExec = time.nextExec + (intervals * time.interval); } return (_execAddress, _execData); } /** * @notice Helper function to encode arguments for TimeModule. * * @param _startTime Time when the first execution should occur. * @param _interval Time interval between each execution. */ function encodeModuleArg(address _startTime, bytes calldata _interval) external pure returns (bytes memory) { return abi.encode(_startTime, _interval); } function _decodeModuleArg(bytes calldata _arg) private pure returns (uint128 startTime, uint128 interval) { (startTime, interval) = abi.decode(_arg, (uint128, uint128)); } }
// 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; // 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: MIT pragma solidity ^0.8.12; import {LibDataTypes} from "./LibDataTypes.sol"; library LibEvents { /** * @notice Emitted when `createTask` is called. * * @param taskCreator The address which created the task. * @param execAddress Address of contract that is called by Gelato. * @param execDataOrSelector Execution data / function selector. * @param moduleData Conditional modules used. {See LibDataTypes-ModuleData} * @param feeToken Token used to pay for the execution. ETH = 0xeeeeee... * @param taskId Unique hash of the task. {See LibTaskId-getTaskId} */ event TaskCreated( address indexed taskCreator, address indexed execAddress, bytes execDataOrSelector, LibDataTypes.ModuleData moduleData, address feeToken, bytes32 indexed taskId ); /** * @notice Emitted when `cancelTask` is called. * * @param taskId Unique hash of the task. {See LibTaskId-getTaskId} * @param taskCreator The address which owned the task. */ event TaskCancelled(bytes32 taskId, address taskCreator); /** * @notice Emitted when `exec` is called. * * @param txFee Fee paid to Gelato for execution * @param feeToken Token used to pay for the execution. ETH = 0xeeeeee... * @param execAddress Address of contract that will be called by Gelato. * @param execData Execution data / function selector. * @param taskId Unique hash of the task. {See LibTaskId-getTaskId} * @param callSuccess Status of the call to execAddress. */ event ExecSuccess( uint256 indexed txFee, address indexed feeToken, address indexed execAddress, bytes execData, bytes32 taskId, bool callSuccess ); /** * @notice Emitted when TimeModule is initialised. * * @param taskId Unique hash of the task. {See LibTaskId-getTaskId} * @param nextExec Time when the next execution will occur. * @param interval Time interval between each execution. */ event TimerSet( bytes32 indexed taskId, uint128 indexed nextExec, uint128 indexed 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":"address","name":"_startTime","type":"address"},{"internalType":"bytes","name":"_interval","type":"bytes"}],"name":"encodeModuleArg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"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":"_taskId","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"_arg","type":"bytes"}],"name":"onCreateTask","outputs":[],"stateMutability":"nonpayable","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":"_taskId","type":"bytes32"},{"internalType":"address","name":"_taskCreator","type":"address"}],"name":"preCancelTask","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_taskId","type":"bytes32"},{"internalType":"address","name":"","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":"","type":"bytes"}],"stateMutability":"nonpayable","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
608060405234801561001057600080fd5b50611094806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b0ccbdf011610071578063b0ccbdf0146101c8578063b2db0b41146101e4578063b81cd86614610200578063c10304f714610231578063cd3d4fb914610262578063ddca3f4314610292576100b4565b806314ae9926146100b95780632e6e0bd0146100e95780633c706c6f14610119578063647846a5146101495780636d2dd29f1461016757806376474e6a14610197575b600080fd5b6100d360048036038101906100ce91906108e6565b6102b0565b6040516100e09190610935565b60405180910390f35b61010360048036038101906100fe9190610950565b610317565b6040516101109190610935565b60405180910390f35b610133600480360381019061012e91906109e2565b61034a565b6040516101409190610adb565b60405180910390f35b610151610379565b60405161015e9190610935565b60405180910390f35b610181600480360381019061017c9190610950565b61039f565b60405161018e9190610935565b60405180910390f35b6101b160048036038101906101ac9190610afd565b6103d2565b6040516101bf929190610b3d565b60405180910390f35b6101e260048036038101906101dd9190610b66565b6103e2565b005b6101fe60048036038101906101f99190610c22565b610544565b005b61021a60048036038101906102159190610950565b61054b565b604051610228929190610cd5565b60405180910390f35b61024b60048036038101906102469190610c22565b6105a7565b604051610259929190610cfe565b60405180910390f35b61027c60048036038101906102779190610d53565b6107ee565b6040516102899190610935565b60405180910390f35b61029a610821565b6040516102a79190610d99565b60405180910390f35b600060056000848152602001908152602001600020600080820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556000820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505081905092915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606083838360405160200161036193929190610df0565b60405160208183030381529060405290509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808383915091509250929050565b6000806103ef8484610827565b91509150600042836fffffffffffffffffffffffffffffffff16116104145742610416565b825b90506040518060400160405280826fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff16815250600560008c815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050816fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff168b7f857791ec95701b6fff966bff1b5ce9a86107aeabaf6d2fdfd89993aa0f084e3760405160405180910390a450505050505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b600060606000600560008981526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060008082600001516fffffffffffffffffffffffffffffffff1614159050801561079257426fffffffffffffffffffffffffffffffff1682600001516fffffffffffffffffffffffffffffffff1611156106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790610e7f565b60405180910390fd5b60008260000151426107029190610ece565b9050600060018460200151836107189190610f31565b6107229190610f62565b90508360200151816107349190610fa8565b84600001516107439190610f62565b600560008d815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b86868681818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905090509350935050509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000808383810190610839919061101e565b80925081935050509250929050565b600080fd5b600080fd5b6000819050919050565b61086581610852565b811461087057600080fd5b50565b6000813590506108828161085c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108b382610888565b9050919050565b6108c3816108a8565b81146108ce57600080fd5b50565b6000813590506108e0816108ba565b92915050565b600080604083850312156108fd576108fc610848565b5b600061090b85828601610873565b925050602061091c858286016108d1565b9150509250929050565b61092f816108a8565b82525050565b600060208201905061094a6000830184610926565b92915050565b60006020828403121561096657610965610848565b5b600061097484828501610873565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109a2576109a161097d565b5b8235905067ffffffffffffffff8111156109bf576109be610982565b5b6020830191508360018202830111156109db576109da610987565b5b9250929050565b6000806000604084860312156109fb576109fa610848565b5b6000610a09868287016108d1565b935050602084013567ffffffffffffffff811115610a2a57610a2961084d565b5b610a368682870161098c565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a7c578082015181840152602081019050610a61565b83811115610a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000610aad82610a42565b610ab78185610a4d565b9350610ac7818560208601610a5e565b610ad081610a91565b840191505092915050565b60006020820190508181036000830152610af58184610aa2565b905092915050565b60008060408385031215610b1457610b13610848565b5b6000610b22858286016108d1565b9250506020610b33858286016108d1565b9150509250929050565b6000604082019050610b526000830185610926565b610b5f6020830184610926565b9392505050565b600080600080600080600060a0888a031215610b8557610b84610848565b5b6000610b938a828b01610873565b9750506020610ba48a828b016108d1565b9650506040610bb58a828b016108d1565b955050606088013567ffffffffffffffff811115610bd657610bd561084d565b5b610be28a828b0161098c565b9450945050608088013567ffffffffffffffff811115610c0557610c0461084d565b5b610c118a828b0161098c565b925092505092959891949750929550565b600080600080600060808688031215610c3e57610c3d610848565b5b6000610c4c88828901610873565b9550506020610c5d888289016108d1565b9450506040610c6e888289016108d1565b935050606086013567ffffffffffffffff811115610c8f57610c8e61084d565b5b610c9b8882890161098c565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610ccf81610caa565b82525050565b6000604082019050610cea6000830185610cc6565b610cf76020830184610cc6565b9392505050565b6000604082019050610d136000830185610926565b8181036020830152610d258184610aa2565b90509392505050565b60048110610d3b57600080fd5b50565b600081359050610d4d81610d2e565b92915050565b600060208284031215610d6957610d68610848565b5b6000610d7784828501610d3e565b91505092915050565b6000819050919050565b610d9381610d80565b82525050565b6000602082019050610dae6000830184610d8a565b92915050565b82818337600083830152505050565b6000610dcf8385610a4d565b9350610ddc838584610db4565b610de583610a91565b840190509392505050565b6000604082019050610e056000830186610926565b8181036020830152610e18818486610dc3565b9050949350505050565b600082825260208201905092915050565b7f54696d654d6f64756c653a20546f6f206561726c790000000000000000000000600082015250565b6000610e69601583610e22565b9150610e7482610e33565b602082019050919050565b60006020820190508181036000830152610e9881610e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ed982610caa565b9150610ee483610caa565b925082821015610ef757610ef6610e9f565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610f3c82610caa565b9150610f4783610caa565b925082610f5757610f56610f02565b5b828204905092915050565b6000610f6d82610caa565b9150610f7883610caa565b9250826fffffffffffffffffffffffffffffffff03821115610f9d57610f9c610e9f565b5b828201905092915050565b6000610fb382610caa565b9150610fbe83610caa565b9250816fffffffffffffffffffffffffffffffff0483118215151615610fe757610fe6610e9f565b5b828202905092915050565b610ffb81610caa565b811461100657600080fd5b50565b60008135905061101881610ff2565b92915050565b6000806040838503121561103557611034610848565b5b600061104385828601611009565b925050602061105485828601611009565b915050925092905056fea264697066735822122001beeb4690d5307ac6e521d1448bf806a103fe90de97fd676dd48fcaa75b77e964736f6c634300080e0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b0ccbdf011610071578063b0ccbdf0146101c8578063b2db0b41146101e4578063b81cd86614610200578063c10304f714610231578063cd3d4fb914610262578063ddca3f4314610292576100b4565b806314ae9926146100b95780632e6e0bd0146100e95780633c706c6f14610119578063647846a5146101495780636d2dd29f1461016757806376474e6a14610197575b600080fd5b6100d360048036038101906100ce91906108e6565b6102b0565b6040516100e09190610935565b60405180910390f35b61010360048036038101906100fe9190610950565b610317565b6040516101109190610935565b60405180910390f35b610133600480360381019061012e91906109e2565b61034a565b6040516101409190610adb565b60405180910390f35b610151610379565b60405161015e9190610935565b60405180910390f35b610181600480360381019061017c9190610950565b61039f565b60405161018e9190610935565b60405180910390f35b6101b160048036038101906101ac9190610afd565b6103d2565b6040516101bf929190610b3d565b60405180910390f35b6101e260048036038101906101dd9190610b66565b6103e2565b005b6101fe60048036038101906101f99190610c22565b610544565b005b61021a60048036038101906102159190610950565b61054b565b604051610228929190610cd5565b60405180910390f35b61024b60048036038101906102469190610c22565b6105a7565b604051610259929190610cfe565b60405180910390f35b61027c60048036038101906102779190610d53565b6107ee565b6040516102899190610935565b60405180910390f35b61029a610821565b6040516102a79190610d99565b60405180910390f35b600060056000848152602001908152602001600020600080820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556000820160106101000a8154906fffffffffffffffffffffffffffffffff0219169055505081905092915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606083838360405160200161036193929190610df0565b60405160208183030381529060405290509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808383915091509250929050565b6000806103ef8484610827565b91509150600042836fffffffffffffffffffffffffffffffff16116104145742610416565b825b90506040518060400160405280826fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff16815250600560008c815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050816fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff168b7f857791ec95701b6fff966bff1b5ce9a86107aeabaf6d2fdfd89993aa0f084e3760405160405180910390a450505050505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b600060606000600560008981526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060008082600001516fffffffffffffffffffffffffffffffff1614159050801561079257426fffffffffffffffffffffffffffffffff1682600001516fffffffffffffffffffffffffffffffff1611156106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790610e7f565b60405180910390fd5b60008260000151426107029190610ece565b9050600060018460200151836107189190610f31565b6107229190610f62565b90508360200151816107349190610fa8565b84600001516107439190610f62565b600560008d815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b86868681818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905090509350935050509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000808383810190610839919061101e565b80925081935050509250929050565b600080fd5b600080fd5b6000819050919050565b61086581610852565b811461087057600080fd5b50565b6000813590506108828161085c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108b382610888565b9050919050565b6108c3816108a8565b81146108ce57600080fd5b50565b6000813590506108e0816108ba565b92915050565b600080604083850312156108fd576108fc610848565b5b600061090b85828601610873565b925050602061091c858286016108d1565b9150509250929050565b61092f816108a8565b82525050565b600060208201905061094a6000830184610926565b92915050565b60006020828403121561096657610965610848565b5b600061097484828501610873565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109a2576109a161097d565b5b8235905067ffffffffffffffff8111156109bf576109be610982565b5b6020830191508360018202830111156109db576109da610987565b5b9250929050565b6000806000604084860312156109fb576109fa610848565b5b6000610a09868287016108d1565b935050602084013567ffffffffffffffff811115610a2a57610a2961084d565b5b610a368682870161098c565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a7c578082015181840152602081019050610a61565b83811115610a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000610aad82610a42565b610ab78185610a4d565b9350610ac7818560208601610a5e565b610ad081610a91565b840191505092915050565b60006020820190508181036000830152610af58184610aa2565b905092915050565b60008060408385031215610b1457610b13610848565b5b6000610b22858286016108d1565b9250506020610b33858286016108d1565b9150509250929050565b6000604082019050610b526000830185610926565b610b5f6020830184610926565b9392505050565b600080600080600080600060a0888a031215610b8557610b84610848565b5b6000610b938a828b01610873565b9750506020610ba48a828b016108d1565b9650506040610bb58a828b016108d1565b955050606088013567ffffffffffffffff811115610bd657610bd561084d565b5b610be28a828b0161098c565b9450945050608088013567ffffffffffffffff811115610c0557610c0461084d565b5b610c118a828b0161098c565b925092505092959891949750929550565b600080600080600060808688031215610c3e57610c3d610848565b5b6000610c4c88828901610873565b9550506020610c5d888289016108d1565b9450506040610c6e888289016108d1565b935050606086013567ffffffffffffffff811115610c8f57610c8e61084d565b5b610c9b8882890161098c565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b610ccf81610caa565b82525050565b6000604082019050610cea6000830185610cc6565b610cf76020830184610cc6565b9392505050565b6000604082019050610d136000830185610926565b8181036020830152610d258184610aa2565b90509392505050565b60048110610d3b57600080fd5b50565b600081359050610d4d81610d2e565b92915050565b600060208284031215610d6957610d68610848565b5b6000610d7784828501610d3e565b91505092915050565b6000819050919050565b610d9381610d80565b82525050565b6000602082019050610dae6000830184610d8a565b92915050565b82818337600083830152505050565b6000610dcf8385610a4d565b9350610ddc838584610db4565b610de583610a91565b840190509392505050565b6000604082019050610e056000830186610926565b8181036020830152610e18818486610dc3565b9050949350505050565b600082825260208201905092915050565b7f54696d654d6f64756c653a20546f6f206561726c790000000000000000000000600082015250565b6000610e69601583610e22565b9150610e7482610e33565b602082019050919050565b60006020820190508181036000830152610e9881610e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ed982610caa565b9150610ee483610caa565b925082821015610ef757610ef6610e9f565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610f3c82610caa565b9150610f4783610caa565b925082610f5757610f56610f02565b5b828204905092915050565b6000610f6d82610caa565b9150610f7883610caa565b9250826fffffffffffffffffffffffffffffffff03821115610f9d57610f9c610e9f565b5b828201905092915050565b6000610fb382610caa565b9150610fbe83610caa565b9250816fffffffffffffffffffffffffffffffff0483118215151615610fe757610fe6610e9f565b5b828202905092915050565b610ffb81610caa565b811461100657600080fd5b50565b60008135905061101881610ff2565b92915050565b6000806040838503121561103557611034610848565b5b600061104385828601611009565b925050602061105485828601611009565b915050925092905056fea264697066735822122001beeb4690d5307ac6e521d1448bf806a103fe90de97fd676dd48fcaa75b77e964736f6c634300080e0033
Loading...
Loading
Loading...
Loading
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.