Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EpochController
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "../chainlink/AutomationCompatible.sol";
import "../interfaces/IMinter.sol";
import "../interfaces/IVoter.sol";
import "../interfaces/IVersionable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
/**
* @title EpochController
* @notice Chainlink Automation-compatible controller for epoch distribution
* @dev This contract manages the distribution of rewards to gauges in batches.
*
* IMPORTANT: This contract does NOT support gauge skipping/locking.
* VoterV5 requires ALL gauges to be distributed each epoch for accurate
* reward calculations. Skipping gauges would cause calculation errors.
*
* Features:
* - Batched gauge distribution (gas-limited via maxLoops)
* - Chainlink Automation compatible (checkUpkeep/performUpkeep)
* - bypassUpkeep flag for manual intervention when automation fails
* - Open performUpkeep (anyone can call to help complete distribution)
*/
contract EpochController is AutomationCompatibleInterface, OwnableUpgradeable, IVersionable {
/**
* @notice Contract version for upgrade tracking (major versions must be upgrade-safe)
*
* v1.1.0:
* - Removed caller restriction on performUpkeep (anyone can call)
* - Added bypassUpkeep flag for manual intervention when automation fails
* - Added setBypassUpkeep() to toggle bypass mode
* - Added setIndex() for recovery scenarios
* - Added events: SetBypassUpkeep, SetIndex, SetMaxLoops
* - Deprecated automationRegistry (renamed to _automationRegistry_DEPRECATED)
* - Removed setAutomationRegistry() function
* - Implemented IVersionable interface
*/
string public constant VERSION = "v1.1.0";
uint256 private constant _LAST_COMPLETED_NEEDS_UPDATE = 1;
/// @dev Maintained for backwards compatible storage layout. Do not remove or reorder.
address private __automationRegistry_DEPRECATED;
IVoter public voter;
IMinter public minter;
/// @notice Last time automation was called
uint256 public lastCalledAt;
/// @notice Last time automation completed all distribution
uint256 public lastCompletedAt;
/// @notice Delta from lastCompletedAt and the previous completion
uint256 public deltaTimestamp;
/// @notice Max number of gauges for batch (used to limit gas on each call)
uint256 public maxLoops;
/// @notice Track current position in gauge iteration
uint256 public index;
/// @notice Whether to bypass the upkeep check (for manual intervention)
bool public bypassUpkeep;
uint256[49] private __gap;
/* ========== EVENTS ========== */
event SetBypassUpkeep(bool bypass);
event SetIndex(uint256 index);
event SetMaxLoops(uint256 maxLoops);
constructor() {
_disableInitializers();
}
function initialize(IMinter _minter, IVoter _voter) public initializer {
__Ownable_init();
minter = _minter;
voter = _voter;
lastCompletedAt = _LAST_COMPLETED_NEEDS_UPDATE;
}
function checkUpkeep(
bytes memory /*checkdata*/
) public view override returns (bool upkeepNeeded, bytes memory /*performData*/) {
upkeepNeeded = minter.check();
/// @dev Minter starts off with type(uint256).max temporarily
if (lastCompletedAt == _LAST_COMPLETED_NEEDS_UPDATE) {
return (upkeepNeeded, "0x");
}
if (block.timestamp - lastCompletedAt > minter.WEEK()) {
upkeepNeeded = true;
}
}
/// @notice Execute the epoch distribution
/// @dev Anyone can call this function. If bypassUpkeep is false, checkUpkeep must return true.
function performUpkeep(bytes calldata /*performData*/) external override {
if (!bypassUpkeep) {
(bool upkeepNeeded, ) = checkUpkeep("0");
require(upkeepNeeded, "condition not met");
}
_performUpkeep();
}
function _performUpkeep() internal {
lastCalledAt = block.timestamp;
address[] memory tempGauges = new address[](maxLoops);
uint256 i = 0;
for (; i < maxLoops && index < voter.length(); i++) {
address gauge = voter.gauges(voter.pools(index));
if (gauge != address(0) && voter.isAlive(gauge)) {
tempGauges[i] = gauge;
} else if (i > 0) {
i--; // Rerun this index to fill with a valid gauge
}
index++;
}
if (i >= maxLoops) {
voter.distribute(tempGauges);
} else {
address[] memory gauges = new address[](i);
for (uint256 j = 0; j < i; j++) {
gauges[j] = tempGauges[j];
}
if (gauges.length > 0) {
voter.distribute(gauges);
}
}
if (index >= voter.length()) {
deltaTimestamp = block.timestamp - lastCompletedAt;
lastCompletedAt = minter.active_period();
index = 0;
}
}
/* ========== ADMIN FUNCTIONS ========== */
/// @notice Set the maximum number of gauges to process per call
function setMaxLoops(uint256 _maxLoops) external onlyOwner {
maxLoops = _maxLoops;
emit SetMaxLoops(_maxLoops);
}
/// @notice Set whether to bypass the upkeep check
/// @dev Use this for manual intervention when automation reports false but epoch needs flipping
function setBypassUpkeep(bool _bypass) external onlyOwner {
bypassUpkeep = _bypass;
emit SetBypassUpkeep(_bypass);
}
/// @notice Manually set the index for recovery scenarios
/// @dev Use with caution - incorrect values may cause distribution issues
function setIndex(uint256 _index) external onlyOwner {
index = _index;
emit SetIndex(_index);
}
function setVoter(IVoter _voter) external onlyOwner {
require(address(_voter) != address(0));
voter = _voter;
}
function setMinter(address _minter) external onlyOwner {
require(_minter != address(0));
minter = IMinter(_minter);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract AutomationBase {
error OnlySimulatedBackend();
/**
* @notice method that allows it to be simulated via eth_call by checking that
* the sender is the zero address.
*/
function preventExecution() internal view {
if (tx.origin != address(0)) {
revert OnlySimulatedBackend();
}
}
/**
* @notice modifier that allows it to be simulated via eth_call by checking
* that the sender is the zero address.
*/
modifier cannotExecute() {
preventExecution();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./AutomationBase.sol";
import "./AutomationCompatibleInterface.sol";
abstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}// 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
pragma solidity 0.8.13;
interface IMinter {
function update_period() external returns (uint256);
function check() external view returns(bool);
function period() external view returns(uint256);
function active_period() external view returns(uint256);
function WEEK() external view returns(uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IVersionable {
function VERSION() external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IVoter {
function length() external view returns (uint);
function pools(uint index) external view returns (address);
function isAlive(address _gauge) external view returns (bool);
function ve() external view returns (address);
function gauges(address _pair) external view returns (address);
function isGauge(address _gauge) external view returns (bool);
function poolForGauge(address _gauge) external view returns (address);
function factory() external view returns (address);
function minter() external view returns(address);
function isWhitelisted(address token) external view returns (bool);
function notifyRewardAmount(uint amount) external;
function distributeAll() external;
function distribute(address[] memory _gauges) external;
function distributeFees(address[] memory _gauges) external;
function internal_bribes(address _gauge) external view returns (address);
function external_bribes(address _gauge) external view returns (address);
function usedWeights(uint id) external view returns(uint);
function lastVoted(uint id) external view returns(uint);
function poolVote(uint id, uint _index) external view returns(address _pair);
function votes(uint id, address _pool) external view returns(uint votes);
function poolVoteLength(uint tokenId) external view returns(uint);
function attachTokenToGauge(uint _tokenId, address account) external;
function detachTokenFromGauge(uint _tokenId, address account) external;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"bypass","type":"bool"}],"name":"SetBypassUpkeep","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"SetIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxLoops","type":"uint256"}],"name":"SetMaxLoops","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bypassUpkeep","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deltaTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMinter","name":"_minter","type":"address"},{"internalType":"contract IVoter","name":"_voter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastCalledAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCompletedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLoops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"contract IMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bypass","type":"bool"}],"name":"setBypassUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"setIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLoops","type":"uint256"}],"name":"setMaxLoops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVoter","name":"_voter","type":"address"}],"name":"setVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061001961001e565b6100dd565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100db576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611208806100ec6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063df032c8011610071578063df032c801461025e578063f2fde38b14610267578063f8a921af1461027a578063fca3b5aa1461028d578063ffa1ad74146102a057600080fd5b80638da5cb5b1461020b57806393fd2c4c1461021c578063a573b4471461022f578063af2fcc1514610238578063da78c3e91461025557600080fd5b806346c96aac116100f457806346c96aac146101a9578063485cc955146101bc5780634bc2a657146101cf5780636e04ff0d146101e2578063715018a61461020357600080fd5b806307546172146101315780632986c0e51461016157806340a5737f146101785780634213bc8f1461018d5780634585e33b14610196575b600080fd5b606754610144906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61016a606c5481565b604051908152602001610158565b61018b610186366004610e02565b6102d2565b005b61016a606b5481565b61018b6101a4366004610e1b565b610316565b606654610144906001600160a01b031681565b61018b6101ca366004610ea2565b61039b565b61018b6101dd366004610edb565b6104e3565b6101f56101f0366004610f15565b610520565b604051610158929190611013565b61018b61065c565b6033546001600160a01b0316610144565b61018b61022a366004611044565b610670565b61016a60685481565b606d546102459060ff1681565b6040519015158152602001610158565b61016a60695481565b61016a606a5481565b61018b610275366004610edb565b6106b9565b61018b610288366004610e02565b610732565b61018b61029b366004610edb565b61076f565b6102c560405180604001604052806006815260200165076312e312e360d41b81525081565b6040516101589190611061565b6102da6107ac565b606c8190556040518181527fe0f56ff65799b4f6ff5b24871ec08f73b36d933db31d1452d59d2af94db99a14906020015b60405180910390a150565b606d5460ff1661038f576000610344604051806040016040528060018152602001600360fc1b815250610520565b5090508061038d5760405162461bcd60e51b815260206004820152601160248201527018dbdb991a5d1a5bdb881b9bdd081b595d607a1b60448201526064015b60405180910390fd5b505b610397610806565b5050565b600054610100900460ff16158080156103bb5750600054600160ff909116105b806103d55750303b1580156103d5575060005460ff166001145b6104385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610384565b6000805460ff19166001179055801561045b576000805461ff0019166101001790555b610463610d51565b606780546001600160a01b038086166001600160a01b0319928316179092556066805492851692909116919091179055600160695580156104de576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6104eb6107ac565b6001600160a01b0381166104fe57600080fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60006060606760009054906101000a90046001600160a01b03166001600160a01b031663919840ad6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059b9190611074565b91506001606954036105c85750604080518082019091526002815261060f60f31b60208201529092909150565b606760009054906101000a90046001600160a01b03166001600160a01b031663f4359ce56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611091565b60695461064c90426110c0565b111561065757600191505b915091565b6106646107ac565b61066e6000610d80565b565b6106786107ac565b606d805460ff19168215159081179091556040519081527fdf09a69e721dff79055aec288c9185a198ac955697b5749a18d6f71a33afa05e9060200161030b565b6106c16107ac565b6001600160a01b0381166107265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610384565b61072f81610d80565b50565b61073a6107ac565b606b8190556040518181527f08972723bedeccc8ca466347b57b65ea334b564007a9ec9893ad74d54513c0fc9060200161030b565b6107776107ac565b6001600160a01b03811661078a57600080fd5b606780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461066e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610384565b42606855606b5460009067ffffffffffffffff81111561082857610828610eff565b604051908082528060200260200182016040528015610851578160200160208202803683370190505b50905060005b606b54811080156108df5750606660009054906101000a90046001600160a01b03166001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da9190611091565b606c54105b15610ac357606654606c546040516315895f4760e31b815260048101919091526000916001600160a01b03169063b9a09fd590829063ac4afa3890602401602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e91906110d7565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156109a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c691906110d7565b90506001600160a01b03811615801590610a495750606654604051631703e5f960e01b81526001600160a01b03838116600483015290911690631703e5f990602401602060405180830381865afa158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a499190611074565b15610a865780838381518110610a6157610a616110f4565b60200260200101906001600160a01b031690816001600160a01b031681525050610a9a565b8115610a9a5781610a968161110a565b9250505b606c8054906000610aaa83611121565b9190505550508080610abb90611121565b915050610857565b606b548110610b3357606654604051636138889b60e01b81526001600160a01b0390911690636138889b90610afc90859060040161113a565b600060405180830381600087803b158015610b1657600080fd5b505af1158015610b2a573d6000803e3d6000fd5b50505050610c48565b60008167ffffffffffffffff811115610b4e57610b4e610eff565b604051908082528060200260200182016040528015610b77578160200160208202803683370190505b50905060005b82811015610bdb57838181518110610b9757610b976110f4565b6020026020010151828281518110610bb157610bb16110f4565b6001600160a01b039092166020928302919091019091015280610bd381611121565b915050610b7d565b50805115610c4657606654604051636138889b60e01b81526001600160a01b0390911690636138889b90610c1390849060040161113a565b600060405180830381600087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050505b505b606660009054906101000a90046001600160a01b03166001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611091565b606c541061039757606954610cd490426110c0565b606a5560675460408051631a2732c160e31b815290516001600160a01b039092169163d1399608916004808201926020929091908290030181865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611091565b6069556000606c555050565b600054610100900460ff16610d785760405162461bcd60e51b815260040161038490611187565b61066e610dd2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610df95760405162461bcd60e51b815260040161038490611187565b61066e33610d80565b600060208284031215610e1457600080fd5b5035919050565b60008060208385031215610e2e57600080fd5b823567ffffffffffffffff80821115610e4657600080fd5b818501915085601f830112610e5a57600080fd5b813581811115610e6957600080fd5b866020828501011115610e7b57600080fd5b60209290920196919550909350505050565b6001600160a01b038116811461072f57600080fd5b60008060408385031215610eb557600080fd5b8235610ec081610e8d565b91506020830135610ed081610e8d565b809150509250929050565b600060208284031215610eed57600080fd5b8135610ef881610e8d565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610f2757600080fd5b813567ffffffffffffffff80821115610f3f57600080fd5b818401915084601f830112610f5357600080fd5b813581811115610f6557610f65610eff565b604051601f8201601f19908116603f01168101908382118183101715610f8d57610f8d610eff565b81604052828152876020848701011115610fa657600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610fec57602081850181015186830182015201610fd0565b81811115610ffe576000602083870101525b50601f01601f19169290920160200192915050565b821515815260406020820152600061102e6040830184610fc6565b949350505050565b801515811461072f57600080fd5b60006020828403121561105657600080fd5b8135610ef881611036565b602081526000610ef86020830184610fc6565b60006020828403121561108657600080fd5b8151610ef881611036565b6000602082840312156110a357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156110d2576110d26110aa565b500390565b6000602082840312156110e957600080fd5b8151610ef881610e8d565b634e487b7160e01b600052603260045260246000fd5b600081611119576111196110aa565b506000190190565b600060018201611133576111336110aa565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101561117b5783516001600160a01b031683529284019291840191600101611156565b50909695505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212201dd0d3b65644d7ac2c8a29a58f72d74143ee9cfa556dcec9d9903d9fc206337664736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063df032c8011610071578063df032c801461025e578063f2fde38b14610267578063f8a921af1461027a578063fca3b5aa1461028d578063ffa1ad74146102a057600080fd5b80638da5cb5b1461020b57806393fd2c4c1461021c578063a573b4471461022f578063af2fcc1514610238578063da78c3e91461025557600080fd5b806346c96aac116100f457806346c96aac146101a9578063485cc955146101bc5780634bc2a657146101cf5780636e04ff0d146101e2578063715018a61461020357600080fd5b806307546172146101315780632986c0e51461016157806340a5737f146101785780634213bc8f1461018d5780634585e33b14610196575b600080fd5b606754610144906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61016a606c5481565b604051908152602001610158565b61018b610186366004610e02565b6102d2565b005b61016a606b5481565b61018b6101a4366004610e1b565b610316565b606654610144906001600160a01b031681565b61018b6101ca366004610ea2565b61039b565b61018b6101dd366004610edb565b6104e3565b6101f56101f0366004610f15565b610520565b604051610158929190611013565b61018b61065c565b6033546001600160a01b0316610144565b61018b61022a366004611044565b610670565b61016a60685481565b606d546102459060ff1681565b6040519015158152602001610158565b61016a60695481565b61016a606a5481565b61018b610275366004610edb565b6106b9565b61018b610288366004610e02565b610732565b61018b61029b366004610edb565b61076f565b6102c560405180604001604052806006815260200165076312e312e360d41b81525081565b6040516101589190611061565b6102da6107ac565b606c8190556040518181527fe0f56ff65799b4f6ff5b24871ec08f73b36d933db31d1452d59d2af94db99a14906020015b60405180910390a150565b606d5460ff1661038f576000610344604051806040016040528060018152602001600360fc1b815250610520565b5090508061038d5760405162461bcd60e51b815260206004820152601160248201527018dbdb991a5d1a5bdb881b9bdd081b595d607a1b60448201526064015b60405180910390fd5b505b610397610806565b5050565b600054610100900460ff16158080156103bb5750600054600160ff909116105b806103d55750303b1580156103d5575060005460ff166001145b6104385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610384565b6000805460ff19166001179055801561045b576000805461ff0019166101001790555b610463610d51565b606780546001600160a01b038086166001600160a01b0319928316179092556066805492851692909116919091179055600160695580156104de576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6104eb6107ac565b6001600160a01b0381166104fe57600080fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60006060606760009054906101000a90046001600160a01b03166001600160a01b031663919840ad6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059b9190611074565b91506001606954036105c85750604080518082019091526002815261060f60f31b60208201529092909150565b606760009054906101000a90046001600160a01b03166001600160a01b031663f4359ce56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611091565b60695461064c90426110c0565b111561065757600191505b915091565b6106646107ac565b61066e6000610d80565b565b6106786107ac565b606d805460ff19168215159081179091556040519081527fdf09a69e721dff79055aec288c9185a198ac955697b5749a18d6f71a33afa05e9060200161030b565b6106c16107ac565b6001600160a01b0381166107265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610384565b61072f81610d80565b50565b61073a6107ac565b606b8190556040518181527f08972723bedeccc8ca466347b57b65ea334b564007a9ec9893ad74d54513c0fc9060200161030b565b6107776107ac565b6001600160a01b03811661078a57600080fd5b606780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461066e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610384565b42606855606b5460009067ffffffffffffffff81111561082857610828610eff565b604051908082528060200260200182016040528015610851578160200160208202803683370190505b50905060005b606b54811080156108df5750606660009054906101000a90046001600160a01b03166001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da9190611091565b606c54105b15610ac357606654606c546040516315895f4760e31b815260048101919091526000916001600160a01b03169063b9a09fd590829063ac4afa3890602401602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e91906110d7565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156109a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c691906110d7565b90506001600160a01b03811615801590610a495750606654604051631703e5f960e01b81526001600160a01b03838116600483015290911690631703e5f990602401602060405180830381865afa158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a499190611074565b15610a865780838381518110610a6157610a616110f4565b60200260200101906001600160a01b031690816001600160a01b031681525050610a9a565b8115610a9a5781610a968161110a565b9250505b606c8054906000610aaa83611121565b9190505550508080610abb90611121565b915050610857565b606b548110610b3357606654604051636138889b60e01b81526001600160a01b0390911690636138889b90610afc90859060040161113a565b600060405180830381600087803b158015610b1657600080fd5b505af1158015610b2a573d6000803e3d6000fd5b50505050610c48565b60008167ffffffffffffffff811115610b4e57610b4e610eff565b604051908082528060200260200182016040528015610b77578160200160208202803683370190505b50905060005b82811015610bdb57838181518110610b9757610b976110f4565b6020026020010151828281518110610bb157610bb16110f4565b6001600160a01b039092166020928302919091019091015280610bd381611121565b915050610b7d565b50805115610c4657606654604051636138889b60e01b81526001600160a01b0390911690636138889b90610c1390849060040161113a565b600060405180830381600087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050505b505b606660009054906101000a90046001600160a01b03166001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf9190611091565b606c541061039757606954610cd490426110c0565b606a5560675460408051631a2732c160e31b815290516001600160a01b039092169163d1399608916004808201926020929091908290030181865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611091565b6069556000606c555050565b600054610100900460ff16610d785760405162461bcd60e51b815260040161038490611187565b61066e610dd2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610df95760405162461bcd60e51b815260040161038490611187565b61066e33610d80565b600060208284031215610e1457600080fd5b5035919050565b60008060208385031215610e2e57600080fd5b823567ffffffffffffffff80821115610e4657600080fd5b818501915085601f830112610e5a57600080fd5b813581811115610e6957600080fd5b866020828501011115610e7b57600080fd5b60209290920196919550909350505050565b6001600160a01b038116811461072f57600080fd5b60008060408385031215610eb557600080fd5b8235610ec081610e8d565b91506020830135610ed081610e8d565b809150509250929050565b600060208284031215610eed57600080fd5b8135610ef881610e8d565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610f2757600080fd5b813567ffffffffffffffff80821115610f3f57600080fd5b818401915084601f830112610f5357600080fd5b813581811115610f6557610f65610eff565b604051601f8201601f19908116603f01168101908382118183101715610f8d57610f8d610eff565b81604052828152876020848701011115610fa657600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000815180845260005b81811015610fec57602081850181015186830182015201610fd0565b81811115610ffe576000602083870101525b50601f01601f19169290920160200192915050565b821515815260406020820152600061102e6040830184610fc6565b949350505050565b801515811461072f57600080fd5b60006020828403121561105657600080fd5b8135610ef881611036565b602081526000610ef86020830184610fc6565b60006020828403121561108657600080fd5b8151610ef881611036565b6000602082840312156110a357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156110d2576110d26110aa565b500390565b6000602082840312156110e957600080fd5b8151610ef881610e8d565b634e487b7160e01b600052603260045260246000fd5b600081611119576111196110aa565b506000190190565b600060018201611133576111336110aa565b5060010190565b6020808252825182820181905260009190848201906040850190845b8181101561117b5783516001600160a01b031683529284019291840191600101611156565b50909695505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212201dd0d3b65644d7ac2c8a29a58f72d74143ee9cfa556dcec9d9903d9fc206337664736f6c634300080d0033
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.