ETH Price: $2,621.25 (+1.06%)

Contract

0xb12e82DF057BF16ecFa89D7D089dc7E5C1Dc057B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60e06040191203262024-01-30 15:49:47259 days ago1706629787IN
 Create: StakedTokenDataProvider
0 ETH0.0864016973.42837295

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakedTokenDataProvider

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 6 : StakedTokenDataProvider.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC20} from "../interfaces/IERC20.sol";
import {IAggregatedStakeToken} from "../interfaces/IAggregatedStakeToken.sol";
import {AggregatorInterface} from "../interfaces/AggregatorInterface.sol";
import {IStakedTokenDataProvider} from "../interfaces/IStakedTokenDataProvider.sol";
import {AggregatedStakedTokenV3} from "../interfaces/AggregatedStakedTokenV3.sol";

/**
 * @title StakedTokenDataProvider
 * @notice Data provider contract for Staked Tokens of the Safety Module (such as stkAAVE for staked AAVE in the safety module)
 */
contract StakedTokenDataProvider is IStakedTokenDataProvider {
    /// @inheritdoc IStakedTokenDataProvider
    address public immutable override ETH_USD_PRICE_FEED;

    /// @inheritdoc IStakedTokenDataProvider
    address public immutable override AAVE_USD_PRICE_FEED;

    /// @inheritdoc IStakedTokenDataProvider
    address public immutable override STAKED_AAVE;

    uint256 private constant SECONDS_PER_YEAR = 365 days;

    uint256 private constant APY_PRECISION = 10000;

    /**
     * @dev Constructor
     * @param stkAave The address of the StkAAVE token
     * @param ethUsdPriceFeed The address of ETH price feed (USD denominated, with 8 decimals)
     * @param aaveUsdPriceFeed The address of AAVE price feed (USD denominated, with 8 decimals)
     */
    constructor(
        address stkAave,
        address ethUsdPriceFeed,
        address aaveUsdPriceFeed
    ) {
        STAKED_AAVE = stkAave;
        ETH_USD_PRICE_FEED = ethUsdPriceFeed;
        AAVE_USD_PRICE_FEED = aaveUsdPriceFeed;
    }

    /// @inheritdoc IStakedTokenDataProvider
    function getStakedAssetData(
        address stakedAsset,
        address oracle
    ) external view override returns (StakedTokenData memory) {
        return _getStakedTokenData(stakedAsset, oracle);
    }

    /// @inheritdoc IStakedTokenDataProvider
    function getStakedUserData(
        address stakedAsset,
        address oracle,
        address user
    )
        external
        view
        override
        returns (StakedTokenData memory, StakedTokenUserData memory)
    {
        return (
            _getStakedTokenData(stakedAsset, oracle),
            _getStakedTokenUserData(stakedAsset, user)
        );
    }

    /// @inheritdoc IStakedTokenDataProvider
    function getStakedAssetDataBatch(
        address[] calldata stakedAssets,
        address[] calldata oracles
    ) external view override returns (StakedTokenData[] memory, uint256) {
        require(
            stakedAssets.length == oracles.length,
            "Arrays must be of the same length"
        );

        StakedTokenData[] memory stakedData = new StakedTokenData[](
            stakedAssets.length
        );
        uint256 ethPrice = uint256(
            AggregatorInterface(ETH_USD_PRICE_FEED).latestAnswer()
        );
        for (uint256 i = 0; i < stakedAssets.length; i++) {
            stakedData[i] = _getStakedTokenData(stakedAssets[i], oracles[i]);
        }
        return (stakedData, ethPrice);
    }

    /// @inheritdoc IStakedTokenDataProvider
    function getStakedUserDataBatch(
        address[] calldata stakedAssets,
        address[] calldata oracles,
        address user
    )
        external
        view
        override
        returns (StakedTokenData[] memory, StakedTokenUserData[] memory)
    {
        require(
            stakedAssets.length == oracles.length,
            "All arrays must be of the same length"
        );
        StakedTokenData[] memory stakedData = new StakedTokenData[](
            stakedAssets.length
        );
        StakedTokenUserData[] memory userData = new StakedTokenUserData[](
            stakedAssets.length
        );

        for (uint256 i = 0; i < stakedAssets.length; i++) {
            stakedData[i] = _getStakedTokenData(stakedAssets[i], oracles[i]);
            userData[i] = _getStakedTokenUserData(stakedAssets[i], user);
        }
        return (stakedData, userData);
    }

    /**
     * @notice Returns data of the Staked Token passed as parameter
     * @param stakedToken The address of the StakedToken (eg. stkAave, stkBptAave)
     * @param oracle The address of the oracle associated of the staked token, USD denominated with 8 decimals
     * @return data An object with general data of the StakedToken
     */
    function _getStakedTokenData(
        address stakedToken,
        address oracle
    ) internal view returns (StakedTokenData memory data) {
        IAggregatedStakeToken stkToken = IAggregatedStakeToken(stakedToken);
        data.stakedTokenTotalSupply = stkToken.totalSupply();
        data.stakedTokenTotalRedeemableAmount = stkToken.previewRedeem(
            data.stakedTokenTotalSupply
        );
        data.stakeCooldownSeconds = stkToken.getCooldownSeconds();
        data.stakeUnstakeWindow = stkToken.UNSTAKE_WINDOW();
        data.rewardTokenPriceUsd = uint256(
            AggregatorInterface(AAVE_USD_PRICE_FEED).latestAnswer()
        );
        data.maxSlashablePercentage = stkToken.getMaxSlashablePercentage();
        try AggregatedStakedTokenV3(stakedToken).DISTRIBUTION_END() returns (
            uint256 distributionEnd
        ) {
            data.distributionEnd = distributionEnd;
        } catch {
            try stkToken.distributionEnd() returns (uint256 distributionEnd) {
                data.distributionEnd = distributionEnd;
            } catch {}
        }
        data.inPostSlashingPeriod = stkToken.inPostSlashingPeriod();
        (uint128 emissionPerSecond, , ) = stkToken.assets(address(stakedToken));
        data.distributionPerSecond = block.timestamp < data.distributionEnd
            ? emissionPerSecond
            : 0;

        // stkAave
        if (address(stakedToken) == STAKED_AAVE) {
            data.stakedTokenPriceUsd = data.rewardTokenPriceUsd;
            // assumes AAVE and stkAAVE have the same value
            data.stakeApy = _calculateApy(
                data.distributionPerSecond,
                data.stakedTokenTotalSupply
            );
        } else {
            // other wrapped assets
            data.stakedTokenPriceUsd = uint256(
                AggregatorInterface(oracle).latestAnswer()
            );
            data.stakeApy = _calculateApy(
                data.distributionPerSecond * data.rewardTokenPriceUsd,
                data.stakedTokenTotalSupply * data.stakedTokenPriceUsd
            );
        }
    }

    /**
     * @notice Returns user data of the Staked Token
     * @param stakedToken The address of the StakedToken asset
     * @param user The address of the user
     * @return data struct containing user-specific details related to the staked asset
     */
    function _getStakedTokenUserData(
        address stakedToken,
        address user
    ) internal view returns (StakedTokenUserData memory data) {
        IAggregatedStakeToken stkToken = IAggregatedStakeToken(stakedToken);
        data.stakedTokenUserBalance = stkToken.balanceOf(user);
        data.rewardsToClaim = stkToken.getTotalRewardsBalance(user);
        data.underlyingTokenUserBalance = IERC20(stkToken.STAKED_TOKEN())
            .balanceOf(user);
        data.stakedTokenRedeemableAmount = stkToken.previewRedeem(
            data.stakedTokenUserBalance
        );
        (data.userCooldownTimestamp, data.userCooldownAmount) = stkToken
            .stakersCooldowns(user);
    }

    /**
     * @notice Calculates the APY of the reward distribution among StakedToken holders
     * @dev It uses the value of the reward and StakedToken asset
     * @param distributionPerSecond The value of the rewards being distributed per second
     * @param stakedTokenTotalSupply The value of the total supply of StakedToken asset
     * @return the APY of the reward distribution among StakedToken holders
     */
    function _calculateApy(
        uint256 distributionPerSecond,
        uint256 stakedTokenTotalSupply
    ) internal pure returns (uint256) {
        if (stakedTokenTotalSupply == 0) return 0;
        return
            (distributionPerSecond * SECONDS_PER_YEAR * APY_PRECISION) /
            stakedTokenTotalSupply;
    }
}

