Source Code
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TriggerModule
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";
// solhint-disable not-rely-on-time
contract TriggerModule is TaskModuleBase {
/**
* @notice Helper function to encode arguments for TriggerModule for Timer.
*
* @param _start Time when the first execution should occur.
* @param _interval Time interval between each execution.
*/
function encodeTimeTriggerModuleArg(uint128 _start, uint128 _interval)
external
pure
returns (bytes memory)
{
bytes memory triggerConfig = abi.encode(_start, _interval);
return abi.encode(LibDataTypes.TriggerType.TIME, triggerConfig);
}
/**
* @notice Helper function to encode arguments for TriggerModule for Cron.
*
* @param _expression Cron expression
*/
function encodeCronTriggerModuleArg(string calldata _expression)
external
pure
returns (bytes memory)
{
bytes memory triggerConfig = abi.encode(_expression);
return abi.encode(LibDataTypes.TriggerType.CRON, triggerConfig);
}
/**
* @notice Helper function to encode arguments for TriggerModule for Event.
*
* @param _address Address to listen to for events.
* @param _topics Set of topics to filter at each topic position.
* @param _blockConfirmations Number of blocks to wait for before triggering.
*/
function encodeEventTriggerModuleArg(
address _address,
bytes32[][] memory _topics,
uint256 _blockConfirmations
) external pure returns (bytes memory) {
bytes memory triggerConfig = abi.encode(
_address,
_topics,
_blockConfirmations
);
return abi.encode(LibDataTypes.TriggerType.EVENT, triggerConfig);
}
}// 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 Automate smart contract.
*/
// solhint-disable max-states-count
abstract contract AutomateStorage {
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; ///@dev Deprecated
mapping(LibDataTypes.Module => address) public taskModuleAddresses;
mapping(bytes32 => uint256) public nonce1Balance; ///@dev Deprecated
}// 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 DEPRECATED_TIME deprecated
* @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}
* @param WEB3_FUNCTION Use off-chain condition & input data for execution. {See Web3FunctionModule.sol}
* @param TRIGGER Repeated execution of task ata a specified timing and interval or cron. {See TriggerModule.sol}
*/
enum Module {
RESOLVER,
DEPRECATED_TIME, // @deprecated
PROXY,
SINGLE_EXEC,
WEB3_FUNCTION,
TRIGGER
}
/**
* @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;
}
/**
* @notice Types of trigger
*
* @param TIME Time triggered tasks, starting at a specific time and triggered intervally
* @param CRON Cron triggered tasks, triggered according to the cron conditions
*/
enum TriggerType {
TIME,
CRON,
EVENT
}
/**
* @notice Struct for trigger module
*
* @param triggerType Type of the trigger
* @param triggerConfig Trigger configuration that shuold be parsed according to triggerType
*/
struct TriggerModuleData {
TriggerType triggerType;
bytes triggerConfig;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;
import {AutomateStorage} from "../AutomateStorage.sol";
import {ITaskModule} from "../interfaces/ITaskModule.sol";
// solhint-disable no-empty-blocks
abstract contract TaskModuleBase is AutomateStorage, 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":"string","name":"_expression","type":"string"}],"name":"encodeCronTriggerModuleArg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[][]","name":"_topics","type":"bytes32[][]"},{"internalType":"uint256","name":"_blockConfirmations","type":"uint256"}],"name":"encodeEventTriggerModuleArg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint128","name":"_start","type":"uint128"},{"internalType":"uint128","name":"_interval","type":"uint128"}],"name":"encodeTimeTriggerModuleArg","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":"","type":"bytes32"}],"name":"nonce1Balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","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":[{"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":"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":"","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
608060405234801561001057600080fd5b5061122d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063994ee8b711610097578063b81cd86611610066578063b81cd866146102d1578063c10304f714610302578063cd3d4fb914610333578063ddca3f4314610363576100f5565b8063994ee8b714610239578063ac21631a14610269578063b0ccbdf014610299578063b2db0b41146102b5576100f5565b8063647846a5116100d3578063647846a51461018a5780636d2dd29f146101a8578063714d732f146101d857806376474e6a14610208576100f5565b806314ae9926146100fa5780631fc2d3d01461012a5780632e6e0bd01461015a575b600080fd5b610114600480360381019061010f91906106ea565b610381565b6040516101219190610739565b60405180910390f35b610144600480360381019061013f919061079c565b61038c565b6040516101519190610875565b60405180910390f35b610174600480360381019061016f9190610897565b6103e0565b6040516101819190610739565b60405180910390f35b610192610413565b60405161019f9190610739565b60405180910390f35b6101c260048036038101906101bd9190610897565b610439565b6040516101cf9190610739565b60405180910390f35b6101f260048036038101906101ed9190610929565b61046c565b6040516101ff9190610875565b60405180910390f35b610222600480360381019061021d9190610976565b6104c0565b6040516102309291906109b6565b60405180910390f35b610253600480360381019061024e9190610c34565b6104d0565b6040516102609190610875565b60405180910390f35b610283600480360381019061027e9190610897565b610527565b6040516102909190610cb2565b60405180910390f35b6102b360048036038101906102ae9190610d23565b61053f565b005b6102cf60048036038101906102ca9190610ddf565b610548565b005b6102eb60048036038101906102e69190610897565b61054f565b6040516102f9929190610e76565b60405180910390f35b61031c60048036038101906103179190610ddf565b6105ab565b60405161032a929190610e9f565b60405180910390f35b61034d60048036038101906103489190610ef4565b610609565b60405161035a9190610739565b60405180910390f35b61036b61063c565b6040516103789190610cb2565b60405180910390f35b600081905092915050565b6060600083836040516020016103a3929190610e76565b60405160208183030381529060405290506000816040516020016103c8929190610f98565b60405160208183030381529060405291505092915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008383604051602001610483929190611015565b60405160208183030381529060405290506001816040516020016104a8929190610f98565b60405160208183030381529060405291505092915050565b6000808383915091509250929050565b606060008484846040516020016104e9939291906111b9565b604051602081830303815290604052905060028160405160200161050e929190610f98565b6040516020818303038152906040529150509392505050565b60076020528060005260406000206000915090505481565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b6000606084848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090509050915091509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61066981610656565b811461067457600080fd5b50565b60008135905061068681610660565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106b78261068c565b9050919050565b6106c7816106ac565b81146106d257600080fd5b50565b6000813590506106e4816106be565b92915050565b600080604083850312156107015761070061064c565b5b600061070f85828601610677565b9250506020610720858286016106d5565b9150509250929050565b610733816106ac565b82525050565b600060208201905061074e600083018461072a565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61077981610754565b811461078457600080fd5b50565b60008135905061079681610770565b92915050565b600080604083850312156107b3576107b261064c565b5b60006107c185828601610787565b92505060206107d285828601610787565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156108165780820151818401526020810190506107fb565b83811115610825576000848401525b50505050565b6000601f19601f8301169050919050565b6000610847826107dc565b61085181856107e7565b93506108618185602086016107f8565b61086a8161082b565b840191505092915050565b6000602082019050818103600083015261088f818461083c565b905092915050565b6000602082840312156108ad576108ac61064c565b5b60006108bb84828501610677565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126108e9576108e86108c4565b5b8235905067ffffffffffffffff811115610906576109056108c9565b5b602083019150836001820283011115610922576109216108ce565b5b9250929050565b600080602083850312156109405761093f61064c565b5b600083013567ffffffffffffffff81111561095e5761095d610651565b5b61096a858286016108d3565b92509250509250929050565b6000806040838503121561098d5761098c61064c565b5b600061099b858286016106d5565b92505060206109ac858286016106d5565b9150509250929050565b60006040820190506109cb600083018561072a565b6109d8602083018461072a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a178261082b565b810181811067ffffffffffffffff82111715610a3657610a356109df565b5b80604052505050565b6000610a49610642565b9050610a558282610a0e565b919050565b600067ffffffffffffffff821115610a7557610a746109df565b5b602082029050602081019050919050565b600067ffffffffffffffff821115610aa157610aa06109df565b5b602082029050602081019050919050565b6000610ac5610ac084610a86565b610a3f565b90508083825260208201905060208402830185811115610ae857610ae76108ce565b5b835b81811015610b115780610afd8882610677565b845260208401935050602081019050610aea565b5050509392505050565b600082601f830112610b3057610b2f6108c4565b5b8135610b40848260208601610ab2565b91505092915050565b6000610b5c610b5784610a5a565b610a3f565b90508083825260208201905060208402830185811115610b7f57610b7e6108ce565b5b835b81811015610bc657803567ffffffffffffffff811115610ba457610ba36108c4565b5b808601610bb18982610b1b565b85526020850194505050602081019050610b81565b5050509392505050565b600082601f830112610be557610be46108c4565b5b8135610bf5848260208601610b49565b91505092915050565b6000819050919050565b610c1181610bfe565b8114610c1c57600080fd5b50565b600081359050610c2e81610c08565b92915050565b600080600060608486031215610c4d57610c4c61064c565b5b6000610c5b868287016106d5565b935050602084013567ffffffffffffffff811115610c7c57610c7b610651565b5b610c8886828701610bd0565b9250506040610c9986828701610c1f565b9150509250925092565b610cac81610bfe565b82525050565b6000602082019050610cc76000830184610ca3565b92915050565b60008083601f840112610ce357610ce26108c4565b5b8235905067ffffffffffffffff811115610d0057610cff6108c9565b5b602083019150836001820283011115610d1c57610d1b6108ce565b5b9250929050565b600080600080600080600060a0888a031215610d4257610d4161064c565b5b6000610d508a828b01610677565b9750506020610d618a828b016106d5565b9650506040610d728a828b016106d5565b955050606088013567ffffffffffffffff811115610d9357610d92610651565b5b610d9f8a828b01610ccd565b9450945050608088013567ffffffffffffffff811115610dc257610dc1610651565b5b610dce8a828b01610ccd565b925092505092959891949750929550565b600080600080600060808688031215610dfb57610dfa61064c565b5b6000610e0988828901610677565b9550506020610e1a888289016106d5565b9450506040610e2b888289016106d5565b935050606086013567ffffffffffffffff811115610e4c57610e4b610651565b5b610e5888828901610ccd565b92509250509295509295909350565b610e7081610754565b82525050565b6000604082019050610e8b6000830185610e67565b610e986020830184610e67565b9392505050565b6000604082019050610eb4600083018561072a565b8181036020830152610ec6818461083c565b90509392505050565b60068110610edc57600080fd5b50565b600081359050610eee81610ecf565b92915050565b600060208284031215610f0a57610f0961064c565b5b6000610f1884828501610edf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110610f6157610f60610f21565b5b50565b6000819050610f7282610f50565b919050565b6000610f8282610f64565b9050919050565b610f9281610f77565b82525050565b6000604082019050610fad6000830185610f89565b8181036020830152610fbf818461083c565b90509392505050565b600082825260208201905092915050565b82818337600083830152505050565b6000610ff48385610fc8565b9350611001838584610fd9565b61100a8361082b565b840190509392505050565b60006020820190508181036000830152611030818486610fe8565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61109a81610656565b82525050565b60006110ac8383611091565b60208301905092915050565b6000602082019050919050565b60006110d082611065565b6110da8185611070565b93506110e583611081565b8060005b838110156111165781516110fd88826110a0565b9750611108836110b8565b9250506001810190506110e9565b5085935050505092915050565b600061112f83836110c5565b905092915050565b6000602082019050919050565b600061114f82611039565b6111598185611044565b93508360208202850161116b85611055565b8060005b858110156111a757848403895281516111888582611123565b945061119383611137565b925060208a0199505060018101905061116f565b50829750879550505050505092915050565b60006060820190506111ce600083018661072a565b81810360208301526111e08185611144565b90506111ef6040830184610ca3565b94935050505056fea264697066735822122088d312f3df0d491115eafa6aefc8c7409fe45d14bf752b59802d1b5b54cf07ad64736f6c634300080e0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063994ee8b711610097578063b81cd86611610066578063b81cd866146102d1578063c10304f714610302578063cd3d4fb914610333578063ddca3f4314610363576100f5565b8063994ee8b714610239578063ac21631a14610269578063b0ccbdf014610299578063b2db0b41146102b5576100f5565b8063647846a5116100d3578063647846a51461018a5780636d2dd29f146101a8578063714d732f146101d857806376474e6a14610208576100f5565b806314ae9926146100fa5780631fc2d3d01461012a5780632e6e0bd01461015a575b600080fd5b610114600480360381019061010f91906106ea565b610381565b6040516101219190610739565b60405180910390f35b610144600480360381019061013f919061079c565b61038c565b6040516101519190610875565b60405180910390f35b610174600480360381019061016f9190610897565b6103e0565b6040516101819190610739565b60405180910390f35b610192610413565b60405161019f9190610739565b60405180910390f35b6101c260048036038101906101bd9190610897565b610439565b6040516101cf9190610739565b60405180910390f35b6101f260048036038101906101ed9190610929565b61046c565b6040516101ff9190610875565b60405180910390f35b610222600480360381019061021d9190610976565b6104c0565b6040516102309291906109b6565b60405180910390f35b610253600480360381019061024e9190610c34565b6104d0565b6040516102609190610875565b60405180910390f35b610283600480360381019061027e9190610897565b610527565b6040516102909190610cb2565b60405180910390f35b6102b360048036038101906102ae9190610d23565b61053f565b005b6102cf60048036038101906102ca9190610ddf565b610548565b005b6102eb60048036038101906102e69190610897565b61054f565b6040516102f9929190610e76565b60405180910390f35b61031c60048036038101906103179190610ddf565b6105ab565b60405161032a929190610e9f565b60405180910390f35b61034d60048036038101906103489190610ef4565b610609565b60405161035a9190610739565b60405180910390f35b61036b61063c565b6040516103789190610cb2565b60405180910390f35b600081905092915050565b6060600083836040516020016103a3929190610e76565b60405160208183030381529060405290506000816040516020016103c8929190610f98565b60405160208183030381529060405291505092915050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008383604051602001610483929190611015565b60405160208183030381529060405290506001816040516020016104a8929190610f98565b60405160208183030381529060405291505092915050565b6000808383915091509250929050565b606060008484846040516020016104e9939291906111b9565b604051602081830303815290604052905060028160405160200161050e929190610f98565b6040516020818303038152906040529150509392505050565b60076020528060005260406000206000915090505481565b50505050505050565b5050505050565b60056020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b6000606084848481818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090509050915091509550959350505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61066981610656565b811461067457600080fd5b50565b60008135905061068681610660565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106b78261068c565b9050919050565b6106c7816106ac565b81146106d257600080fd5b50565b6000813590506106e4816106be565b92915050565b600080604083850312156107015761070061064c565b5b600061070f85828601610677565b9250506020610720858286016106d5565b9150509250929050565b610733816106ac565b82525050565b600060208201905061074e600083018461072a565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61077981610754565b811461078457600080fd5b50565b60008135905061079681610770565b92915050565b600080604083850312156107b3576107b261064c565b5b60006107c185828601610787565b92505060206107d285828601610787565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156108165780820151818401526020810190506107fb565b83811115610825576000848401525b50505050565b6000601f19601f8301169050919050565b6000610847826107dc565b61085181856107e7565b93506108618185602086016107f8565b61086a8161082b565b840191505092915050565b6000602082019050818103600083015261088f818461083c565b905092915050565b6000602082840312156108ad576108ac61064c565b5b60006108bb84828501610677565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126108e9576108e86108c4565b5b8235905067ffffffffffffffff811115610906576109056108c9565b5b602083019150836001820283011115610922576109216108ce565b5b9250929050565b600080602083850312156109405761093f61064c565b5b600083013567ffffffffffffffff81111561095e5761095d610651565b5b61096a858286016108d3565b92509250509250929050565b6000806040838503121561098d5761098c61064c565b5b600061099b858286016106d5565b92505060206109ac858286016106d5565b9150509250929050565b60006040820190506109cb600083018561072a565b6109d8602083018461072a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a178261082b565b810181811067ffffffffffffffff82111715610a3657610a356109df565b5b80604052505050565b6000610a49610642565b9050610a558282610a0e565b919050565b600067ffffffffffffffff821115610a7557610a746109df565b5b602082029050602081019050919050565b600067ffffffffffffffff821115610aa157610aa06109df565b5b602082029050602081019050919050565b6000610ac5610ac084610a86565b610a3f565b90508083825260208201905060208402830185811115610ae857610ae76108ce565b5b835b81811015610b115780610afd8882610677565b845260208401935050602081019050610aea565b5050509392505050565b600082601f830112610b3057610b2f6108c4565b5b8135610b40848260208601610ab2565b91505092915050565b6000610b5c610b5784610a5a565b610a3f565b90508083825260208201905060208402830185811115610b7f57610b7e6108ce565b5b835b81811015610bc657803567ffffffffffffffff811115610ba457610ba36108c4565b5b808601610bb18982610b1b565b85526020850194505050602081019050610b81565b5050509392505050565b600082601f830112610be557610be46108c4565b5b8135610bf5848260208601610b49565b91505092915050565b6000819050919050565b610c1181610bfe565b8114610c1c57600080fd5b50565b600081359050610c2e81610c08565b92915050565b600080600060608486031215610c4d57610c4c61064c565b5b6000610c5b868287016106d5565b935050602084013567ffffffffffffffff811115610c7c57610c7b610651565b5b610c8886828701610bd0565b9250506040610c9986828701610c1f565b9150509250925092565b610cac81610bfe565b82525050565b6000602082019050610cc76000830184610ca3565b92915050565b60008083601f840112610ce357610ce26108c4565b5b8235905067ffffffffffffffff811115610d0057610cff6108c9565b5b602083019150836001820283011115610d1c57610d1b6108ce565b5b9250929050565b600080600080600080600060a0888a031215610d4257610d4161064c565b5b6000610d508a828b01610677565b9750506020610d618a828b016106d5565b9650506040610d728a828b016106d5565b955050606088013567ffffffffffffffff811115610d9357610d92610651565b5b610d9f8a828b01610ccd565b9450945050608088013567ffffffffffffffff811115610dc257610dc1610651565b5b610dce8a828b01610ccd565b925092505092959891949750929550565b600080600080600060808688031215610dfb57610dfa61064c565b5b6000610e0988828901610677565b9550506020610e1a888289016106d5565b9450506040610e2b888289016106d5565b935050606086013567ffffffffffffffff811115610e4c57610e4b610651565b5b610e5888828901610ccd565b92509250509295509295909350565b610e7081610754565b82525050565b6000604082019050610e8b6000830185610e67565b610e986020830184610e67565b9392505050565b6000604082019050610eb4600083018561072a565b8181036020830152610ec6818461083c565b90509392505050565b60068110610edc57600080fd5b50565b600081359050610eee81610ecf565b92915050565b600060208284031215610f0a57610f0961064c565b5b6000610f1884828501610edf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110610f6157610f60610f21565b5b50565b6000819050610f7282610f50565b919050565b6000610f8282610f64565b9050919050565b610f9281610f77565b82525050565b6000604082019050610fad6000830185610f89565b8181036020830152610fbf818461083c565b90509392505050565b600082825260208201905092915050565b82818337600083830152505050565b6000610ff48385610fc8565b9350611001838584610fd9565b61100a8361082b565b840190509392505050565b60006020820190508181036000830152611030818486610fe8565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61109a81610656565b82525050565b60006110ac8383611091565b60208301905092915050565b6000602082019050919050565b60006110d082611065565b6110da8185611070565b93506110e583611081565b8060005b838110156111165781516110fd88826110a0565b9750611108836110b8565b9250506001810190506110e9565b5085935050505092915050565b600061112f83836110c5565b905092915050565b6000602082019050919050565b600061114f82611039565b6111598185611044565b93508360208202850161116b85611055565b8060005b858110156111a757848403895281516111888582611123565b945061119383611137565b925060208a0199505060018101905061116f565b50829750879550505050505092915050565b60006060820190506111ce600083018661072a565b81810360208301526111e08185611144565b90506111ef6040830184610ca3565b94935050505056fea264697066735822122088d312f3df0d491115eafa6aefc8c7409fe45d14bf752b59802d1b5b54cf07ad64736f6c634300080e0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
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.