Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 4 from a total of 4 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ExecutionChainRobotKeeper
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import {IPayloadsControllerCore} from 'aave-governance-v3/src/contracts/payloads/interfaces/IPayloadsControllerCore.sol';
import {IExecutionChainRobotKeeper, AutomationCompatibleInterface} from '../interfaces/IExecutionChainRobotKeeper.sol';
import {Ownable} from 'solidity-utils/contracts/oz-common/Ownable.sol';
/**
* @title ExecutionChainRobotKeeper
* @author BGD Labs
* @notice Contract to perform automation on payloads controller
* @dev Aave chainlink automation-keeper-compatible contract to:
* - check if the payload could be executed
* - executes the payload if all the conditions are met.
*/
contract ExecutionChainRobotKeeper is Ownable, IExecutionChainRobotKeeper {
/// @inheritdoc IExecutionChainRobotKeeper
address public immutable PAYLOADS_CONTROLLER;
mapping(uint256 => bool) internal _disabledProposals;
/// @inheritdoc IExecutionChainRobotKeeper
uint256 public constant MAX_SHUFFLE_SIZE = 5;
/**
* @inheritdoc IExecutionChainRobotKeeper
* @dev maximum number of payloads to check before the latest payload, if they could be executed.
* from the last payload we check 20 more payloads to be very sure that no proposal is being unchecked.
*/
uint256 public constant MAX_SKIP = 20;
error NoActionCanBePerformed();
/**
* @param payloadsController address of the payloads controller contract.
*/
constructor(address payloadsController) {
PAYLOADS_CONTROLLER = payloadsController;
}
/**
* @inheritdoc AutomationCompatibleInterface
* @dev run off-chain, checks if payload should be executed
*/
function checkUpkeep(bytes calldata) external view override returns (bool, bytes memory) {
uint40[] memory payloadIdsToExecute = new uint40[](MAX_SHUFFLE_SIZE);
uint256 actionsCount;
uint40 index = IPayloadsControllerCore(PAYLOADS_CONTROLLER).getPayloadsCount();
uint256 skipCount;
// loops from the last/latest payloadId until MAX_SKIP iterations. resets skipCount and checks more MAX_SKIP number
// of payloads if they could be executed. we only check payloads until MAX_SKIP iterations from the last/latest payload
// or payloads where any action could be performed, and payloads before that will not be checked by the keeper.
while (index != 0 && skipCount <= MAX_SKIP && actionsCount < MAX_SHUFFLE_SIZE) {
uint40 payloadId = index - 1;
if (!isDisabled(payloadId)) {
if (_canPayloadBeExecuted(payloadId)) {
payloadIdsToExecute[actionsCount] = payloadId;
actionsCount++;
skipCount = 0;
} else {
skipCount++;
}
}
index--;
}
if (actionsCount > 0) {
// we shuffle the payloadsIds list to execute so that one payload failing does not block the other actions of the keeper.
payloadIdsToExecute = _squeezeAndShuffleActions(payloadIdsToExecute, actionsCount);
// squash and pick the first element from the shuffled array to perform execute.
// we only perform one execute action due to gas limit limitation in one performUpkeep.
assembly {
mstore(payloadIdsToExecute, 1)
}
return (true, abi.encode(payloadIdsToExecute));
}
return (false, '');
}
/**
* @inheritdoc AutomationCompatibleInterface
* @dev executes executePayload action on payload controller.
* @param performData array of proposal ids to execute.
*/
function performUpkeep(bytes calldata performData) external override {
uint40[] memory payloadIdsToExecute = abi.decode(performData, (uint40[]));
bool isActionPerformed;
// executes action on payloadIds in order from first to last
for (uint256 i = payloadIdsToExecute.length; i > 0; i--) {
uint40 payloadId = payloadIdsToExecute[i - 1];
if (_canPayloadBeExecuted(payloadId)) {
IPayloadsControllerCore(PAYLOADS_CONTROLLER).executePayload(payloadId);
isActionPerformed = true;
emit ActionSucceeded(payloadId);
}
}
if (!isActionPerformed) revert NoActionCanBePerformed();
}
/// @inheritdoc IExecutionChainRobotKeeper
function isDisabled(uint40 id) public view returns (bool) {
return _disabledProposals[id];
}
/// @inheritdoc IExecutionChainRobotKeeper
function toggleDisableAutomationById(uint256 id) external onlyOwner {
_disabledProposals[id] = !_disabledProposals[id];
}
/**
* @notice method to check if the payload could be executed.
* @param payloadId the id of the payload to check if it can be executed.
* @return true if the payload could be executed, false otherwise.
*/
function _canPayloadBeExecuted(uint40 payloadId) internal view returns (bool) {
IPayloadsControllerCore.Payload memory payload = IPayloadsControllerCore(PAYLOADS_CONTROLLER)
.getPayloadById(payloadId);
return
payload.state == IPayloadsControllerCore.PayloadState.Queued &&
block.timestamp > payload.queuedAt + payload.delay;
}
/**
* @notice method to squeeze the payloadIds array to the right size and shuffle them.
* @param payloadIds the list of payloadIds to squeeze and shuffle.
* @param actionsCount the total count of actions - used to squeeze the array to the right size.
* @return actions array squeezed and shuffled.
*/
function _squeezeAndShuffleActions(
uint40[] memory payloadIds,
uint256 actionsCount
) internal view returns (uint40[] memory) {
// we do not know the length in advance, so we init arrays with MAX_SHUFFLE_SIZE
// and then squeeze the array using mstore
assembly {
mstore(payloadIds, actionsCount)
}
// shuffle actions
for (uint256 i = 0; i < payloadIds.length; i++) {
uint256 randomNumber = uint256(
keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))
);
uint256 n = i + (randomNumber % (payloadIds.length - i));
uint40 temp = payloadIds[n];
payloadIds[n] = payloadIds[i];
payloadIds[i] = temp;
}
return payloadIds;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IRescuable} from 'solidity-utils/contracts/utils/interfaces/IRescuable.sol';
import {PayloadsControllerUtils} from '../PayloadsControllerUtils.sol';
/**
* @title IPayloadsControllerCore
* @author BGD Labs
* @notice interface containing the objects, events and methods definitions of the IPayloadsControllerCore contract
*/
interface IPayloadsControllerCore is IRescuable {
/**
* @notice Enum indicating the possible payload states
* @dev PayloadState enum defines the state machine of a payload, so the order on which the state is
defined is important. Check logic correctness if new states are added / removed
*/
enum PayloadState {
None, // state 0 left as empty
Created,
Queued,
Executed,
Cancelled,
Expired
}
/**
* @notice holds configuration of the executor
* @param executor address of the executor
* @param delay time in seconds between queuing and execution
*/
struct ExecutorConfig {
address executor;
uint40 delay;
}
/**
* @notice Object containing the information necessary to set a new executor
* @param accessLevel level of access that the executor will be assigned to
* @param executorConfig object containing the configurations for the accessLevel specified
*/
struct UpdateExecutorInput {
PayloadsControllerUtils.AccessControl accessLevel;
ExecutorConfig executorConfig;
}
/**
* @notice Object containing the information necessary to define a payload action
* @param target address of the contract that needs to be executed
* @param withDelegateCall boolean indicating if execution needs to be delegated
* @param accessLevel access level of the executor needed for the execution
* @param value value amount that needs to be sent to the executeTransaction method
* @param signature method signature that will be executed
* @param callData data needed for the execution of the signature
*/
struct ExecutionAction {
address target;
bool withDelegateCall;
PayloadsControllerUtils.AccessControl accessLevel;
uint256 value;
string signature;
bytes callData;
}
/**
* @notice Object containing a payload information
* @param creator address of the createPayload method caller
* @param maximumAccessLevelRequired min level needed to be able to execute all actions
* @param state indicates the current state of the payload
* @param createdAt time indicating when payload has been created. In seconds // max is: 1.099511628×10¹² (ie 34'865 years)
* @param queuedAt time indicating when payload has been queued. In seconds // max is: 1.099511628×10¹² (ie 34'865 years)
* @param executedAt time indicating when a payload has been executed. In seconds // max is: 1.099511628×10¹² (ie 34'865 years)
* @param cancelledAt time indicating when the payload has been cancelled. In seconds
* @param expirationTime time indicating when the Payload will expire
* @param delay time in seconds that a payload must remain queued before execution
* @param gracePeriod time in seconds that a payload has to be executed
* @param actions array of actions to be executed
*/
struct Payload {
address creator;
PayloadsControllerUtils.AccessControl maximumAccessLevelRequired;
PayloadState state;
uint40 createdAt;
uint40 queuedAt;
uint40 executedAt;
uint40 cancelledAt;
uint40 expirationTime;
uint40 delay;
uint40 gracePeriod;
ExecutionAction[] actions;
}
/**
* @notice Event emitted when an executor has been set for a determined access level
* @param accessLevel level of access that the executor will be set to
* @param executor address that will be set for the determined access level
* @param delay time in seconds between queuing and execution
*/
event ExecutorSet(
PayloadsControllerUtils.AccessControl indexed accessLevel,
address indexed executor,
uint40 delay
);
/**
* @notice Event emitted when a payload has been created
* @param payloadId id of the payload created
* @param creator address pertaining to the caller of the method createPayload
* @param actions array of the actions conforming the payload
* @param maximumAccessLevelRequired maximum level of the access control
*/
event PayloadCreated(
uint40 indexed payloadId,
address indexed creator,
ExecutionAction[] actions,
PayloadsControllerUtils.AccessControl indexed maximumAccessLevelRequired
);
/**
* @notice emitted when a cross chain message gets received
* @param originSender address that sent the message on the origin chain
* @param originChainId id of the chain where the message originated
* @param delivered flag indicating if message has been delivered
* @param message bytes containing the necessary information to queue the bridged payload id
* @param reason bytes with the revert information
*/
event PayloadExecutionMessageReceived(
address indexed originSender,
uint256 indexed originChainId,
bool indexed delivered,
bytes message,
bytes reason
);
/**
* @notice Event emitted when a payload has been executed
* @param payloadId id of the payload being enqueued
*/
event PayloadExecuted(uint40 payloadId);
/**
* @notice Event emitted when a payload has been queued
* @param payloadId id of the payload being enqueued
*/
event PayloadQueued(uint40 payloadId);
/**
* @notice Event emitted when cancelling a payload
* @param payloadId id of the cancelled payload
*/
event PayloadCancelled(uint40 payloadId);
/**
* @notice method to initialize the contract with starter params. Only callable by proxy
* @param owner address of the owner of the contract. with permissions to call certain methods
* @param guardian address of the guardian. With permissions to call certain methods
* @param executors array of executor configurations
*/
function initialize(
address owner,
address guardian,
UpdateExecutorInput[] calldata executors
) external;
/**
* @notice get the expiration delay of a payload
* @return expiration delay in seconds
*/
function EXPIRATION_DELAY() external view returns (uint40);
/**
* @notice get the maximum time in seconds that a proposal must spend being queued
* @return max delay in seconds
*/
function MAX_EXECUTION_DELAY() external view returns (uint40);
/**
* @notice get the minimum time in seconds that a proposal must spend being queued
* @return min delay in seconds
*/
function MIN_EXECUTION_DELAY() external view returns (uint40);
/**
* @notice time in seconds where the proposal can be executed (from executionTime) before it expires
* @return grace period in seconds
*/
function GRACE_PERIOD() external view returns (uint40);
/**
* @notice get a previously created payload object
* @param payloadId id of the payload to retrieve
* @return payload information
*/
function getPayloadById(
uint40 payloadId
) external view returns (Payload memory);
/**
* @notice get the current state of a payload
* @param payloadId id of the payload to retrieve the state from
* @return payload state
*/
function getPayloadState(
uint40 payloadId
) external view returns (PayloadState);
/**
* @notice get the total count of payloads created
* @return number of payloads
*/
function getPayloadsCount() external view returns (uint40);
/**
* @notice method that will create a Payload object for every action sent
* @param actions array of actions which this proposal payload will contain
* @return id of the created payload
*/
function createPayload(
ExecutionAction[] calldata actions
) external returns (uint40);
/**
* @notice method to execute a payload
* @param payloadId id of the payload that needs to be executed
*/
function executePayload(uint40 payloadId) external payable;
/**
* @notice method to cancel a payload
* @param payloadId id of the payload that needs to be canceled
*/
function cancelPayload(uint40 payloadId) external;
/**
* @notice method to add executors and its configuration
* @param executors array of UpdateExecutorInput objects
*/
function updateExecutors(UpdateExecutorInput[] calldata executors) external;
/**
* @notice method to get the executor configuration assigned to the specified level
* @param accessControl level of which we want to get the executor configuration from
* @return executor configuration
*/
function getExecutorSettingsByAccessControl(
PayloadsControllerUtils.AccessControl accessControl
) external view returns (ExecutorConfig memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {AutomationCompatibleInterface} from 'chainlink/src/v0.8/interfaces/automation/AutomationCompatibleInterface.sol';
/**
* @title IExecutionChainRobotKeeper
* @author BGD Labs
* @notice Defines the interface for the contract to automate actions for the payloads controller on execution chain.
**/
interface IExecutionChainRobotKeeper is AutomationCompatibleInterface {
/**
* @notice Emitted when performUpkeep is called and an action is executed.
* @param id payload id of successful action.
*/
event ActionSucceeded(uint256 indexed id);
/**
* @notice method to check if a payloadId is disabled.
* @param id - payloadId to check if disabled.
* @return bool if payload is disabled or not.
**/
function isDisabled(uint40 id) external view returns (bool);
/**
* @notice method called by owner to disable/enabled automation on a specific payloadId.
* @param payloadId payloadId for which we need to disable/enable automation.
*/
function toggleDisableAutomationById(uint256 payloadId) external;
/**
* @notice method to get the address of the payloads controller contract.
* @return payloads controller contract address.
*/
function PAYLOADS_CONTROLLER() external view returns (address);
/**
* @notice method to get the maximum size of payloadIds list from which we shuffle from to select a single payload to execute.
* @return max shuffle size.
*/
function MAX_SHUFFLE_SIZE() external view returns (uint256);
/**
* @notice method to get maximum number of payloads to check before the latest proposal, if an action could be performed upon.
* @return max number of skips.
*/
function MAX_SKIP() external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a
pragma solidity ^0.8.0;
import './Context.sol';
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), 'Ownable: caller is not the owner');
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), 'Ownable: new owner is the zero address');
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
/**
* @title IRescuable
* @author BGD Labs
* @notice interface containing the objects, events and methods definitions of the Rescuable contract
*/
interface IRescuable {
/**
* @notice emitted when erc20 tokens get rescued
* @param caller address that triggers the rescue
* @param token address of the rescued token
* @param to address that will receive the rescued tokens
* @param amount quantity of tokens rescued
*/
event ERC20Rescued(
address indexed caller,
address indexed token,
address indexed to,
uint256 amount
);
/**
* @notice emitted when native tokens get rescued
* @param caller address that triggers the rescue
* @param to address that will receive the rescued tokens
* @param amount quantity of tokens rescued
*/
event NativeTokensRescued(address indexed caller, address indexed to, uint256 amount);
/**
* @notice method called to rescue tokens sent erroneously to the contract. Only callable by owner
* @param erc20Token address of the token to rescue
* @param to address to send the tokens
* @param amount of tokens to rescue
*/
function emergencyTokenTransfer(address erc20Token, address to, uint256 amount) external;
/**
* @notice method called to rescue ether sent erroneously to the contract. Only callable by owner
* @param to address to send the eth
* @param amount of eth to rescue
*/
function emergencyEtherTransfer(address to, uint256 amount) external;
/**
* @notice method that defines the address that is allowed to rescue tokens
* @return the allowed address
*/
function whoCanRescue() external view returns (address);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
library PayloadsControllerUtils {
/// @notice enum with supported access levels
enum AccessControl {
Level_null, // to not use 0
Level_1, // LEVEL_1 - short executor before, listing assets, changes of assets params, updates of the protocol etc
Level_2 // LEVEL_2 - long executor before, payloads controller updates
}
/**
* @notice Object containing the necessary payload information.
* @param chain
* @param accessLevel
* @param payloadsController
* @param payloadId
*/
struct Payload {
uint256 chain;
AccessControl accessLevel;
address payloadsController; // address which holds the logic to execute after success proposal voting
uint40 payloadId; // number of the payload placed to payloadsController, max is: ~10¹²
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface AutomationCompatibleInterface {
/**
* @notice method that is simulated by the keepers to see if any work actually
* needs to be performed. This method does does not actually need to be
* executable, and since it is only ever simulated it can consume lots of gas.
* @dev To ensure that it is never called, you may want to add the
* cannotExecute modifier from KeeperBase to your implementation of this
* method.
* @param checkData specified in the upkeep registration so it is always the
* same for a registered upkeep. This can easily be broken down into specific
* arguments using `abi.decode`, so multiple upkeeps can be registered on the
* same contract and easily differentiated by the contract.
* @return upkeepNeeded boolean to indicate whether the keeper should call
* performUpkeep or not.
* @return performData bytes that the keeper should call performUpkeep with, if
* upkeep is needed. If you would like to encode data to decode later, try
* `abi.encode`.
*/
function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);
/**
* @notice method that is actually executed by the keepers, via the registry.
* The data returned by the checkUpkeep simulation will be passed into
* this method to actually be executed.
* @dev The input to this method should not be trusted, and the caller of the
* method should not even be restricted to any single registry. Anyone should
* be able call it, and the input should be validated, there is no guarantee
* that the data passed in is the performData returned from checkUpkeep. This
* could happen due to malicious keepers, racing keepers, or simply a state
* change while the performUpkeep transaction is waiting for confirmation.
* Always validate the data passed in.
* @param performData is the data which was passed back from the checkData
* simulation. If it is encoded, it can easily be decoded into other types by
* calling `abi.decode`. This data should not be trusted, and should be
* validated against the contract's current state.
*/
function performUpkeep(bytes calldata performData) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
// From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"chainlink/=lib/chainlink/contracts/",
"openzeppelin-contracts/=lib/aave-governance-v3/lib/openzeppelin-contracts/",
"aave-governance-v3/=lib/aave-governance-v3/",
"aave-address-book/=lib/aave-address-book/src/",
"aave-crosschain-infra/=lib/aave-governance-v3/lib/aave-crosschain-infra/src/",
"solidity-utils/=lib/aave-governance-v3/lib/solidity-utils/src/",
"aave-token-v3/=lib/aave-governance-v3/lib/aave-token-v3/src/",
"@aave/core-v3/=lib/aave-address-book/lib/aave-v3-core/",
"@aave/periphery-v3/=lib/aave-address-book/lib/aave-v3-periphery/",
"@openzeppelin/=lib/aave-governance-v3/lib/aave-crosschain-infra/lib/openzeppelin-contracts/",
"aave-crosschain-infra-scripts/=lib/aave-governance-v3/lib/aave-crosschain-infra/scripts/",
"aave-token-v2/=lib/aave-governance-v3/lib/aave-token-v3/lib/aave-token-v2/contracts/",
"aave-v3-core/=lib/aave-address-book/lib/aave-v3-core/",
"aave-v3-periphery/=lib/aave-address-book/lib/aave-v3-periphery/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"fx-portal/=lib/aave-governance-v3/lib/aave-crosschain-infra/lib/fx-portal/contracts/",
"hyperlane-monorepo/=lib/aave-governance-v3/lib/aave-crosschain-infra/lib/hyperlane-monorepo/",
"nitro-contracts/=lib/aave-governance-v3/lib/aave-crosschain-infra/lib/nitro-contracts/src/",
"openzeppelin/=lib/aave-governance-v3/lib/openzeppelin-contracts/contracts/",
"solidity-examples/=lib/aave-governance-v3/lib/aave-crosschain-infra/lib/solidity-examples/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"payloadsController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NoActionCanBePerformed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ActionSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_SHUFFLE_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SKIP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYLOADS_CONTROLLER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint40","name":"id","type":"uint40"}],"name":"isDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"toggleDisableAutomationById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561001057600080fd5b5060405161109c38038061109c83398101604081905261002f91610099565b61003833610049565b6001600160a01b03166080526100c9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ab57600080fd5b81516001600160a01b03811681146100c257600080fd5b9392505050565b608051610fa36100f960003960008181610112015281816102230152818161032301526105bb0152610fa36000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063715018a611610066578063715018a61461016d5780638da5cb5b14610175578063dc9d72fa14610186578063dec367391461018e578063f2fde38b146101a157600080fd5b80631f584c69146100a35780633a369c12146100be5780634585e33b146100f857806359019d421461010d5780636e04ff0d1461014c575b600080fd5b6100ab601481565b6040519081526020015b60405180910390f35b6100e86100cc366004610856565b64ffffffffff1660009081526001602052604090205460ff1690565b60405190151581526020016100b5565b61010b610106366004610873565b6101b4565b005b6101347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b5565b61015f61015a366004610873565b6102f6565b6040516100b5929190610909565b61010b6104d8565b6000546001600160a01b0316610134565b6100ab600581565b61010b61019c366004610945565b6104ec565b61010b6101af366004610973565b610514565b60006101c282840184610a48565b80519091506000905b80156102d1576000836101df600184610afd565b815181106101ef576101ef610b10565b6020026020010151905061020281610592565b156102be576040516324b36e0d60e21b815264ffffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906392cdb83490602401600060405180830381600087803b15801561026f57600080fd5b505af1158015610283573d6000803e3d6000fd5b50506040516001955064ffffffffff841692507f88befb3c8cf336ef2b6a430de625723552050a9ba7caa2cfcd5e8771981dbd619150600090a25b50806102c981610b26565b9150506101cb565b50806102f057604051630e37ffa560e41b815260040160405180910390fd5b50505050565b60408051600580825260c0820190925260009160609183916020820160a0803683370190505090506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663aa30b6ea6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a39190610b4d565b905060005b64ffffffffff8216158015906103bf575060148111155b80156103cb5750600583105b156104715760006103dd600184610b6a565b90506103ff8164ffffffffff1660009081526001602052604090205460ff1690565b61045e5761040c81610592565b15610450578085858151811061042457610424610b10565b64ffffffffff909216602092830291909101909101528361044481610b8f565b9450506000915061045e565b8161045a81610b8f565b9250505b8261046881610ba8565b935050506103a8565b82156104b6576104818484610672565b93506001845260018460405160200161049a9190610bc9565b60405160208183030381529060405295509550505050506104d1565b60006040518060200160405280600081525095509550505050505b9250929050565b6104e0610799565b6104ea60006107f3565b565b6104f4610799565b6000908152600160205260409020805460ff19811660ff90911615179055565b61051c610799565b6001600160a01b0381166105865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61058f816107f3565b50565b604051632c003d2760e11b815264ffffffffff8216600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906358007a4e90602401600060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261062a9190810190610de6565b905060028160400151600581111561064457610644610f04565b14801561066b575080610100015181608001516106619190610f1a565b64ffffffffff1642115b9392505050565b606081835260005b835181101561078e576000610690600143610afd565b604080519140602083015242908201526060016040516020818303038152906040528051906020012060001c905060008286516106cd9190610afd565b6106d79083610f38565b6106e19084610f5a565b905060008682815181106106f7576106f7610b10565b6020026020010151905086848151811061071357610713610b10565b602002602001015187838151811061072d5761072d610b10565b602002602001019064ffffffffff16908164ffffffffff16815250508087858151811061075c5761075c610b10565b602002602001019064ffffffffff16908164ffffffffff1681525050505050808061078690610b8f565b91505061067a565b508290505b92915050565b6000546001600160a01b031633146104ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161057d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b64ffffffffff8116811461058f57600080fd5b60006020828403121561086857600080fd5b813561066b81610843565b6000806020838503121561088657600080fd5b823567ffffffffffffffff8082111561089e57600080fd5b818501915085601f8301126108b257600080fd5b8135818111156108c157600080fd5b8660208285010111156108d357600080fd5b60209290920196919550909350505050565b60005b838110156109005781810151838201526020016108e8565b50506000910152565b821515815260406020820152600082518060408401526109308160608501602087016108e5565b601f01601f1916919091016060019392505050565b60006020828403121561095757600080fd5b5035919050565b6001600160a01b038116811461058f57600080fd5b60006020828403121561098557600080fd5b813561066b8161095e565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156109c9576109c9610990565b60405290565b604051610160810167ffffffffffffffff811182821017156109c9576109c9610990565b604051601f8201601f1916810167ffffffffffffffff81118282101715610a1c57610a1c610990565b604052919050565b600067ffffffffffffffff821115610a3e57610a3e610990565b5060051b60200190565b60006020808385031215610a5b57600080fd5b823567ffffffffffffffff811115610a7257600080fd5b8301601f81018513610a8357600080fd5b8035610a96610a9182610a24565b6109f3565b81815260059190911b82018301908381019087831115610ab557600080fd5b928401925b82841015610adc578335610acd81610843565b82529284019290840190610aba565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561079357610793610ae7565b634e487b7160e01b600052603260045260246000fd5b600081610b3557610b35610ae7565b506000190190565b8051610b4881610843565b919050565b600060208284031215610b5f57600080fd5b815161066b81610843565b64ffffffffff828116828216039080821115610b8857610b88610ae7565b5092915050565b600060018201610ba157610ba1610ae7565b5060010190565b600064ffffffffff821680610bbf57610bbf610ae7565b6000190192915050565b6020808252825182820181905260009190848201906040850190845b81811015610c0857835164ffffffffff1683529284019291840191600101610be5565b50909695505050505050565b8051610b488161095e565b805160038110610b4857600080fd5b805160068110610b4857600080fd5b80518015158114610b4857600080fd5b600082601f830112610c5e57600080fd5b815167ffffffffffffffff811115610c7857610c78610990565b610c8b601f8201601f19166020016109f3565b818152846020838601011115610ca057600080fd5b610cb18260208301602087016108e5565b949350505050565b600082601f830112610cca57600080fd5b81516020610cda610a9183610a24565b82815260059290921b84018101918181019086841115610cf957600080fd5b8286015b84811015610ddb57805167ffffffffffffffff80821115610d1e5760008081fd5b9088019060c0828b03601f1901811315610d385760008081fd5b610d406109a6565b610d4b888501610c14565b81526040610d5a818601610c3d565b898301526060610d6b818701610c1f565b828401526080915081860151818401525060a08086015185811115610d905760008081fd5b610d9e8f8c838a0101610c4d565b8484015250928501519284841115610db857600091508182fd5b610dc68e8b86890101610c4d565b90830152508652505050918301918301610cfd565b509695505050505050565b600060208284031215610df857600080fd5b815167ffffffffffffffff80821115610e1057600080fd5b908301906101608286031215610e2557600080fd5b610e2d6109cf565b610e3683610c14565b8152610e4460208401610c1f565b6020820152610e5560408401610c2e565b6040820152610e6660608401610b3d565b6060820152610e7760808401610b3d565b6080820152610e8860a08401610b3d565b60a0820152610e9960c08401610b3d565b60c0820152610eaa60e08401610b3d565b60e0820152610100610ebd818501610b3d565b90820152610120610ecf848201610b3d565b908201526101408381015183811115610ee757600080fd5b610ef388828701610cb9565b918301919091525095945050505050565b634e487b7160e01b600052602160045260246000fd5b64ffffffffff818116838216019080821115610b8857610b88610ae7565b600082610f5557634e487b7160e01b600052601260045260246000fd5b500690565b8082018082111561079357610793610ae756fea264697066735822122020546b6fcb11f9e71ef2cdb1c68ba875bc480333c9ce8ccc837997378c0ac53f64736f6c63430008130033000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec5
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063715018a611610066578063715018a61461016d5780638da5cb5b14610175578063dc9d72fa14610186578063dec367391461018e578063f2fde38b146101a157600080fd5b80631f584c69146100a35780633a369c12146100be5780634585e33b146100f857806359019d421461010d5780636e04ff0d1461014c575b600080fd5b6100ab601481565b6040519081526020015b60405180910390f35b6100e86100cc366004610856565b64ffffffffff1660009081526001602052604090205460ff1690565b60405190151581526020016100b5565b61010b610106366004610873565b6101b4565b005b6101347f000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec581565b6040516001600160a01b0390911681526020016100b5565b61015f61015a366004610873565b6102f6565b6040516100b5929190610909565b61010b6104d8565b6000546001600160a01b0316610134565b6100ab600581565b61010b61019c366004610945565b6104ec565b61010b6101af366004610973565b610514565b60006101c282840184610a48565b80519091506000905b80156102d1576000836101df600184610afd565b815181106101ef576101ef610b10565b6020026020010151905061020281610592565b156102be576040516324b36e0d60e21b815264ffffffffff821660048201527f000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec56001600160a01b0316906392cdb83490602401600060405180830381600087803b15801561026f57600080fd5b505af1158015610283573d6000803e3d6000fd5b50506040516001955064ffffffffff841692507f88befb3c8cf336ef2b6a430de625723552050a9ba7caa2cfcd5e8771981dbd619150600090a25b50806102c981610b26565b9150506101cb565b50806102f057604051630e37ffa560e41b815260040160405180910390fd5b50505050565b60408051600580825260c0820190925260009160609183916020820160a0803683370190505090506000807f000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec56001600160a01b031663aa30b6ea6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a39190610b4d565b905060005b64ffffffffff8216158015906103bf575060148111155b80156103cb5750600583105b156104715760006103dd600184610b6a565b90506103ff8164ffffffffff1660009081526001602052604090205460ff1690565b61045e5761040c81610592565b15610450578085858151811061042457610424610b10565b64ffffffffff909216602092830291909101909101528361044481610b8f565b9450506000915061045e565b8161045a81610b8f565b9250505b8261046881610ba8565b935050506103a8565b82156104b6576104818484610672565b93506001845260018460405160200161049a9190610bc9565b60405160208183030381529060405295509550505050506104d1565b60006040518060200160405280600081525095509550505050505b9250929050565b6104e0610799565b6104ea60006107f3565b565b6104f4610799565b6000908152600160205260409020805460ff19811660ff90911615179055565b61051c610799565b6001600160a01b0381166105865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61058f816107f3565b50565b604051632c003d2760e11b815264ffffffffff8216600482015260009081906001600160a01b037f000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec516906358007a4e90602401600060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261062a9190810190610de6565b905060028160400151600581111561064457610644610f04565b14801561066b575080610100015181608001516106619190610f1a565b64ffffffffff1642115b9392505050565b606081835260005b835181101561078e576000610690600143610afd565b604080519140602083015242908201526060016040516020818303038152906040528051906020012060001c905060008286516106cd9190610afd565b6106d79083610f38565b6106e19084610f5a565b905060008682815181106106f7576106f7610b10565b6020026020010151905086848151811061071357610713610b10565b602002602001015187838151811061072d5761072d610b10565b602002602001019064ffffffffff16908164ffffffffff16815250508087858151811061075c5761075c610b10565b602002602001019064ffffffffff16908164ffffffffff1681525050505050808061078690610b8f565b91505061067a565b508290505b92915050565b6000546001600160a01b031633146104ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161057d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b64ffffffffff8116811461058f57600080fd5b60006020828403121561086857600080fd5b813561066b81610843565b6000806020838503121561088657600080fd5b823567ffffffffffffffff8082111561089e57600080fd5b818501915085601f8301126108b257600080fd5b8135818111156108c157600080fd5b8660208285010111156108d357600080fd5b60209290920196919550909350505050565b60005b838110156109005781810151838201526020016108e8565b50506000910152565b821515815260406020820152600082518060408401526109308160608501602087016108e5565b601f01601f1916919091016060019392505050565b60006020828403121561095757600080fd5b5035919050565b6001600160a01b038116811461058f57600080fd5b60006020828403121561098557600080fd5b813561066b8161095e565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156109c9576109c9610990565b60405290565b604051610160810167ffffffffffffffff811182821017156109c9576109c9610990565b604051601f8201601f1916810167ffffffffffffffff81118282101715610a1c57610a1c610990565b604052919050565b600067ffffffffffffffff821115610a3e57610a3e610990565b5060051b60200190565b60006020808385031215610a5b57600080fd5b823567ffffffffffffffff811115610a7257600080fd5b8301601f81018513610a8357600080fd5b8035610a96610a9182610a24565b6109f3565b81815260059190911b82018301908381019087831115610ab557600080fd5b928401925b82841015610adc578335610acd81610843565b82529284019290840190610aba565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561079357610793610ae7565b634e487b7160e01b600052603260045260246000fd5b600081610b3557610b35610ae7565b506000190190565b8051610b4881610843565b919050565b600060208284031215610b5f57600080fd5b815161066b81610843565b64ffffffffff828116828216039080821115610b8857610b88610ae7565b5092915050565b600060018201610ba157610ba1610ae7565b5060010190565b600064ffffffffff821680610bbf57610bbf610ae7565b6000190192915050565b6020808252825182820181905260009190848201906040850190845b81811015610c0857835164ffffffffff1683529284019291840191600101610be5565b50909695505050505050565b8051610b488161095e565b805160038110610b4857600080fd5b805160068110610b4857600080fd5b80518015158114610b4857600080fd5b600082601f830112610c5e57600080fd5b815167ffffffffffffffff811115610c7857610c78610990565b610c8b601f8201601f19166020016109f3565b818152846020838601011115610ca057600080fd5b610cb18260208301602087016108e5565b949350505050565b600082601f830112610cca57600080fd5b81516020610cda610a9183610a24565b82815260059290921b84018101918181019086841115610cf957600080fd5b8286015b84811015610ddb57805167ffffffffffffffff80821115610d1e5760008081fd5b9088019060c0828b03601f1901811315610d385760008081fd5b610d406109a6565b610d4b888501610c14565b81526040610d5a818601610c3d565b898301526060610d6b818701610c1f565b828401526080915081860151818401525060a08086015185811115610d905760008081fd5b610d9e8f8c838a0101610c4d565b8484015250928501519284841115610db857600091508182fd5b610dc68e8b86890101610c4d565b90830152508652505050918301918301610cfd565b509695505050505050565b600060208284031215610df857600080fd5b815167ffffffffffffffff80821115610e1057600080fd5b908301906101608286031215610e2557600080fd5b610e2d6109cf565b610e3683610c14565b8152610e4460208401610c1f565b6020820152610e5560408401610c2e565b6040820152610e6660608401610b3d565b6060820152610e7760808401610b3d565b6080820152610e8860a08401610b3d565b60a0820152610e9960c08401610b3d565b60c0820152610eaa60e08401610b3d565b60e0820152610100610ebd818501610b3d565b90820152610120610ecf848201610b3d565b908201526101408381015183811115610ee757600080fd5b610ef388828701610cb9565b918301919091525095945050505050565b634e487b7160e01b600052602160045260246000fd5b64ffffffffff818116838216019080821115610b8857610b88610ae7565b600082610f5557634e487b7160e01b600052601260045260246000fd5b500690565b8082018082111561079357610793610ae756fea264697066735822122020546b6fcb11f9e71ef2cdb1c68ba875bc480333c9ce8ccc837997378c0ac53f64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec5
-----Decoded View---------------
Arg [0] : payloadsController (address): 0xdAbad81aF85554E9ae636395611C58F7eC1aAEc5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000dabad81af85554e9ae636395611c58f7ec1aaec5
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.