File 2 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

File 3 of 6 : IAggregatedStakeToken.sol
pragma solidity ^0.8.0;

/**
 * @title IAggregatedStakeToken
 * https://github.com/bgd-labs/stake-token/blob/f42de811d1ef831545446cc357b54e187ccd87a2/src/contracts/IAggregatedStakeToken.sol
 */
interface IAggregatedStakeToken {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event AssetConfigUpdated(address indexed asset, uint256 emission);
    event AssetIndexUpdated(address indexed asset, uint256 index);
    event Cooldown(address indexed user, uint256 amount);
    event CooldownSecondsChanged(uint256 cooldownSeconds);
    event DistributionEndChanged(uint256 endTimestamp);
    event EIP712DomainChanged();
    event ExchangeRateChanged(uint216 exchangeRate);
    event FundsReturned(uint256 amount);
    event Initialized(uint64 version);
    event MaxSlashablePercentageChanged(uint256 newPercentage);
    event PendingAdminChanged(address indexed newPendingAdmin, uint256 role);
    event Redeem(
        address indexed from,
        address indexed to,
        uint256 assets,
        uint256 shares
    );
    event RewardsAccrued(address user, uint256 amount);
    event RewardsClaimed(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event RoleClaimed(address indexed newAdmin, uint256 role);
    event Slashed(address indexed destination, uint256 amount);
    event SlashingExitWindowDurationChanged(uint256 windowSeconds);
    event SlashingSettled();
    event Staked(
        address indexed from,
        address indexed to,
        uint256 assets,
        uint256 shares
    );
    event Transfer(address indexed from, address indexed to, uint256 value);
    event UserIndexUpdated(
        address indexed user,
        address indexed asset,
        uint256 index
    );

    struct AssetConfigInput {
        uint128 emissionPerSecond;
        uint256 totalStaked;
        address underlyingAsset;
    }

    function CLAIM_HELPER_ROLE() external view returns (uint256);

    function COOLDOWN_ADMIN_ROLE() external view returns (uint256);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function EMISSION_MANAGER() external view returns (address);

    function EXCHANGE_RATE_UNIT() external view returns (uint256);

    function INITIAL_EXCHANGE_RATE() external view returns (uint216);

    function LOWER_BOUND() external view returns (uint256);

    function PRECISION() external view returns (uint8);

    function REWARDS_VAULT() external view returns (address);

    function REWARD_TOKEN() external view returns (address);

    function SLASH_ADMIN_ROLE() external view returns (uint256);

    function STAKED_TOKEN() external view returns (address);

    function UNSTAKE_WINDOW() external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function assets(
        address
    )
        external
        view
        returns (
            uint128 emissionPerSecond,
            uint128 lastUpdateTimestamp,
            uint256 index
        );

    function balanceOf(address account) external view returns (uint256);

    function claimRewards(address to, uint256 amount) external;

    function claimRewardsAndRedeem(
        address to,
        uint256 claimAmount,
        uint256 redeemAmount
    ) external;

    function claimRewardsAndRedeemOnBehalf(
        address from,
        address to,
        uint256 claimAmount,
        uint256 redeemAmount
    ) external;

    function claimRewardsOnBehalf(
        address from,
        address to,
        uint256 amount
    ) external returns (uint256);

    function claimRoleAdmin(uint256 role) external;

    function configureAssets(
        AssetConfigInput[] memory assetsConfigInput
    ) external;

    function cooldown() external;

    function cooldownOnBehalfOf(address from) external;

    function decimals() external view returns (uint8);

    function distributionEnd() external view returns (uint256);

    function eip712Domain()
        external
        view
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        );

