Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Multichain Info
N/A
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EmissionManager
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 100000 runs
Other Settings:
berlin EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
import {Ownable} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/Ownable.sol';
import {IEACAggregatorProxy} from '../misc/interfaces/IEACAggregatorProxy.sol';
import {IEmissionManager} from './interfaces/IEmissionManager.sol';
import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol';
import {IRewardsController} from './interfaces/IRewardsController.sol';
import {RewardsDataTypes} from './libraries/RewardsDataTypes.sol';
/**
* @title EmissionManager
* @author Aave
* @notice It manages the list of admins of reward emissions and provides functions to control reward emissions.
*/
contract EmissionManager is Ownable, IEmissionManager {
// reward => emissionAdmin
mapping(address => address) internal _emissionAdmins;
IRewardsController internal _rewardsController;
/**
* @dev Only emission admin of the given reward can call functions marked by this modifier.
**/
modifier onlyEmissionAdmin(address reward) {
require(msg.sender == _emissionAdmins[reward], 'ONLY_EMISSION_ADMIN');
_;
}
/**
* Constructor.
* @param owner The address of the owner
*/
constructor(address owner) {
transferOwnership(owner);
}
/// @inheritdoc IEmissionManager
function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external override {
for (uint256 i = 0; i < config.length; i++) {
require(_emissionAdmins[config[i].reward] == msg.sender, 'ONLY_EMISSION_ADMIN');
}
_rewardsController.configureAssets(config);
}
/// @inheritdoc IEmissionManager
function setTransferStrategy(
address reward,
ITransferStrategyBase transferStrategy
) external override onlyEmissionAdmin(reward) {
_rewardsController.setTransferStrategy(reward, transferStrategy);
}
/// @inheritdoc IEmissionManager
function setRewardOracle(
address reward,
IEACAggregatorProxy rewardOracle
) external override onlyEmissionAdmin(reward) {
_rewardsController.setRewardOracle(reward, rewardOracle);
}
/// @inheritdoc IEmissionManager
function setDistributionEnd(
address asset,
address reward,
uint32 newDistributionEnd
) external override onlyEmissionAdmin(reward) {
_rewardsController.setDistributionEnd(asset, reward, newDistributionEnd);
}
/// @inheritdoc IEmissionManager
function setEmissionPerSecond(
address asset,
address[] calldata rewards,
uint88[] calldata newEmissionsPerSecond
) external override {
for (uint256 i = 0; i < rewards.length; i++) {
require(_emissionAdmins[rewards[i]] == msg.sender, 'ONLY_EMISSION_ADMIN');
}
_rewardsController.setEmissionPerSecond(asset, rewards, newEmissionsPerSecond);
}
/// @inheritdoc IEmissionManager
function setClaimer(address user, address claimer) external override onlyOwner {
_rewardsController.setClaimer(user, claimer);
}
/// @inheritdoc IEmissionManager
function setEmissionAdmin(address reward, address admin) external override onlyOwner {
address oldAdmin = _emissionAdmins[reward];
_emissionAdmins[reward] = admin;
emit EmissionAdminUpdated(reward, oldAdmin, admin);
}
/// @inheritdoc IEmissionManager
function setRewardsController(address controller) external override onlyOwner {
_rewardsController = IRewardsController(controller);
}
/// @inheritdoc IEmissionManager
function getRewardsController() external view override returns (IRewardsController) {
return _rewardsController;
}
/// @inheritdoc IEmissionManager
function getEmissionAdmin(address reward) external view override returns (address) {
return _emissionAdmins[reward];
}
}// SPDX-License-Identifier: MIT
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 GSN 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 payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
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.
*/
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() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
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 {
emit OwnershipTransferred(_owner, address(0));
_owner = 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');
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
interface IEACAggregatorProxy {
function decimals() external view returns (uint8);
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);
event NewRound(uint256 indexed roundId, address indexed startedBy);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol';
import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol';
import {ITransferStrategyBase} from './ITransferStrategyBase.sol';
import {IRewardsController} from './IRewardsController.sol';
/**
* @title IEmissionManager
* @author Aave
* @notice Defines the basic interface for the Emission Manager
*/
interface IEmissionManager {
/**
* @dev Emitted when the admin of a reward emission is updated.
* @param reward The address of the rewarding token
* @param oldAdmin The address of the old emission admin
* @param newAdmin The address of the new emission admin
*/
event EmissionAdminUpdated(
address indexed reward,
address indexed oldAdmin,
address indexed newAdmin
);
/**
* @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution.
* @dev Only callable by the emission admin of the given rewards
* @param config The assets configuration input, the list of structs contains the following fields:
* uint104 emissionPerSecond: The emission per second following rewards unit decimals.
* uint256 totalSupply: The total supply of the asset to incentivize
* uint40 distributionEnd: The end of the distribution of the incentives for an asset
* address asset: The asset address to incentivize
* address reward: The reward token address
* ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic.
* IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend.
* Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible.
*/
function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external;
/**
* @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer
* @dev Only callable by the emission admin of the given reward
* @param reward The address of the reward token
* @param transferStrategy The address of the TransferStrategy logic contract
*/
function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external;
/**
* @dev Sets an Aave Oracle contract to enforce rewards with a source of value.
* @dev Only callable by the emission admin of the given reward
* @notice At the moment of reward configuration, the Incentives Controller performs
* a check to see if the reward asset oracle is compatible with IEACAggregator proxy.
* This check is enforced for integrators to be able to show incentives at
* the current Aave UI without the need to setup an external price registry
* @param reward The address of the reward to set the price aggregator
* @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface
*/
function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external;
/**
* @dev Sets the end date for the distribution
* @dev Only callable by the emission admin of the given reward
* @param asset The asset to incentivize
* @param reward The reward token that incentives the asset
* @param newDistributionEnd The end date of the incentivization, in unix time format
**/
function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external;
/**
* @dev Sets the emission per second of a set of reward distributions
* @param asset The asset is being incentivized
* @param rewards List of reward addresses are being distributed
* @param newEmissionsPerSecond List of new reward emissions per second
*/
function setEmissionPerSecond(
address asset,
address[] calldata rewards,
uint88[] calldata newEmissionsPerSecond
) external;
/**
* @dev Whitelists an address to claim the rewards on behalf of another address
* @dev Only callable by the owner of the EmissionManager
* @param user The address of the user
* @param claimer The address of the claimer
*/
function setClaimer(address user, address claimer) external;
/**
* @dev Updates the admin of the reward emission
* @dev Only callable by the owner of the EmissionManager
* @param reward The address of the reward token
* @param admin The address of the new admin of the emission
*/
function setEmissionAdmin(address reward, address admin) external;
/**
* @dev Updates the address of the rewards controller
* @dev Only callable by the owner of the EmissionManager
* @param controller the address of the RewardsController contract
*/
function setRewardsController(address controller) external;
/**
* @dev Returns the rewards controller address
* @return The address of the RewardsController contract
*/
function getRewardsController() external view returns (IRewardsController);
/**
* @dev Returns the admin of the given reward emission
* @param reward The address of the reward token
* @return The address of the emission admin
*/
function getEmissionAdmin(address reward) external view returns (address);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
import {IRewardsDistributor} from './IRewardsDistributor.sol';
import {ITransferStrategyBase} from './ITransferStrategyBase.sol';
import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol';
import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol';
/**
* @title IRewardsController
* @author Aave
* @notice Defines the basic interface for a Rewards Controller.
*/
interface IRewardsController is IRewardsDistributor {
/**
* @dev Emitted when a new address is whitelisted as claimer of rewards on behalf of a user
* @param user The address of the user
* @param claimer The address of the claimer
*/
event ClaimerSet(address indexed user, address indexed claimer);
/**
* @dev Emitted when rewards are claimed
* @param user The address of the user rewards has been claimed on behalf of
* @param reward The address of the token reward is claimed
* @param to The address of the receiver of the rewards
* @param claimer The address of the claimer
* @param amount The amount of rewards claimed
*/
event RewardsClaimed(
address indexed user,
address indexed reward,
address indexed to,
address claimer,
uint256 amount
);
/**
* @dev Emitted when a transfer strategy is installed for the reward distribution
* @param reward The address of the token reward
* @param transferStrategy The address of TransferStrategy contract
*/
event TransferStrategyInstalled(address indexed reward, address indexed transferStrategy);
/**
* @dev Emitted when the reward oracle is updated
* @param reward The address of the token reward
* @param rewardOracle The address of oracle
*/
event RewardOracleUpdated(address indexed reward, address indexed rewardOracle);
/**
* @dev Whitelists an address to claim the rewards on behalf of another address
* @param user The address of the user
* @param claimer The address of the claimer
*/
function setClaimer(address user, address claimer) external;
/**
* @dev Sets a TransferStrategy logic contract that determines the logic of the rewards transfer
* @param reward The address of the reward token
* @param transferStrategy The address of the TransferStrategy logic contract
*/
function setTransferStrategy(address reward, ITransferStrategyBase transferStrategy) external;
/**
* @dev Sets an Aave Oracle contract to enforce rewards with a source of value.
* @notice At the moment of reward configuration, the Incentives Controller performs
* a check to see if the reward asset oracle is compatible with IEACAggregator proxy.
* This check is enforced for integrators to be able to show incentives at
* the current Aave UI without the need to setup an external price registry
* @param reward The address of the reward to set the price aggregator
* @param rewardOracle The address of price aggregator that follows IEACAggregatorProxy interface
*/
function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external;
/**
* @dev Get the price aggregator oracle address
* @param reward The address of the reward
* @return The price oracle of the reward
*/
function getRewardOracle(address reward) external view returns (address);
/**
* @dev Returns the whitelisted claimer for a certain address (0x0 if not set)
* @param user The address of the user
* @return The claimer address
*/
function getClaimer(address user) external view returns (address);
/**
* @dev Returns the Transfer Strategy implementation contract address being used for a reward address
* @param reward The address of the reward
* @return The address of the TransferStrategy contract
*/
function getTransferStrategy(address reward) external view returns (address);
/**
* @dev Configure assets to incentivize with an emission of rewards per second until the end of distribution.
* @param config The assets configuration input, the list of structs contains the following fields:
* uint104 emissionPerSecond: The emission per second following rewards unit decimals.
* uint256 totalSupply: The total supply of the asset to incentivize
* uint40 distributionEnd: The end of the distribution of the incentives for an asset
* address asset: The asset address to incentivize
* address reward: The reward token address
* ITransferStrategy transferStrategy: The TransferStrategy address with the install hook and claim logic.
* IEACAggregatorProxy rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend.
* Must follow Chainlink Aggregator IEACAggregatorProxy interface to be compatible.
*/
function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external;
/**
* @dev Called by the corresponding asset on transfer hook in order to update the rewards distribution.
* @dev The units of `totalSupply` and `userBalance` should be the same.
* @param user The address of the user whose asset balance has changed
* @param totalSupply The total supply of the asset prior to user balance change
* @param userBalance The previous user balance prior to balance change
**/
function handleAction(address user, uint256 totalSupply, uint256 userBalance) external;
/**
* @dev Claims reward for a user to the desired address, on all the assets of the pool, accumulating the pending rewards
* @param assets List of assets to check eligible distributions before claiming rewards
* @param amount The amount of rewards to claim
* @param to The address that will be receiving the rewards
* @param reward The address of the reward token
* @return The amount of rewards claimed
**/
function claimRewards(
address[] calldata assets,
uint256 amount,
address to,
address reward
) external returns (uint256);
/**
* @dev Claims reward for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The
* caller must be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager
* @param assets The list of assets to check eligible distributions before claiming rewards
* @param amount The amount of rewards to claim
* @param user The address to check and claim rewards
* @param to The address that will be receiving the rewards
* @param reward The address of the reward token
* @return The amount of rewards claimed
**/
function claimRewardsOnBehalf(
address[] calldata assets,
uint256 amount,
address user,
address to,
address reward
) external returns (uint256);
/**
* @dev Claims reward for msg.sender, on all the assets of the pool, accumulating the pending rewards
* @param assets The list of assets to check eligible distributions before claiming rewards
* @param amount The amount of rewards to claim
* @param reward The address of the reward token
* @return The amount of rewards claimed
**/
function claimRewardsToSelf(
address[] calldata assets,
uint256 amount,
address reward
) external returns (uint256);
/**
* @dev Claims all rewards for a user to the desired address, on all the assets of the pool, accumulating the pending rewards
* @param assets The list of assets to check eligible distributions before claiming rewards
* @param to The address that will be receiving the rewards
* @return rewardsList List of addresses of the reward tokens
* @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardList"
**/
function claimAllRewards(
address[] calldata assets,
address to
) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts);
/**
* @dev Claims all rewards for a user on behalf, on all the assets of the pool, accumulating the pending rewards. The caller must
* be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager
* @param assets The list of assets to check eligible distributions before claiming rewards
* @param user The address to check and claim rewards
* @param to The address that will be receiving the rewards
* @return rewardsList List of addresses of the reward tokens
* @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList"
**/
function claimAllRewardsOnBehalf(
address[] calldata assets,
address user,
address to
) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts);
/**
* @dev Claims all reward for msg.sender, on all the assets of the pool, accumulating the pending rewards
* @param assets The list of assets to check eligible distributions before claiming rewards
* @return rewardsList List of addresses of the reward tokens
* @return claimedAmounts List that contains the claimed amount per reward, following same order as "rewardsList"
**/
function claimAllRewardsToSelf(
address[] calldata assets
) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
/**
* @title IRewardsDistributor
* @author Aave
* @notice Defines the basic interface for a Rewards Distributor.
*/
interface IRewardsDistributor {
/**
* @dev Emitted when the configuration of the rewards of an asset is updated.
* @param asset The address of the incentivized asset
* @param reward The address of the reward token
* @param oldEmission The old emissions per second value of the reward distribution
* @param newEmission The new emissions per second value of the reward distribution
* @param oldDistributionEnd The old end timestamp of the reward distribution
* @param newDistributionEnd The new end timestamp of the reward distribution
* @param assetIndex The index of the asset distribution
*/
event AssetConfigUpdated(
address indexed asset,
address indexed reward,
uint256 oldEmission,
uint256 newEmission,
uint256 oldDistributionEnd,
uint256 newDistributionEnd,
uint256 assetIndex
);
/**
* @dev Emitted when rewards of an asset are accrued on behalf of a user.
* @param asset The address of the incentivized asset
* @param reward The address of the reward token
* @param user The address of the user that rewards are accrued on behalf of
* @param assetIndex The index of the asset distribution
* @param userIndex The index of the asset distribution on behalf of the user
* @param rewardsAccrued The amount of rewards accrued
*/
event Accrued(
address indexed asset,
address indexed reward,
address indexed user,
uint256 assetIndex,
uint256 userIndex,
uint256 rewardsAccrued
);
/**
* @dev Sets the end date for the distribution
* @param asset The asset to incentivize
* @param reward The reward token that incentives the asset
* @param newDistributionEnd The end date of the incentivization, in unix time format
**/
function setDistributionEnd(address asset, address reward, uint32 newDistributionEnd) external;
/**
* @dev Sets the emission per second of a set of reward distributions
* @param asset The asset is being incentivized
* @param rewards List of reward addresses are being distributed
* @param newEmissionsPerSecond List of new reward emissions per second
*/
function setEmissionPerSecond(
address asset,
address[] calldata rewards,
uint88[] calldata newEmissionsPerSecond
) external;
/**
* @dev Gets the end date for the distribution
* @param asset The incentivized asset
* @param reward The reward token of the incentivized asset
* @return The timestamp with the end of the distribution, in unix time format
**/
function getDistributionEnd(address asset, address reward) external view returns (uint256);
/**
* @dev Returns the index of a user on a reward distribution
* @param user Address of the user
* @param asset The incentivized asset
* @param reward The reward token of the incentivized asset
* @return The current user asset index, not including new distributions
**/
function getUserAssetIndex(
address user,
address asset,
address reward
) external view returns (uint256);
/**
* @dev Returns the configuration of the distribution reward for a certain asset
* @param asset The incentivized asset
* @param reward The reward token of the incentivized asset
* @return The index of the asset distribution
* @return The emission per second of the reward distribution
* @return The timestamp of the last update of the index
* @return The timestamp of the distribution end
**/
function getRewardsData(
address asset,
address reward
) external view returns (uint256, uint256, uint256, uint256);
/**
* @dev Calculates the next value of an specific distribution index, with validations.
* @param asset The incentivized asset
* @param reward The reward token of the incentivized asset
* @return The old index of the asset distribution
* @return The new index of the asset distribution
**/
function getAssetIndex(address asset, address reward) external view returns (uint256, uint256);
/**
* @dev Returns the list of available reward token addresses of an incentivized asset
* @param asset The incentivized asset
* @return List of rewards addresses of the input asset
**/
function getRewardsByAsset(address asset) external view returns (address[] memory);
/**
* @dev Returns the list of available reward addresses
* @return List of rewards supported in this contract
**/
function getRewardsList() external view returns (address[] memory);
/**
* @dev Returns the accrued rewards balance of a user, not including virtually accrued rewards since last distribution.
* @param user The address of the user
* @param reward The address of the reward token
* @return Unclaimed rewards, not including new distributions
**/
function getUserAccruedRewards(address user, address reward) external view returns (uint256);
/**
* @dev Returns a single rewards balance of a user, including virtually accrued and unrealized claimable rewards.
* @param assets List of incentivized assets to check eligible distributions
* @param user The address of the user
* @param reward The address of the reward token
* @return The rewards amount
**/
function getUserRewards(
address[] calldata assets,
address user,
address reward
) external view returns (uint256);
/**
* @dev Returns a list all rewards of a user, including already accrued and unrealized claimable rewards
* @param assets List of incentivized assets to check eligible distributions
* @param user The address of the user
* @return The list of reward addresses
* @return The list of unclaimed amount of rewards
**/
function getAllUserRewards(
address[] calldata assets,
address user
) external view returns (address[] memory, uint256[] memory);
/**
* @dev Returns the decimals of an asset to calculate the distribution delta
* @param asset The address to retrieve decimals
* @return The decimals of an underlying asset
*/
function getAssetDecimals(address asset) external view returns (uint8);
/**
* @dev Returns the address of the emission manager
* @return The address of the EmissionManager
*/
function EMISSION_MANAGER() external view returns (address);
/**
* @dev Returns the address of the emission manager.
* Deprecated: This getter is maintained for compatibility purposes. Use the `EMISSION_MANAGER()` function instead.
* @return The address of the EmissionManager
*/
function getEmissionManager() external view returns (address);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
interface ITransferStrategyBase {
event EmergencyWithdrawal(
address indexed caller,
address indexed token,
address indexed to,
uint256 amount
);
/**
* @dev Perform custom transfer logic via delegate call from source contract to a TransferStrategy implementation
* @param to Account to transfer rewards
* @param reward Address of the reward token
* @param amount Amount to transfer to the "to" address parameter
* @return Returns true bool if transfer logic succeeds
*/
function performTransfer(address to, address reward, uint256 amount) external returns (bool);
/**
* @return Returns the address of the Incentives Controller
*/
function getIncentivesController() external view returns (address);
/**
* @return Returns the address of the Rewards admin
*/
function getRewardsAdmin() external view returns (address);
/**
* @dev Perform an emergency token withdrawal only callable by the Rewards admin
* @param token Address of the token to withdraw funds from this contract
* @param to Address of the recipient of the withdrawal
* @param amount Amount of the withdrawal
*/
function emergencyWithdrawal(address token, address to, uint256 amount) external;
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;
import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol';
import {IEACAggregatorProxy} from '../../misc/interfaces/IEACAggregatorProxy.sol';
library RewardsDataTypes {
struct RewardsConfigInput {
uint88 emissionPerSecond;
uint256 totalSupply;
uint32 distributionEnd;
address asset;
address reward;
ITransferStrategyBase transferStrategy;
IEACAggregatorProxy rewardOracle;
}
struct UserAssetBalance {
address asset;
uint256 userBalance;
uint256 totalSupply;
}
struct UserData {
// Liquidity index of the reward distribution for the user
uint104 index;
// Amount of accrued rewards for the user since last user index update
uint128 accrued;
}
struct RewardData {
// Liquidity index of the reward distribution
uint104 index;
// Amount of reward tokens distributed per second
uint88 emissionPerSecond;
// Timestamp of the last reward index update
uint32 lastUpdateTimestamp;
// The end of the distribution of rewards (in seconds)
uint32 distributionEnd;
// Map of user addresses and their rewards data (userAddress => userData)
mapping(address => UserData) usersData;
}
struct AssetData {
// Map of reward token addresses and their data (rewardTokenAddress => rewardData)
mapping(address => RewardData) rewards;
// List of reward token addresses for the asset
mapping(uint128 => address) availableRewards;
// Count of reward tokens for the asset
uint128 availableRewardsCount;
// Number of decimals of the asset
uint8 decimals;
}
}{
"optimizer": {
"enabled": true,
"runs": 100000
},
"evmVersion": "berlin",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"EmissionAdminUpdated","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":[{"components":[{"internalType":"uint88","name":"emissionPerSecond","type":"uint88"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint32","name":"distributionEnd","type":"uint32"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"contract ITransferStrategyBase","name":"transferStrategy","type":"address"},{"internalType":"contract IEACAggregatorProxy","name":"rewardOracle","type":"address"}],"internalType":"struct RewardsDataTypes.RewardsConfigInput[]","name":"config","type":"tuple[]"}],"name":"configureAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"}],"name":"getEmissionAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsController","outputs":[{"internalType":"contract IRewardsController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"claimer","type":"address"}],"name":"setClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint32","name":"newDistributionEnd","type":"uint32"}],"name":"setDistributionEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"setEmissionAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address[]","name":"rewards","type":"address[]"},{"internalType":"uint88[]","name":"newEmissionsPerSecond","type":"uint88[]"}],"name":"setEmissionPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"contract IEACAggregatorProxy","name":"rewardOracle","type":"address"}],"name":"setRewardOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"setRewardsController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"contract ITransferStrategyBase","name":"transferStrategy","type":"address"}],"name":"setTransferStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620015ac380380620015ac833981016040819052620000349162000187565b600080546001600160a01b031916339081178255604051909182916000805160206200158c833981519152908290a3506200006f8162000076565b50620001b9565b6000546001600160a01b03163314620000d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166200013d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000cd565b600080546040516001600160a01b03808516939216916000805160206200158c83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156200019a57600080fd5b81516001600160a01b0381168114620001b257600080fd5b9392505050565b6113c380620001c96000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063bee36bb31161008c578063e15ac62311610066578063e15ac623146101eb578063f2fde38b146101fe578063f5cf673b14610211578063f996868b1461022457600080fd5b8063bee36bb3146101a7578063c5a7b538146101ba578063de262738146101cd57600080fd5b80638da5cb5b116100bd5780638da5cb5b14610163578063955c2ad714610181578063a286c6b41461019457600080fd5b8063529b1e87146100e45780635453ba1014610146578063715018a61461015b575b600080fd5b61011d6100f2366004610e27565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600160205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610159610154366004610e4b565b610237565b005b610159610361565b60005473ffffffffffffffffffffffffffffffffffffffff1661011d565b61015961018f366004610f5a565b610451565b6101596101a2366004610e4b565b6105c8565b6101596101b5366004610e27565b6106d2565b6101596101c8366004611082565b61079a565b60025473ffffffffffffffffffffffffffffffffffffffff1661011d565b6101596101f9366004610e4b565b6108cb565b61015961020c366004610e27565b6109bd565b61015961021f366004610e4b565b610b6e565b610159610232366004611115565b610c80565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205483911633146102ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064015b60405180910390fd5b6002546040517f5453ba1000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015290911690635453ba10906044015b600060405180830381600087803b15801561034457600080fd5b505af1158015610358573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005b815181101561053c573373ffffffffffffffffffffffffffffffffffffffff166001600084848151811061048a5761048a611198565b6020908102919091018101516080015173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260400160002054161461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b80610534816111c7565b915050610454565b506002546040517f955c2ad700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063955c2ad790610593908490600401611227565b600060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b73ffffffffffffffffffffffffffffffffffffffff80831660008181526001602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917fda40ea421dd7e42cf8be71255facac4fdc12a3f70f4d5fd373cb16cec4cb53849190a4505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054839116331461082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b6002546040517fc5a7b53800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152858116602483015263ffffffff851660448301529091169063c5a7b53890606401600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054839116331461095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b6002546040517fe15ac62300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301529091169063e15ac6239060440161032a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b73ffffffffffffffffffffffffffffffffffffffff8116610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102c5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b6002546040517ff5cf673b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015283811660248301529091169063f5cf673b90604401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b505050505050565b60005b83811015610d5a573360016000878785818110610ca257610ca2611198565b9050602002016020810190610cb79190610e27565b73ffffffffffffffffffffffffffffffffffffffff90811682526020820192909252604001600020541614610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b80610d52816111c7565b915050610c83565b506002546040517ff996868b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f996868b90610db990889088908890889088906004016112dc565b600060405180830381600087803b158015610dd357600080fd5b505af1158015610de7573d6000803e3d6000fd5b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e1457600080fd5b50565b8035610e2281610df2565b919050565b600060208284031215610e3957600080fd5b8135610e4481610df2565b9392505050565b60008060408385031215610e5e57600080fd5b8235610e6981610df2565b91506020830135610e7981610df2565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715610ed657610ed6610e84565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f2357610f23610e84565b604052919050565b80356affffffffffffffffffffff81168114610e2257600080fd5b803563ffffffff81168114610e2257600080fd5b60006020808385031215610f6d57600080fd5b823567ffffffffffffffff80821115610f8557600080fd5b818501915085601f830112610f9957600080fd5b813581811115610fab57610fab610e84565b610fb9848260051b01610edc565b818152848101925060e0918202840185019188831115610fd857600080fd5b938501935b828510156110765780858a031215610ff55760008081fd5b610ffd610eb3565b61100686610f2b565b81528686013587820152604061101d818801610f46565b9082015260608681013561103081610df2565b908201526080611041878201610e17565b9082015260a0611052878201610e17565b9082015260c0611063878201610e17565b9082015284529384019392850192610fdd565b50979650505050505050565b60008060006060848603121561109757600080fd5b83356110a281610df2565b925060208401356110b281610df2565b91506110c060408501610f46565b90509250925092565b60008083601f8401126110db57600080fd5b50813567ffffffffffffffff8111156110f357600080fd5b6020830191508360208260051b850101111561110e57600080fd5b9250929050565b60008060008060006060868803121561112d57600080fd5b853561113881610df2565b9450602086013567ffffffffffffffff8082111561115557600080fd5b61116189838a016110c9565b9096509450604088013591508082111561117a57600080fd5b50611187888289016110c9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611220577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156112cf57815180516affffffffffffffffffffff16855286810151878601528581015163ffffffff168686015260608082015173ffffffffffffffffffffffffffffffffffffffff9081169187019190915260808083015182169087015260a08083015182169087015260c091820151169085015260e09093019290850190600101611244565b5091979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff868116825260606020808401829052908301869052600091879160808501845b8981101561133857843561132481610df2565b841682529382019390820190600101611311565b5085810360408701528681528101925086915060005b8681101561137e576affffffffffffffffffffff61136b84610f2b565b168452928101929181019160010161134e565b5091999850505050505050505056fea2646970667358221220aa8af0d72523e280edde61c88208df0a0b42aee6595e2a1e7ae68318ea96f68d64736f6c634300080a00338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000d2c6008f440d81fcf6c35dcc017959f94a9abf2f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063bee36bb31161008c578063e15ac62311610066578063e15ac623146101eb578063f2fde38b146101fe578063f5cf673b14610211578063f996868b1461022457600080fd5b8063bee36bb3146101a7578063c5a7b538146101ba578063de262738146101cd57600080fd5b80638da5cb5b116100bd5780638da5cb5b14610163578063955c2ad714610181578063a286c6b41461019457600080fd5b8063529b1e87146100e45780635453ba1014610146578063715018a61461015b575b600080fd5b61011d6100f2366004610e27565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600160205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610159610154366004610e4b565b610237565b005b610159610361565b60005473ffffffffffffffffffffffffffffffffffffffff1661011d565b61015961018f366004610f5a565b610451565b6101596101a2366004610e4b565b6105c8565b6101596101b5366004610e27565b6106d2565b6101596101c8366004611082565b61079a565b60025473ffffffffffffffffffffffffffffffffffffffff1661011d565b6101596101f9366004610e4b565b6108cb565b61015961020c366004610e27565b6109bd565b61015961021f366004610e4b565b610b6e565b610159610232366004611115565b610c80565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205483911633146102ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064015b60405180910390fd5b6002546040517f5453ba1000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015290911690635453ba10906044015b600060405180830381600087803b15801561034457600080fd5b505af1158015610358573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005b815181101561053c573373ffffffffffffffffffffffffffffffffffffffff166001600084848151811061048a5761048a611198565b6020908102919091018101516080015173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260400160002054161461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b80610534816111c7565b915050610454565b506002546040517f955c2ad700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063955c2ad790610593908490600401611227565b600060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b73ffffffffffffffffffffffffffffffffffffffff80831660008181526001602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917fda40ea421dd7e42cf8be71255facac4fdc12a3f70f4d5fd373cb16cec4cb53849190a4505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054839116331461082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b6002546040517fc5a7b53800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152858116602483015263ffffffff851660448301529091169063c5a7b53890606401600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054839116331461095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b6002546040517fe15ac62300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301529091169063e15ac6239060440161032a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b73ffffffffffffffffffffffffffffffffffffffff8116610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102c5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102c5565b6002546040517ff5cf673b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015283811660248301529091169063f5cf673b90604401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b505050505050565b60005b83811015610d5a573360016000878785818110610ca257610ca2611198565b9050602002016020810190610cb79190610e27565b73ffffffffffffffffffffffffffffffffffffffff90811682526020820192909252604001600020541614610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f454d495353494f4e5f41444d494e0000000000000000000000000060448201526064016102c5565b80610d52816111c7565b915050610c83565b506002546040517ff996868b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f996868b90610db990889088908890889088906004016112dc565b600060405180830381600087803b158015610dd357600080fd5b505af1158015610de7573d6000803e3d6000fd5b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e1457600080fd5b50565b8035610e2281610df2565b919050565b600060208284031215610e3957600080fd5b8135610e4481610df2565b9392505050565b60008060408385031215610e5e57600080fd5b8235610e6981610df2565b91506020830135610e7981610df2565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715610ed657610ed6610e84565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f2357610f23610e84565b604052919050565b80356affffffffffffffffffffff81168114610e2257600080fd5b803563ffffffff81168114610e2257600080fd5b60006020808385031215610f6d57600080fd5b823567ffffffffffffffff80821115610f8557600080fd5b818501915085601f830112610f9957600080fd5b813581811115610fab57610fab610e84565b610fb9848260051b01610edc565b818152848101925060e0918202840185019188831115610fd857600080fd5b938501935b828510156110765780858a031215610ff55760008081fd5b610ffd610eb3565b61100686610f2b565b81528686013587820152604061101d818801610f46565b9082015260608681013561103081610df2565b908201526080611041878201610e17565b9082015260a0611052878201610e17565b9082015260c0611063878201610e17565b9082015284529384019392850192610fdd565b50979650505050505050565b60008060006060848603121561109757600080fd5b83356110a281610df2565b925060208401356110b281610df2565b91506110c060408501610f46565b90509250925092565b60008083601f8401126110db57600080fd5b50813567ffffffffffffffff8111156110f357600080fd5b6020830191508360208260051b850101111561110e57600080fd5b9250929050565b60008060008060006060868803121561112d57600080fd5b853561113881610df2565b9450602086013567ffffffffffffffff8082111561115557600080fd5b61116189838a016110c9565b9096509450604088013591508082111561117a57600080fd5b50611187888289016110c9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611220577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156112cf57815180516affffffffffffffffffffff16855286810151878601528581015163ffffffff168686015260608082015173ffffffffffffffffffffffffffffffffffffffff9081169187019190915260808083015182169087015260a08083015182169087015260c091820151169085015260e09093019290850190600101611244565b5091979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff868116825260606020808401829052908301869052600091879160808501845b8981101561133857843561132481610df2565b841682529382019390820190600101611311565b5085810360408701528681528101925086915060005b8681101561137e576affffffffffffffffffffff61136b84610f2b565b168452928101929181019160010161134e565b5091999850505050505050505056fea2646970667358221220aa8af0d72523e280edde61c88208df0a0b42aee6595e2a1e7ae68318ea96f68d64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d2c6008f440d81fcf6c35dcc017959f94a9abf2f
-----Decoded View---------------
Arg [0] : owner (address): 0xd2C6008f440D81FCF6C35dcC017959F94a9aBf2f
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d2c6008f440d81fcf6c35dcc017959f94a9abf2f
Loading...
Loading
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.