    function getAdmin(uint256 role) external view returns (address);

    function getCooldownSeconds() external view returns (uint256);

    function getExchangeRate() external view returns (uint216);

    function getMaxSlashablePercentage() external view returns (uint256);

    function getPendingAdmin(uint256 role) external view returns (address);

    function getTotalRewardsBalance(
        address staker
    ) external view returns (uint256);

    function getUserAssetData(
        address user,
        address asset
    ) external view returns (uint256);

    function inPostSlashingPeriod() external view returns (bool);

    function initialize(
        string memory name,
        string memory symbol,
        address slashingAdmin,
        address cooldownPauseAdmin,
        address claimHelper,
        uint256 maxSlashablePercentage,
        uint256 cooldownSeconds
    ) external;

    function name() external view returns (string memory);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function previewRedeem(uint256 shares) external view returns (uint256);

    function previewStake(uint256 assets) external view returns (uint256);

    function redeem(address to, uint256 amount) external;

    function redeemOnBehalf(address from, address to, uint256 amount) external;

    function returnFunds(uint256 amount) external;

    function setCooldownSeconds(uint256 cooldownSeconds) external;

    function setDistributionEnd(uint256 newDistributionEnd) external;

    function setMaxSlashablePercentage(uint256 percentage) external;

    function setPendingAdmin(uint256 role, address newPendingAdmin) external;

    function settleSlashing() external;

    function slash(
        address destination,
        uint256 amount
    ) external returns (uint256);

    function stake(address to, uint256 amount) external;

    function stakeWithPermit(
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function stakerRewardsToClaim(address) external view returns (uint256);

    function stakersCooldowns(
        address
    ) external view returns (uint40 timestamp, uint216 amount);

    function symbol() external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

File 4 of 6 : AggregatorInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title AggregatorInterface
 * https://github.com/aave/aave-v3-core/blob/6070e82d962d9b12835c88e68210d0e63f08d035/contracts/dependencies/chainlink/AggregatorInterface.sol
 */
interface AggregatorInterface {
    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 updatedAt
    );

    event NewRound(
        uint256 indexed roundId,
        address indexed startedBy,
        uint256 startedAt
    );
}

File 5 of 6 : IStakedTokenDataProvider.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title IStakedTokenDataProvider
 * @notice Basic interface of the Staked Token Data Provider
 */
interface IStakedTokenDataProvider {
    struct StakedTokenData {
        uint256 stakedTokenTotalSupply; // total supply of staked token
        uint256 stakedTokenTotalRedeemableAmount; // total redeemable amount of staked token
        uint256 stakeCooldownSeconds; // cooldown period of staked token denominated in seconds
        uint256 stakeUnstakeWindow; // unstake window of staked token denominated in seconds
        uint256 stakedTokenPriceUsd; // price of staked token denominated in USD
        uint256 rewardTokenPriceUsd; // price of reward token denominated in USD
        uint256 stakeApy; // apy(annual percentage yield) of staked token
        uint128 distributionPerSecond; // distribution of reward tokens per second
        bool inPostSlashingPeriod; // staked token in slashing period or not
        uint256 distributionEnd; // distribution end time
        uint256 maxSlashablePercentage; // max slashable percentage of the total staked amount
    }

    struct StakedTokenUserData {
        uint256 stakedTokenUserBalance; // user balance of staked token
        uint256 stakedTokenRedeemableAmount; // user redeemable amount of staked token
        uint256 underlyingTokenUserBalance; // underlying token balance of user
        uint256 rewardsToClaim; // total rewards balance of user
        uint40 userCooldownTimestamp; // cooldown timestamp of user
        uint216 userCooldownAmount; // amount available to unstake after cooldown timestamp for user
    }

    /**
     * @return The address of the ETH price feed, USD denominated, expressed with 8 decimals
     */
    function ETH_USD_PRICE_FEED() external view returns (address);

    /**
     * @return The address of the AAVE price feed, USD denominated, expressed with 8 decimals
     */
    function AAVE_USD_PRICE_FEED() external view returns (address);

    /**
     * @return The address of the StkAAVE token
     */
    function STAKED_AAVE() external view returns (address);

    /**
     * @notice Returns data of Staked asset
     * @param stakedAsset The address of the staked asset (eg. stkAave, stkBptAave)
     * @param oracle The address of the oracle for the staked asset, USD denominated with 8 decimals
     * @return stakedAssetData struct with staked asset data
     */
    function getStakedAssetData(
        address stakedAsset,
        address oracle
    ) external view returns (StakedTokenData memory stakedAssetData);

    /**
     * @notice Retrieves staked token data and user-specific data for a given user, staked asset,
     *          and its associated oracle.
     * @param stakedAsset The address of the staked asset (eg. stkAave, stkBptAave)
     * @param oracle The address of the oracle for the staked asset, USD denominated with 8 decimals
     * @param user The address of the user for whom the data is to be fetched.
     * @return stakedTokenData `StakedTokenData` struct with details about the staked asset.
     * @return stakedUserData `StakedTokenUserData` struct containing user-specific details related to the staked asset
     */
    function getStakedUserData(
        address stakedAsset,
        address oracle,
        address user
    )
        external
        view
        returns (
            StakedTokenData memory stakedTokenData,
            StakedTokenUserData memory stakedUserData
        );

    /**
     * notice Retrieves general data of a batch of staked assets
     * @param stakedAssets An array of addresses of staked assets.
     * @param oracles An array of oracle addresses for the staked assets, USD denominated with 8 decimals.
     * @return stakedData An array containing data about the staked assets.
     * @return ethPrice The price of ETH asset, USD denominated with 8 decimals.
     */
    function getStakedAssetDataBatch(
        address[] calldata stakedAssets,
        address[] calldata oracles
    )
        external
        view
        returns (StakedTokenData[] memory stakedData, uint256 ethPrice);

    /**
     * @notice Retrieves general and user-specific data for a batch of staked assets.
     * @param stakedAssets An array of addresses of staked assets.
     * @param oracles An array of oracle addresses for the staked assets, USD denominated with 8 decimals.
     * @param user The address of the user to retrieve data from.
     * @return stakedTokenData An array containing data about the staked assets.
     * @return stakedUserData An array containing user-specific data about the staked assets.
     */
    function getStakedUserDataBatch(
        address[] calldata stakedAssets,
        address[] calldata oracles,
        address user
    )
        external
        view
        returns (
            StakedTokenData[] memory stakedTokenData,
            StakedTokenUserData[] memory stakedUserData
        );
}

File 6 of 6 : AggregatedStakedTokenV3.sol
pragma solidity ^0.8.0;

/**
 * @title AggregatedStakedTokenV3
 * https://github.com/bgd-labs/aave-stk-gov-v3/blob/0c4cb0b71566cf91a62816e06199fdb3606608bc/src/interfaces/AggregatedStakedTokenV3.sol
 */
interface AggregatedStakedTokenV3 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event AssetConfigUpdated(address indexed asset, uint256 emission);
    event AssetIndexUpdated(address indexed asset, uint256 index);
    event Cooldown(address indexed user, uint256 amount);
    event CooldownSecondsChanged(uint256 cooldownSeconds);
    event DelegateChanged(
        address indexed delegator,
        address indexed delegatee,
        uint8 delegationType
    );
    event ExchangeRateChanged(uint216 exchangeRate);
    event FundsReturned(uint256 amount);
    event MaxSlashablePercentageChanged(uint256 newPercentage);
    event PendingAdminChanged(address indexed newPendingAdmin, uint256 role);
    event Redeem(
        address indexed from,
        address indexed to,
        uint256 assets,
        uint256 shares
    );
    event RewardsAccrued(address user, uint256 amount);
    event RewardsClaimed(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event RoleClaimed(address indexed newAdmin, uint256 role);
    event Slashed(address indexed destination, uint256 amount);
    event SlashingExitWindowDurationChanged(uint256 windowSeconds);
    event SlashingSettled();
    event Staked(
        address indexed from,
        address indexed to,
        uint256 assets,
        uint256 shares
    );
    event Transfer(address indexed from, address indexed to, uint256 value);
    event UserIndexUpdated(
        address indexed user,
        address indexed asset,
        uint256 index
    );

    struct AssetConfigInput {
        uint128 emissionPerSecond;
        uint256 totalStaked;
        address underlyingAsset;
    }

    function CLAIM_HELPER_ROLE() external view returns (uint256);

    function COOLDOWN_ADMIN_ROLE() external view returns (uint256);

    function COOLDOWN_SECONDS() external view returns (uint256);

    function DELEGATE_BY_TYPE_TYPEHASH() external view returns (bytes32);

    function DELEGATE_TYPEHASH() external view returns (bytes32);

    function DISTRIBUTION_END() external view returns (uint256);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function EIP712_REVISION() external view returns (bytes memory);

    function EMISSION_MANAGER() external view returns (address);

    function EXCHANGE_RATE_UNIT() external view returns (uint256);

    function INITIAL_EXCHANGE_RATE() external view returns (uint216);

    function LOWER_BOUND() external view returns (uint256);

    function PERMIT_TYPEHASH() external view returns (bytes32);

    function POWER_SCALE_FACTOR() external view returns (uint256);

    function PRECISION() external view returns (uint8);

    function REVISION() external pure returns (uint256);

    function REWARDS_VAULT() external view returns (address);

    function REWARD_TOKEN() external view returns (address);

    function SLASH_ADMIN_ROLE() external view returns (uint256);

    function STAKED_TOKEN() external view returns (address);

    function UNSTAKE_WINDOW() external view returns (uint256);

    function _nonces(address) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function assets(
        address
    )
        external
        view
        returns (
            uint128 emissionPerSecond,
            uint128 lastUpdateTimestamp,
            uint256 index
        );

    function balanceOf(address account) external view returns (uint256);

    function claimRewards(address to, uint256 amount) external;

    function claimRewardsAndRedeem(
        address to,
        uint256 claimAmount,
        uint256 redeemAmount
    ) external;

    function claimRewardsAndRedeemOnBehalf(
        address from,
        address to,
        uint256 claimAmount,
        uint256 redeemAmount
    ) external;

    function claimRewardsOnBehalf(
        address from,
        address to,
        uint256 amount
    ) external returns (uint256);

    function claimRoleAdmin(uint256 role) external;

    function configureAssets(
        AssetConfigInput[] memory assetsConfigInput
    ) external;

    function cooldown() external;

    function cooldownOnBehalfOf(address from) external;

    function decimals() external view returns (uint8);

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external returns (bool);

    function delegate(address delegatee) external;

    function delegateByType(address delegatee, uint8 delegationType) external;

    function deprecated_aaveGovernance() external view returns (address);

    function deprecated_votingSnapshots(
        address,
        uint256
    ) external view returns (uint128 blockNumber, uint128 value);

    function deprecated_votingSnapshotsCounts(
        address
    ) external view returns (uint256);

    function getAdmin(uint256 role) external view returns (address);

    function getCooldownSeconds() external view returns (uint256);

    function getDelegateeByType(
        address delegator,
        uint8 delegationType
    ) external view returns (address);

    function getDelegates(
        address delegator
    ) external view returns (address, address);

    function getExchangeRate() external view returns (uint216);

    function getMaxSlashablePercentage() external view returns (uint256);

    function getPendingAdmin(uint256 role) external view returns (address);

    function getPowerCurrent(
        address user,
        uint8 delegationType
    ) external view returns (uint256);

    function getPowersCurrent(
        address user
    ) external view returns (uint256, uint256);

    function getTotalRewardsBalance(
        address staker
    ) external view returns (uint256);

    function getUserAssetData(
        address user,
        address asset
    ) external view returns (uint256);

    function inPostSlashingPeriod() external view returns (bool);

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external returns (bool);

    function initialize(
        address slashingAdmin,
        address cooldownPauseAdmin,
        address claimHelper,
        uint256 maxSlashablePercentage,
        uint256 cooldownSeconds
    ) external;

    function metaDelegate(
        address delegator,
        address delegatee,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function metaDelegateByType(
        address delegator,
        address delegatee,
        uint8 delegationType,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function name() external view returns (string memory);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function previewRedeem(uint256 shares) external view returns (uint256);

    function previewStake(uint256 assets) external view returns (uint256);

    function redeem(address to, uint256 amount) external;

    function redeemOnBehalf(address from, address to, uint256 amount) external;

    function returnFunds(uint256 amount) external;

    function setCooldownSeconds(uint256 cooldownSeconds) external;

    function setMaxSlashablePercentage(uint256 percentage) external;

    function setPendingAdmin(uint256 role, address newPendingAdmin) external;

    function settleSlashing() external;

    function slash(
        address destination,
        uint256 amount
    ) external returns (uint256);

    function stake(address to, uint256 amount) external;

    function stakerRewardsToClaim(address) external view returns (uint256);

    function stakersCooldowns(
        address
    ) external view returns (uint40 timestamp, uint216 amount);

    function symbol() external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

Settings
{
  "remappings": [
    "aave-address-book/=lib/aave-address-book/src/",
    "@aave/core-v3/=lib/aave-address-book/lib/aave-v3-core/",
    "@aave/periphery-v3/=lib/aave-address-book/lib/aave-v3-periphery/",
    "aave-v3-core/=lib/aave-address-book/lib/aave-v3-core/",
    "aave-v3-periphery/=lib/aave-address-book/lib/aave-v3-periphery/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"stkAave","type":"address"},{"internalType":"address","name":"ethUsdPriceFeed","type":"address"},{"internalType":"address","name":"aaveUsdPriceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AAVE_USD_PRICE_FEED","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_USD_PRICE_FEED","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKED_AAVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakedAsset","type":"address"},{"internalType":"address","name":"oracle","type":"address"}],"name":"getStakedAssetData","outputs":[{"components":[{"internalType":"uint256","name":"stakedTokenTotalSupply","type":"uint256"},{"internalType":"uint256","name":"stakedTokenTotalRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"stakeCooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"stakeUnstakeWindow","type":"uint256"},{"internalType":"uint256","name":"stakedTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"rewardTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"stakeApy","type":"uint256"},{"internalType":"uint128","name":"distributionPerSecond","type":"uint128"},{"internalType":"bool","name":"inPostSlashingPeriod","type":"bool"},{"internalType":"uint256","name":"distributionEnd","type":"uint256"},{"internalType":"uint256","name":"maxSlashablePercentage","type":"uint256"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakedAssets","type":"address[]"},{"internalType":"address[]","name":"oracles","type":"address[]"}],"name":"getStakedAssetDataBatch","outputs":[{"components":[{"internalType":"uint256","name":"stakedTokenTotalSupply","type":"uint256"},{"internalType":"uint256","name":"stakedTokenTotalRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"stakeCooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"stakeUnstakeWindow","type":"uint256"},{"internalType":"uint256","name":"stakedTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"rewardTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"stakeApy","type":"uint256"},{"internalType":"uint128","name":"distributionPerSecond","type":"uint128"},{"internalType":"bool","name":"inPostSlashingPeriod","type":"bool"},{"internalType":"uint256","name":"distributionEnd","type":"uint256"},{"internalType":"uint256","name":"maxSlashablePercentage","type":"uint256"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenData[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakedAsset","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"getStakedUserData","outputs":[{"components":[{"internalType":"uint256","name":"stakedTokenTotalSupply","type":"uint256"},{"internalType":"uint256","name":"stakedTokenTotalRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"stakeCooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"stakeUnstakeWindow","type":"uint256"},{"internalType":"uint256","name":"stakedTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"rewardTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"stakeApy","type":"uint256"},{"internalType":"uint128","name":"distributionPerSecond","type":"uint128"},{"internalType":"bool","name":"inPostSlashingPeriod","type":"bool"},{"internalType":"uint256","name":"distributionEnd","type":"uint256"},{"internalType":"uint256","name":"maxSlashablePercentage","type":"uint256"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenData","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"stakedTokenUserBalance","type":"uint256"},{"internalType":"uint256","name":"stakedTokenRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"underlyingTokenUserBalance","type":"uint256"},{"internalType":"uint256","name":"rewardsToClaim","type":"uint256"},{"internalType":"uint40","name":"userCooldownTimestamp","type":"uint40"},{"internalType":"uint216","name":"userCooldownAmount","type":"uint216"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenUserData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakedAssets","type":"address[]"},{"internalType":"address[]","name":"oracles","type":"address[]"},{"internalType":"address","name":"user","type":"address"}],"name":"getStakedUserDataBatch","outputs":[{"components":[{"internalType":"uint256","name":"stakedTokenTotalSupply","type":"uint256"},{"internalType":"uint256","name":"stakedTokenTotalRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"stakeCooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"stakeUnstakeWindow","type":"uint256"},{"internalType":"uint256","name":"stakedTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"rewardTokenPriceUsd","type":"uint256"},{"internalType":"uint256","name":"stakeApy","type":"uint256"},{"internalType":"uint128","name":"distributionPerSecond","type":"uint128"},{"internalType":"bool","name":"inPostSlashingPeriod","type":"bool"},{"internalType":"uint256","name":"distributionEnd","type":"uint256"},{"internalType":"uint256","name":"maxSlashablePercentage","type":"uint256"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenData[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"stakedTokenUserBalance","type":"uint256"},{"internalType":"uint256","name":"stakedTokenRedeemableAmount","type":"uint256"},{"internalType":"uint256","name":"underlyingTokenUserBalance","type":"uint256"},{"internalType":"uint256","name":"rewardsToClaim","type":"uint256"},{"internalType":"uint40","name":"userCooldownTimestamp","type":"uint40"},{"internalType":"uint216","name":"userCooldownAmount","type":"uint216"}],"internalType":"struct IStakedTokenDataProvider.StakedTokenUserData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b50604051620015433803806200154383398101604081905262000034916200006f565b6001600160a01b0392831660c0529082166080521660a052620000b9565b80516001600160a01b03811681146200006a57600080fd5b919050565b6000806000606084860312156200008557600080fd5b620000908462000052565b9250620000a06020850162000052565b9150620000b06040850162000052565b90509250925092565b60805160a05160c051611446620000fd6000396000818160d20152610a300152600081816101790152610762015260008181610111015261025801526114466000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063b0f0abe91161005b578063b0f0abe91461010c578063deb6609014610133578063ee4291ce14610153578063feb23d311461017457600080fd5b8063026dc68214610082578063304fbe0d146100ac5780638e6a6941146100cd575b600080fd5b610095610090366004610f1c565b61019b565b6040516100a392919061104d565b60405180910390f35b6100bf6100ba366004611087565b610379565b6040516100a3929190611152565b6100f47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a3565b6100f47f000000000000000000000000000000000000000000000000000000000000000081565b6101466101413660046111b3565b61055a565b6040516100a391906111ec565b6101666101613660046111fb565b610575565b6040516100a3929190611246565b6100f47f000000000000000000000000000000000000000000000000000000000000000081565b606060008483146101fd5760405162461bcd60e51b815260206004820152602160248201527f417272617973206d757374206265206f66207468652073616d65206c656e67746044820152600d60fb1b60648201526084015b60405180910390fd5b60008567ffffffffffffffff8111156102185761021861126a565b60405190808252806020026020018201604052801561025157816020015b61023e610e25565b8152602001906001900390816102365790505b50905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d89190611280565b905060005b8781101561036b5761033b8989838181106102fa576102fa611299565b905060200201602081019061030f91906112af565b88888481811061032157610321611299565b905060200201602081019061033691906112af565b6105a5565b83828151811061034d5761034d611299565b60200260200101819052508080610363906112e2565b9150506102dd565b509097909650945050505050565b6060808584146103d95760405162461bcd60e51b815260206004820152602560248201527f416c6c20617272617973206d757374206265206f66207468652073616d65206c6044820152640cadccee8d60db1b60648201526084016101f4565b60008667ffffffffffffffff8111156103f4576103f461126a565b60405190808252806020026020018201604052801561042d57816020015b61041a610e25565b8152602001906001900390816104125790505b50905060008767ffffffffffffffff81111561044b5761044b61126a565b60405190808252806020026020018201604052801561048457816020015b610471610e8a565b8152602001906001900390816104695790505b50905060005b8881101561054b576104ce8a8a838181106104a7576104a7611299565b90506020020160208101906104bc91906112af565b89898481811061032157610321611299565b8382815181106104e0576104e0611299565b602002602001018190525061051b8a8a8381811061050057610500611299565b905060200201602081019061051591906112af565b87610b32565b82828151811061052d5761052d611299565b60200260200101819052508080610543906112e2565b91505061048a565b50909890975095505050505050565b610562610e25565b61056c83836105a5565b90505b92915050565b61057d610e25565b610585610e8a565b61058f85856105a5565b6105998685610b32565b91509150935093915050565b6105ad610e25565b6000839050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190611280565b80835260405163266d6a8360e11b815260048101919091526001600160a01b03821690634cdad50690602401602060405180830381865afa15801561065d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106819190611280565b826020018181525050806001600160a01b031663616e0bf96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec9190611280565b826040018181525050806001600160a01b031663359c4a966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107579190611280565b8260600181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190611280565b8260a0018181525050806001600160a01b031663f34d96da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190611280565b82610140018181525050836001600160a01b031663919cd40f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108b1575060408051601f3d908101601f191682019092526108ae91810190611280565b60015b61092057806001600160a01b031663efa90b546040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090f575060408051601f3d908101601f1916820190925261090c91810190611280565b60015b1561091b576101208301525b610927565b6101208301525b806001600160a01b031663f036bc686040518163ffffffff1660e01b8152600401602060405180830381865afa158015610965573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098991906112fb565b1515610100830152604051631e23703160e31b81526001600160a01b0385811660048301526000919083169063f11b818890602401606060405180830381865afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff9190611339565b505090508261012001514210610a16576000610a18565b805b6001600160801b031660e08401526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690861603610a875760a0830151608084015260e08301518351610a7d916001600160801b031690610ded565b60c0840152610b2a565b836001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae99190611280565b608084015260a083015160e0840151610b2491610b0e916001600160801b0316611375565b60808501518551610b1f9190611375565b610ded565b60c08401525b505092915050565b610b3a610e8a565b6040516370a0823160e01b81526001600160a01b0383811660048301528491908216906370a0823190602401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611280565b82526040516346df7f7160e11b81526001600160a01b038481166004830152821690638dbefee290602401602060405180830381865afa158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c139190611280565b826060018181525050806001600160a01b031663312f6b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e919061138c565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a0823190602401602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190611280565b6040838101919091528251905163266d6a8360e11b815260048101919091526001600160a01b03821690634cdad50690602401602060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e9190611280565b602083015260405163091030c360e01b81526001600160a01b03848116600483015282169063091030c3906024016040805180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc91906113a9565b6001600160d81b031660a084015264ffffffffff1660808301525092915050565b600081600003610dff5750600061056f565b81612710610e116301e1338086611375565b610e1b9190611375565b61056c91906113ee565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160801b0316815260200160001515815260200160008152602001600081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600064ffffffffff16815260200160006001600160d81b031681525090565b60008083601f840112610ee257600080fd5b50813567ffffffffffffffff811115610efa57600080fd5b6020830191508360208260051b8501011115610f1557600080fd5b9250929050565b60008060008060408587031215610f3257600080fd5b843567ffffffffffffffff80821115610f4a57600080fd5b610f5688838901610ed0565b90965094506020870135915080821115610f6f57600080fd5b50610f7c87828801610ed0565b95989497509550505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e0810151610fe260e08401826001600160801b03169052565b5061010081810151151590830152610120808201519083015261014090810151910152565b600081518084526020808501945080840160005b838110156110425761102e878351610f88565b61016096909601959082019060010161101b565b509495945050505050565b6040815260006110606040830185611007565b90508260208301529392505050565b6001600160a01b038116811461108457600080fd5b50565b60008060008060006060868803121561109f57600080fd5b853567ffffffffffffffff808211156110b757600080fd5b6110c389838a01610ed0565b909750955060208801359150808211156110dc57600080fd5b506110e988828901610ed0565b90945092505060408601356110fd8161106f565b809150509295509295909350565b8051825260208082015190830152604080820151908301526060808201519083015260808082015164ffffffffff169083015260a0908101516001600160d81b0316910152565b6040815260006111656040830185611007565b82810360208481019190915284518083528582019282019060005b818110156111a65761119383865161110b565b9383019360c09290920191600101611180565b5090979650505050505050565b600080604083850312156111c657600080fd5b82356111d18161106f565b915060208301356111e18161106f565b809150509250929050565b610160810161056f8284610f88565b60008060006060848603121561121057600080fd5b833561121b8161106f565b9250602084013561122b8161106f565b9150604084013561123b8161106f565b809150509250925092565b61022081016112558285610f88565b61126361016083018461110b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561129257600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156112c157600080fd5b81356112638161106f565b634e487b7160e01b600052601160045260246000fd5b6000600182016112f4576112f46112cc565b5060010190565b60006020828403121561130d57600080fd5b8151801515811461126357600080fd5b80516001600160801b038116811461133457600080fd5b919050565b60008060006060848603121561134e57600080fd5b6113578461131d565b92506113656020850161131d565b9150604084015190509250925092565b808202811582820484141761056f5761056f6112cc565b60006020828403121561139e57600080fd5b81516112638161106f565b600080604083850312156113bc57600080fd5b825164ffffffffff811681146113d157600080fd5b60208401519092506001600160d81b03811681146111e157600080fd5b60008261140b57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212201237325600ddf33cbbdea3f7410a0deddca0f00cfcc15941dde73e189018cb0264736f6c634300081400330000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f50000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000547a514d5e3769680ce22b2361c10ea13619e8a9

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063b0f0abe91161005b578063b0f0abe91461010c578063deb6609014610133578063ee4291ce14610153578063feb23d311461017457600080fd5b8063026dc68214610082578063304fbe0d146100ac5780638e6a6941146100cd575b600080fd5b610095610090366004610f1c565b61019b565b6040516100a392919061104d565b60405180910390f35b6100bf6100ba366004611087565b610379565b6040516100a3929190611152565b6100f47f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f581565b6040516001600160a01b0390911681526020016100a3565b6100f47f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841981565b6101466101413660046111b3565b61055a565b6040516100a391906111ec565b6101666101613660046111fb565b610575565b6040516100a3929190611246565b6100f47f000000000000000000000000547a514d5e3769680ce22b2361c10ea13619e8a981565b606060008483146101fd5760405162461bcd60e51b815260206004820152602160248201527f417272617973206d757374206265206f66207468652073616d65206c656e67746044820152600d60fb1b60648201526084015b60405180910390fd5b60008567ffffffffffffffff8111156102185761021861126a565b60405190808252806020026020018201604052801561025157816020015b61023e610e25565b8152602001906001900390816102365790505b50905060007f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d89190611280565b905060005b8781101561036b5761033b8989838181106102fa576102fa611299565b905060200201602081019061030f91906112af565b88888481811061032157610321611299565b905060200201602081019061033691906112af565b6105a5565b83828151811061034d5761034d611299565b60200260200101819052508080610363906112e2565b9150506102dd565b509097909650945050505050565b6060808584146103d95760405162461bcd60e51b815260206004820152602560248201527f416c6c20617272617973206d757374206265206f66207468652073616d65206c6044820152640cadccee8d60db1b60648201526084016101f4565b60008667ffffffffffffffff8111156103f4576103f461126a565b60405190808252806020026020018201604052801561042d57816020015b61041a610e25565b8152602001906001900390816104125790505b50905060008767ffffffffffffffff81111561044b5761044b61126a565b60405190808252806020026020018201604052801561048457816020015b610471610e8a565b8152602001906001900390816104695790505b50905060005b8881101561054b576104ce8a8a838181106104a7576104a7611299565b90506020020160208101906104bc91906112af565b89898481811061032157610321611299565b8382815181106104e0576104e0611299565b602002602001018190525061051b8a8a8381811061050057610500611299565b905060200201602081019061051591906112af565b87610b32565b82828151811061052d5761052d611299565b60200260200101819052508080610543906112e2565b91505061048a565b50909890975095505050505050565b610562610e25565b61056c83836105a5565b90505b92915050565b61057d610e25565b610585610e8a565b61058f85856105a5565b6105998685610b32565b91509150935093915050565b6105ad610e25565b6000839050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190611280565b80835260405163266d6a8360e11b815260048101919091526001600160a01b03821690634cdad50690602401602060405180830381865afa15801561065d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106819190611280565b826020018181525050806001600160a01b031663616e0bf96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec9190611280565b826040018181525050806001600160a01b031663359c4a966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107579190611280565b8260600181815250507f000000000000000000000000547a514d5e3769680ce22b2361c10ea13619e8a96001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e29190611280565b8260a0018181525050806001600160a01b031663f34d96da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190611280565b82610140018181525050836001600160a01b031663919cd40f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108b1575060408051601f3d908101601f191682019092526108ae91810190611280565b60015b61092057806001600160a01b031663efa90b546040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090f575060408051601f3d908101601f1916820190925261090c91810190611280565b60015b1561091b576101208301525b610927565b6101208301525b806001600160a01b031663f036bc686040518163ffffffff1660e01b8152600401602060405180830381865afa158015610965573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098991906112fb565b1515610100830152604051631e23703160e31b81526001600160a01b0385811660048301526000919083169063f11b818890602401606060405180830381865afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff9190611339565b505090508261012001514210610a16576000610a18565b805b6001600160801b031660e08401526001600160a01b037f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5811690861603610a875760a0830151608084015260e08301518351610a7d916001600160801b031690610ded565b60c0840152610b2a565b836001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae99190611280565b608084015260a083015160e0840151610b2491610b0e916001600160801b0316611375565b60808501518551610b1f9190611375565b610ded565b60c08401525b505092915050565b610b3a610e8a565b6040516370a0823160e01b81526001600160a01b0383811660048301528491908216906370a0823190602401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611280565b82526040516346df7f7160e11b81526001600160a01b038481166004830152821690638dbefee290602401602060405180830381865afa158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c139190611280565b826060018181525050806001600160a01b031663312f6b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e919061138c565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a0823190602401602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190611280565b6040838101919091528251905163266d6a8360e11b815260048101919091526001600160a01b03821690634cdad50690602401602060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e9190611280565b602083015260405163091030c360e01b81526001600160a01b03848116600483015282169063091030c3906024016040805180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc91906113a9565b6001600160d81b031660a084015264ffffffffff1660808301525092915050565b600081600003610dff5750600061056f565b81612710610e116301e1338086611375565b610e1b9190611375565b61056c91906113ee565b6040518061016001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160801b0316815260200160001515815260200160008152602001600081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600064ffffffffff16815260200160006001600160d81b031681525090565b60008083601f840112610ee257600080fd5b50813567ffffffffffffffff811115610efa57600080fd5b6020830191508360208260051b8501011115610f1557600080fd5b9250929050565b60008060008060408587031215610f3257600080fd5b843567ffffffffffffffff80821115610f4a57600080fd5b610f5688838901610ed0565b90965094506020870135915080821115610f6f57600080fd5b50610f7c87828801610ed0565b95989497509550505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e0810151610fe260e08401826001600160801b03169052565b5061010081810151151590830152610120808201519083015261014090810151910152565b600081518084526020808501945080840160005b838110156110425761102e878351610f88565b61016096909601959082019060010161101b565b509495945050505050565b6040815260006110606040830185611007565b90508260208301529392505050565b6001600160a01b038116811461108457600080fd5b50565b60008060008060006060868803121561109f57600080fd5b853567ffffffffffffffff808211156110b757600080fd5b6110c389838a01610ed0565b909750955060208801359150808211156110dc57600080fd5b506110e988828901610ed0565b90945092505060408601356110fd8161106f565b809150509295509295909350565b8051825260208082015190830152604080820151908301526060808201519083015260808082015164ffffffffff169083015260a0908101516001600160d81b0316910152565b6040815260006111656040830185611007565b82810360208481019190915284518083528582019282019060005b818110156111a65761119383865161110b565b9383019360c09290920191600101611180565b5090979650505050505050565b600080604083850312156111c657600080fd5b82356111d18161106f565b915060208301356111e18161106f565b809150509250929050565b610160810161056f8284610f88565b60008060006060848603121561121057600080fd5b833561121b8161106f565b9250602084013561122b8161106f565b9150604084013561123b8161106f565b809150509250925092565b61022081016112558285610f88565b61126361016083018461110b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561129257600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156112c157600080fd5b81356112638161106f565b634e487b7160e01b600052601160045260246000fd5b6000600182016112f4576112f46112cc565b5060010190565b60006020828403121561130d57600080fd5b8151801515811461126357600080fd5b80516001600160801b038116811461133457600080fd5b919050565b60008060006060848603121561134e57600080fd5b6113578461131d565b92506113656020850161131d565b9150604084015190509250925092565b808202811582820484141761056f5761056f6112cc565b60006020828403121561139e57600080fd5b81516112638161106f565b600080604083850312156113bc57600080fd5b825164ffffffffff811681146113d157600080fd5b60208401519092506001600160d81b03811681146111e157600080fd5b60008261140b57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212201237325600ddf33cbbdea3f7410a0deddca0f00cfcc15941dde73e189018cb0264736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f50000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000547a514d5e3769680ce22b2361c10ea13619e8a9

-----Decoded View---------------
Arg [0] : stkAave (address): 0x4da27a545c0c5B758a6BA100e3a049001de870f5
Arg [1] : ethUsdPriceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [2] : aaveUsdPriceFeed (address): 0x547a514d5e3769680Ce22B2361c10Ea13619e8a9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5
Arg [1] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [2] : 000000000000000000000000547a514d5e3769680ce22b2361c10ea13619e8a9


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.