ETH Price: $2,274.67 (-4.58%)

Contract

0x2AdA30F3612B4716A23a3B0A2069fbEafbBfA7B3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040148683072022-05-29 19:37:48831 days ago1653853068IN
 Create: InstaVaultUIResolver
0 ETH0.0778527528.101

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

Contract Source Code Verified (Exact Match)

Contract Name:
InstaVaultUIResolver

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : main.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./interface.sol";
import "./helpers.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract InstaVaultUIResolver is Helpers {
    struct CommonVaultInfo {
        address token;
        uint8 decimals;
        uint256 userBalance;
        uint256 userBalanceStETH;
        uint256 aaveTokenSupplyRate;
        uint256 aaveWETHBorrowRate_;
        uint256 totalStEthBal;
        uint256 wethDebtAmt;
        uint256 userSupplyAmount;
        uint256 vaultTVLInAsset;
        uint256 availableWithdraw;
        uint256 revenueFee;
        VaultInterfaceToken.Ratios ratios;
    }

    /**
     * @dev Get all the info
     * @notice Get info of all the vaults and the user
     */
    function getInfoCommon(address user_, address[] memory vaults_)
        public
        view
        returns (CommonVaultInfo[] memory commonInfo_)
    {
        uint256 len_ = vaults_.length;
        commonInfo_ = new CommonVaultInfo[](vaults_.length);

        for (uint256 i = 0; i < len_; i++) {
            VaultInterfaceCommon vault_ = VaultInterfaceCommon(vaults_[i]);
            IAavePriceOracle aaveOracle_ = IAavePriceOracle(
                AAVE_ADDR_PROVIDER.getPriceOracle()
            );
            uint256 ethPriceInBaseCurrency_ = aaveOracle_.getAssetPrice(
                WETH_ADDR
            );

            if (vaults_[i] == ETH_VAULT_ADDR) {
                HelperStruct memory helper_;
                VaultInterfaceETH ethVault_ = VaultInterfaceETH(vaults_[i]);
                VaultInterfaceETH.Ratios memory ratios_ = ethVault_.ratios();

                commonInfo_[i].token = ETH_ADDR;
                commonInfo_[i].decimals = 18;
                commonInfo_[i].userBalance = user_.balance;
                commonInfo_[i].userBalanceStETH = TokenInterface(STETH_ADDR)
                    .balanceOf(user_);
                commonInfo_[i].aaveTokenSupplyRate = 0;

                VaultInterfaceETH.BalVariables memory balances_;
                (
                    helper_.stethCollateralAmt,
                    commonInfo_[i].wethDebtAmt,
                    balances_,
                    ,

                ) = ethVault_.netAssets();

                commonInfo_[i].totalStEthBal =
                    helper_.stethCollateralAmt +
                    balances_.stethDsaBal +
                    balances_.stethVaultBal;
                commonInfo_[i].availableWithdraw = balances_.totalBal;
                uint256 currentRatioMax_ = (commonInfo_[i].wethDebtAmt * 1e4) /
                    helper_.stethCollateralAmt;
                uint256 maxLimitThreshold = ratios_.maxLimit - 10; // taking 0.1% margin
                if (currentRatioMax_ < maxLimitThreshold) {
                    commonInfo_[i].availableWithdraw +=
                        helper_.stethCollateralAmt -
                        ((1e4 * commonInfo_[i].wethDebtAmt) /
                            maxLimitThreshold);
                }
                commonInfo_[i].ratios.maxLimit = ratios_.maxLimit;
                commonInfo_[i].ratios.minLimit = ratios_.minLimit;
                commonInfo_[i].ratios.minLimitGap = ratios_.minLimitGap;
                commonInfo_[i].ratios.maxBorrowRate = ratios_.maxBorrowRate;
            } else {
                VaultInterfaceToken tokenVault_ = VaultInterfaceToken(
                    vaults_[i]
                );
                commonInfo_[i].ratios = tokenVault_.ratios();

                commonInfo_[i].token = tokenVault_.token();
                commonInfo_[i].decimals = vault_.decimals();
                commonInfo_[i].userBalance = TokenInterface(
                    commonInfo_[i].token
                ).balanceOf(user_);
                commonInfo_[i].userBalanceStETH = 0;
                (
                    ,
                    ,
                    ,
                    commonInfo_[i].aaveTokenSupplyRate,
                    ,
                    ,
                    ,
                    ,
                    ,

                ) = AAVE_DATA.getReserveData(commonInfo_[i].token);

                uint256 maxLimitThreshold = (commonInfo_[i].ratios.maxLimit -
                    100) - 10; // taking 0.1% margin from withdrawLimit
                uint256 stethCollateralAmt_;

                (
                    stethCollateralAmt_,
                    commonInfo_[i].wethDebtAmt,
                    commonInfo_[i].availableWithdraw
                ) = getAmounts(
                    vaults_[i],
                    commonInfo_[i].decimals,
                    aaveOracle_.getAssetPrice(commonInfo_[i].token),
                    ethPriceInBaseCurrency_,
                    commonInfo_[i].ratios.stEthLimit,
                    maxLimitThreshold
                );

                commonInfo_[i].totalStEthBal =
                    stethCollateralAmt_ +
                    IERC20(STETH_ADDR).balanceOf(vault_.vaultDsa()) +
                    IERC20(STETH_ADDR).balanceOf(vaults_[i]);
            }

            (uint256 exchangePrice, ) = vault_.getCurrentExchangePrice();
            commonInfo_[i].userSupplyAmount =
                (vault_.balanceOf(user_) * exchangePrice) /
                1e18;

            (, , , , commonInfo_[i].aaveWETHBorrowRate_, , , , , ) = AAVE_DATA
                .getReserveData(WETH_ADDR);

            commonInfo_[i].vaultTVLInAsset =
                (vault_.totalSupply() * exchangePrice) /
                1e18;

            commonInfo_[i].revenueFee = vault_.revenueFee();
        }
    }

    struct DeleverageAndWithdrawVars {
        uint256 withdrawalFee;
        uint256 currentRatioMax;
        uint256 currentRatioMin;
        uint256 netCollateral;
        uint256 netBorrow;
        VaultInterfaceETH.BalVariables balances;
        uint256 netSupply;
        uint256 availableWithdraw;
        uint256 maxLimitThreshold;
        address tokenAddr;
        uint256 tokenCollateralAmt;
        uint256 tokenVaultBal;
        uint256 tokenDSABal;
        uint256 netTokenBal;
        uint256 idealTokenBal;
        uint256 tokenPriceInBaseCurrency;
        uint256 ethPriceInBaseCurrency;
        uint256 tokenColInEth;
        uint256 tokenSupplyInEth;
        uint256 withdrawAmtInEth;
        uint256 idealTokenBalInEth;
    }

    function getDeleverageAndWithdrawData(
        address vaultAddr_,
        uint256 withdrawAmt_
    )
        public
        view
        returns (
            address tokenAddr_,
            uint256 tokenDecimals_,
            uint256 premium,
            uint256 tokenPriceInEth_,
            uint256 exchangePrice_,
            uint256 itokenAmt_,
            uint256 deleverageAmtMax_,
            uint256 deleverageAmtMin_,
            uint256 deleverageAmtTillMinLimit_,
            uint256 deleverageAmtTillMaxLimit_
        )
    {
        DeleverageAndWithdrawVars memory v_;
        premium = deleverageAndWithdrawWrapper.premium();
        v_.withdrawalFee = VaultInterfaceCommon(vaultAddr_).withdrawalFee();
        (exchangePrice_, ) = VaultInterfaceCommon(vaultAddr_)
            .getCurrentExchangePrice();
        itokenAmt_ = (withdrawAmt_ * 1e18) / exchangePrice_;
        withdrawAmt_ = withdrawAmt_ - (withdrawAmt_ * v_.withdrawalFee) / 1e4;
        (v_.currentRatioMax, v_.currentRatioMin) = getCurrentRatios(vaultAddr_);
        tokenDecimals_ = VaultInterfaceCommon(vaultAddr_).decimals();
        if (vaultAddr_ == ETH_VAULT_ADDR) {
            tokenAddr_ = ETH_ADDR;
            tokenPriceInEth_ = 1e18;
            VaultInterfaceETH.Ratios memory ratios_ = VaultInterfaceETH(
                vaultAddr_
            ).ratios();
            (
                v_.netCollateral,
                v_.netBorrow,
                v_.balances,
                v_.netSupply,

            ) = VaultInterfaceETH(vaultAddr_).netAssets();

            v_.availableWithdraw = v_.balances.totalBal;
            v_.maxLimitThreshold = ratios_.maxLimit;
            if (v_.currentRatioMax < v_.maxLimitThreshold) {
                v_.availableWithdraw +=
                    v_.netCollateral -
                    ((1e4 * v_.netBorrow) / v_.maxLimitThreshold);
            }

            // using this deleverageAmt_ the max ratio will remain the same
            if (withdrawAmt_ > v_.balances.totalBal) {
                deleverageAmtMax_ =
                    (v_.netBorrow * (withdrawAmt_ - v_.balances.totalBal)) /
                    (v_.netCollateral - v_.netBorrow);
            } else deleverageAmtMax_ = 0;

            // using this deleverageAmt_ the min ratio will remain the same
            deleverageAmtMin_ =
                (v_.netBorrow * withdrawAmt_) /
                (v_.netSupply - v_.netBorrow);

            // using this deleverageAmt_ the max ratio will be taken to maxLimit (unless ideal balance is sufficient)
            if (
                v_.availableWithdraw <= withdrawAmt_ &&
                withdrawAmt_ > v_.balances.totalBal
            ) {
                deleverageAmtTillMaxLimit_ =
                    ((v_.netBorrow * 1e4) -
                        ((ratios_.maxLimit - 10) * // taking 0.1% margin from maxLimit
                            (v_.netSupply - withdrawAmt_))) /
                    (1e4 - (ratios_.maxLimit - 10));
            } else deleverageAmtTillMaxLimit_ = 0;

            // using this deleverageAmt_ the min ratio will be taken to minLimit
            if (v_.availableWithdraw <= withdrawAmt_) {
                deleverageAmtTillMinLimit_ =
                    ((v_.netBorrow * 1e4) -
                        (ratios_.minLimit * (v_.netSupply - withdrawAmt_))) /
                    (1e4 - ratios_.minLimit);
            } else deleverageAmtTillMinLimit_ = 0;
        } else {
            tokenAddr_ = VaultInterfaceToken(vaultAddr_).token();
            VaultInterfaceToken.Ratios memory ratios_ = VaultInterfaceToken(
                vaultAddr_
            ).ratios();
            v_.tokenAddr = VaultInterfaceToken(vaultAddr_).token();
            (
                v_.tokenCollateralAmt,
                ,
                ,
                v_.tokenVaultBal,
                v_.tokenDSABal,
                v_.netTokenBal
            ) = VaultInterfaceToken(vaultAddr_).getVaultBalances();
            v_.idealTokenBal = v_.tokenVaultBal + v_.tokenDSABal;

            IAavePriceOracle aaveOracle_ = IAavePriceOracle(
                AAVE_ADDR_PROVIDER.getPriceOracle()
            );
            v_.tokenPriceInBaseCurrency = aaveOracle_.getAssetPrice(
                v_.tokenAddr
            );
            v_.ethPriceInBaseCurrency = aaveOracle_.getAssetPrice(WETH_ADDR);
            tokenPriceInEth_ =
                (v_.tokenPriceInBaseCurrency * 1e18) /
                v_.ethPriceInBaseCurrency;
            v_.tokenColInEth =
                (v_.tokenCollateralAmt * tokenPriceInEth_) /
                (10**tokenDecimals_);
            v_.tokenSupplyInEth =
                (v_.netTokenBal * tokenPriceInEth_) /
                (10**tokenDecimals_);
            v_.withdrawAmtInEth =
                (withdrawAmt_ * tokenPriceInEth_) /
                (10**tokenDecimals_);
            v_.idealTokenBalInEth =
                (v_.idealTokenBal * tokenPriceInEth_) /
                (10**tokenDecimals_);

            // using this deleverageAmt_ the max ratio will remain the same
            if (v_.withdrawAmtInEth > v_.idealTokenBalInEth) {
                deleverageAmtMax_ =
                    (v_.currentRatioMax *
                        (v_.withdrawAmtInEth - v_.idealTokenBalInEth)) /
                    (10000 - ratios_.stEthLimit);
            } else deleverageAmtMax_ = 0;

            // using this deleverageAmt_ the min ratio will remain the same
            deleverageAmtMin_ =
                (v_.currentRatioMin * v_.withdrawAmtInEth) /
                (10000 - ratios_.stEthLimit);

            v_.availableWithdraw = v_.tokenVaultBal + v_.tokenDSABal;
            v_.maxLimitThreshold = ratios_.maxLimit - 100;
            if (v_.currentRatioMax < v_.maxLimitThreshold) {
                v_.availableWithdraw += (((v_.maxLimitThreshold -
                    v_.currentRatioMax) * v_.tokenCollateralAmt) /
                    v_.maxLimitThreshold);
            }

            // using this deleverageAmt_ the max ratio will be taken to maxLimit (unless ideal balance is sufficient)
            if (
                v_.availableWithdraw <= withdrawAmt_ &&
                withdrawAmt_ > v_.idealTokenBal
            ) {
                deleverageAmtTillMaxLimit_ =
                    ((v_.currentRatioMax * v_.tokenColInEth) -
                        (ratios_.maxLimit *
                            (v_.tokenColInEth -
                                (v_.withdrawAmtInEth -
                                    v_.idealTokenBalInEth)))) /
                    (10000 - ratios_.stEthLimit);
            } else deleverageAmtTillMaxLimit_ = 0;

            // using this deleverageAmt_ the min ratio will be taken to minLimit
            if (v_.availableWithdraw <= withdrawAmt_) {
                deleverageAmtTillMinLimit_ =
                    ((v_.currentRatioMin * v_.tokenSupplyInEth) -
                        (ratios_.minLimit *
                            (v_.tokenSupplyInEth - v_.withdrawAmtInEth))) /
                    (10000 - ratios_.stEthLimit);
            } else deleverageAmtTillMinLimit_ = 0;
        }
    }
}

File 2 of 4 : interface.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface IAaveAddressProvider {
    function getPriceOracle() external view returns (address);
}

interface IAavePriceOracle {
    function getAssetPrice(address _asset) external view returns (uint256);
}

interface IAaveDataprovider {
    function getReserveData(address asset)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint40
        );
}

interface TokenInterface {
    function approve(address, uint256) external;

    function transfer(address, uint256) external;

    function transferFrom(
        address,
        address,
        uint256
    ) external;

    function deposit() external payable;

    function withdraw(uint256) external;

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

    function decimals() external view returns (uint256);

    function totalSupply() external view returns (uint256);
}

interface VaultInterfaceETH {
    struct BalVariables {
        uint256 wethVaultBal;
        uint256 wethDsaBal;
        uint256 stethVaultBal;
        uint256 stethDsaBal;
        uint256 totalBal;
    }

    function netAssets()
        external
        view
        returns (
            uint256 netCollateral_,
            uint256 netBorrow_,
            BalVariables memory balances_,
            uint256 netSupply_,
            uint256 netBal_
        );

    struct Ratios {
        uint16 maxLimit;
        uint16 minLimit;
        uint16 minLimitGap;
        uint128 maxBorrowRate;
    }

    function ratios() external view returns (Ratios memory);
}

interface VaultInterfaceToken {
    struct Ratios {
        uint16 maxLimit;
        uint16 maxLimitGap;
        uint16 minLimit;
        uint16 minLimitGap;
        uint16 stEthLimit;
        uint128 maxBorrowRate;
    }

    function ratios() external view returns (Ratios memory);

    function token() external view returns (address);

    function idealExcessAmt() external view returns (uint256);

    function getVaultBalances()
        external
        view
        returns (
            uint256 tokenCollateralAmt_,
            uint256 stethCollateralAmt_,
            uint256 wethDebtAmt_,
            uint256 tokenVaultBal_,
            uint256 tokenDSABal_,
            uint256 netTokenBal_
        );
}

interface VaultInterfaceCommon {
    function decimals() external view returns (uint8);

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

    function getCurrentExchangePrice()
        external
        view
        returns (uint256 exchangePrice_, uint256 newRevenue_);

    function vaultDsa() external view returns (address);

    function totalSupply() external view returns (uint256);

    function revenueFee() external view returns (uint256);

    function withdrawalFee() external view returns (uint256);
}

interface InstaDeleverageAndWithdrawWrapper {
    function premium() external view returns (uint256);
}

File 3 of 4 : helpers.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./interface.sol";

contract Helpers {
    IAaveAddressProvider internal constant AAVE_ADDR_PROVIDER =
        IAaveAddressProvider(0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5);
    IAaveDataprovider internal constant AAVE_DATA =
        IAaveDataprovider(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d);
    InstaDeleverageAndWithdrawWrapper
        internal constant deleverageAndWithdrawWrapper =
        InstaDeleverageAndWithdrawWrapper(
            0xA6978cBA39f86491Ae5dcA53f4cdeFCB100E3E3d
        );

    address internal constant ETH_ADDR =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address internal constant WETH_ADDR =
        0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address internal constant STETH_ADDR =
        0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84;
    address internal constant ETH_VAULT_ADDR =
        0xc383a3833A87009fD9597F8184979AF5eDFad019;

    struct BalVariables {
        uint256 wethVaultBal;
        uint256 wethDsaBal;
        uint256 stethVaultBal;
        uint256 stethDsaBal;
        uint256 totalBal;
    }

    struct HelperStruct {
        uint256 stethCollateralAmt;
        uint256 tokenVaultBal;
        uint256 tokenDSABal;
        uint256 netTokenBal;
        uint256 tokenCollateralAmt;
    }

    /**
     * @dev Helper function
     * @notice Helper function for calculating amounts
     */
    function getAmounts(
        address vaultAddr_,
        uint256 decimals_,
        uint256 tokenPriceInBaseCurrency_,
        uint256 ethPriceInBaseCurrency_,
        uint256 stEthLimit_,
        uint256 maxLimitThreshold_
    )
        internal
        view
        returns (
            uint256 stethCollateralAmt,
            uint256 wethDebtAmt,
            uint256 availableWithdraw
        )
    {
        VaultInterfaceToken tokenVault_ = VaultInterfaceToken(vaultAddr_);
        HelperStruct memory helper_;

        (
            helper_.tokenCollateralAmt,
            stethCollateralAmt,
            wethDebtAmt,
            helper_.tokenVaultBal,
            helper_.tokenDSABal,
            helper_.netTokenBal
        ) = tokenVault_.getVaultBalances();

        uint256 tokenPriceInEth = (tokenPriceInBaseCurrency_ * 1e18) /
            ethPriceInBaseCurrency_;
        uint256 tokenColInEth_ = (helper_.tokenCollateralAmt *
            tokenPriceInEth) / (10**decimals_);
        uint256 ethCoveringDebt_ = (stethCollateralAmt * stEthLimit_) / 10000;
        uint256 excessDebt_ = (ethCoveringDebt_ < wethDebtAmt)
            ? wethDebtAmt - ethCoveringDebt_
            : 0;
        uint256 currentRatioMax = tokenColInEth_ == 0
            ? 0
            : (excessDebt_ * 10000) / tokenColInEth_;

        availableWithdraw = helper_.tokenVaultBal + helper_.tokenDSABal;
        if (currentRatioMax < maxLimitThreshold_) {
            availableWithdraw += (((maxLimitThreshold_ - currentRatioMax) *
                helper_.tokenCollateralAmt) / maxLimitThreshold_);
        }
    }

    struct CurrentRatioVars {
        uint256 netCollateral;
        uint256 netBorrow;
        uint256 netSupply;
        address tokenAddr;
        uint256 tokenDecimals;
        uint256 tokenColAmt;
        uint256 stethColAmt;
        uint256 wethDebt;
        uint256 netTokenBal;
        uint256 ethCoveringDebt;
        uint256 excessDebt;
        uint256 tokenPriceInBaseCurrency;
        uint256 ethPriceInBaseCurrency;
        uint256 excessDebtInBaseCurrency;
        uint256 netTokenColInBaseCurrency;
        uint256 netTokenSupplyInBaseCurrency;
    }

    function getCurrentRatios(address vaultAddr_)
        public
        view
        returns (uint256 currentRatioMax_, uint256 currentRatioMin_)
    {
        CurrentRatioVars memory v_;
        if (vaultAddr_ == ETH_VAULT_ADDR) {
            (
                v_.netCollateral,
                v_.netBorrow,
                ,
                v_.netSupply,

            ) = VaultInterfaceETH(vaultAddr_).netAssets();
            currentRatioMax_ = (v_.netBorrow * 1e4) / v_.netCollateral;
            currentRatioMin_ = (v_.netBorrow * 1e4) / v_.netSupply;
        } else {
            VaultInterfaceToken vault_ = VaultInterfaceToken(vaultAddr_);
            v_.tokenAddr = vault_.token();
            v_.tokenDecimals = VaultInterfaceCommon(vaultAddr_).decimals();
            (
                v_.tokenColAmt,
                v_.stethColAmt,
                v_.wethDebt,
                ,
                ,
                v_.netTokenBal
            ) = vault_.getVaultBalances();
            VaultInterfaceToken.Ratios memory ratios_ = vault_.ratios();
            v_.ethCoveringDebt = (v_.stethColAmt * ratios_.stEthLimit) / 10000;
            v_.excessDebt = v_.ethCoveringDebt < v_.wethDebt
                ? v_.wethDebt - v_.ethCoveringDebt
                : 0;
            IAavePriceOracle aaveOracle_ = IAavePriceOracle(
                AAVE_ADDR_PROVIDER.getPriceOracle()
            );
            v_.tokenPriceInBaseCurrency = aaveOracle_.getAssetPrice(
                v_.tokenAddr
            );
            v_.ethPriceInBaseCurrency = aaveOracle_.getAssetPrice(WETH_ADDR);
            v_.excessDebtInBaseCurrency =
                (v_.excessDebt * v_.ethPriceInBaseCurrency) /
                1e18;

            v_.netTokenColInBaseCurrency =
                (v_.tokenColAmt * v_.tokenPriceInBaseCurrency) /
                (10**v_.tokenDecimals);
            v_.netTokenSupplyInBaseCurrency =
                (v_.netTokenBal * v_.tokenPriceInBaseCurrency) /
                (10**v_.tokenDecimals);

            currentRatioMax_ =
                (v_.excessDebtInBaseCurrency * 10000) /
                v_.netTokenColInBaseCurrency;
            currentRatioMin_ =
                (v_.excessDebtInBaseCurrency * 10000) /
                v_.netTokenSupplyInBaseCurrency;
        }
    }
}

File 4 of 4 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"vaultAddr_","type":"address"}],"name":"getCurrentRatios","outputs":[{"internalType":"uint256","name":"currentRatioMax_","type":"uint256"},{"internalType":"uint256","name":"currentRatioMin_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vaultAddr_","type":"address"},{"internalType":"uint256","name":"withdrawAmt_","type":"uint256"}],"name":"getDeleverageAndWithdrawData","outputs":[{"internalType":"address","name":"tokenAddr_","type":"address"},{"internalType":"uint256","name":"tokenDecimals_","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"tokenPriceInEth_","type":"uint256"},{"internalType":"uint256","name":"exchangePrice_","type":"uint256"},{"internalType":"uint256","name":"itokenAmt_","type":"uint256"},{"internalType":"uint256","name":"deleverageAmtMax_","type":"uint256"},{"internalType":"uint256","name":"deleverageAmtMin_","type":"uint256"},{"internalType":"uint256","name":"deleverageAmtTillMinLimit_","type":"uint256"},{"internalType":"uint256","name":"deleverageAmtTillMaxLimit_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"address[]","name":"vaults_","type":"address[]"}],"name":"getInfoCommon","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"userBalance","type":"uint256"},{"internalType":"uint256","name":"userBalanceStETH","type":"uint256"},{"internalType":"uint256","name":"aaveTokenSupplyRate","type":"uint256"},{"internalType":"uint256","name":"aaveWETHBorrowRate_","type":"uint256"},{"internalType":"uint256","name":"totalStEthBal","type":"uint256"},{"internalType":"uint256","name":"wethDebtAmt","type":"uint256"},{"internalType":"uint256","name":"userSupplyAmount","type":"uint256"},{"internalType":"uint256","name":"vaultTVLInAsset","type":"uint256"},{"internalType":"uint256","name":"availableWithdraw","type":"uint256"},{"internalType":"uint256","name":"revenueFee","type":"uint256"},{"components":[{"internalType":"uint16","name":"maxLimit","type":"uint16"},{"internalType":"uint16","name":"maxLimitGap","type":"uint16"},{"internalType":"uint16","name":"minLimit","type":"uint16"},{"internalType":"uint16","name":"minLimitGap","type":"uint16"},{"internalType":"uint16","name":"stEthLimit","type":"uint16"},{"internalType":"uint128","name":"maxBorrowRate","type":"uint128"}],"internalType":"struct VaultInterfaceToken.Ratios","name":"ratios","type":"tuple"}],"internalType":"struct InstaVaultUIResolver.CommonVaultInfo[]","name":"commonInfo_","type":"tuple[]"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061312b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806328327584146100465780639bdbd7f71461006f578063c691d6dc146100d6575b600080fd5b6100596100543660046129b2565b6100fe565b6040516100669190612d87565b60405180910390f35b61008261007d366004612a80565b6112d5565b604080516001600160a01b03909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e084015261010083015261012082015261014001610066565b6100e96100e4366004612971565b611f5e565b60408051928352602083019190915201610066565b80516060908067ffffffffffffffff81111561011c5761011c6130c7565b60405190808252806020026020018201604052801561015557816020015b6101426127a3565b81526020019060019003908161013a5790505b50915060005b818110156112cd576000848281518110610177576101776130b1565b60200260200101519050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156101d057600080fd5b505afa1580156101e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102089190612995565b60405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201529091506000906001600160a01b0383169063b3596f079060240160206040518083038186803b15801561026157600080fd5b505afa158015610275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102999190612bc8565b905073c383a3833a87009fd9597f8184979af5edfad0196001600160a01b03168785815181106102cb576102cb6130b1565b60200260200101516001600160a01b0316141561081e576103146040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000888681518110610328576103286130b1565b602002602001015190506000816001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160806040518083038186803b15801561036d57600080fd5b505afa158015610381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a59190612aac565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8988815181106103ce576103ce6130b1565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506012898881518110610406576104066130b1565b60200260200101516020019060ff16908160ff16815250508a6001600160a01b03163189888151811061043b5761043b6130b1565b6020908102919091010151604090810191909152516370a0823160e01b81526001600160a01b038c16600482015273ae7ab96520de3a18e5e111b5eaab095312d7fe84906370a082319060240160206040518083038186803b1580156104a057600080fd5b505afa1580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190612bc8565b8988815181106104ea576104ea6130b1565b60200260200101516060018181525050600089888151811061050e5761050e6130b1565b602002602001015160800181815250506105506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b826001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561058a57600080fd5b505afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190612c05565b905050866000018d8c815181106105db576105db6130b1565b602002602001015160e001829550838152508381525050505080604001518160600151856000015161060d9190612f00565b6106179190612f00565b8a8981518110610629576106296130b1565b602002602001015160c001818152505080608001518a8981518110610650576106506130b1565b6020026020010151610140018181525050600084600001518b8a8151811061067a5761067a6130b1565b602002602001015160e001516127106106939190613027565b61069d9190612f18565b90506000600a84600001516106b29190613046565b61ffff1690508082101561073157808c8b815181106106d3576106d36130b1565b602002602001015160e001516127106106ec9190613027565b6106f69190612f18565b86516107029190613069565b8c8b81518110610714576107146130b1565b60200260200101516101400181815161072d9190612f00565b9052505b83600001518c8b81518110610748576107486130b1565b602002602001015161018001516000019061ffff16908161ffff168152505083602001518c8b8151811061077e5761077e6130b1565b602002602001015161018001516040019061ffff16908161ffff168152505083604001518c8b815181106107b4576107b46130b1565b602002602001015161018001516060019061ffff16908161ffff168152505083606001518c8b815181106107ea576107ea6130b1565b6020026020010151610180015160a001906001600160801b031690816001600160801b031681525050505050505050610f75565b6000878581518110610832576108326130b1565b60200260200101519050806001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160c06040518083038186803b15801561087557600080fd5b505afa158015610889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ad9190612b29565b8786815181106108bf576108bf6130b1565b60200260200101516101800181905250806001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561090857600080fd5b505afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190612995565b878681518110610952576109526130b1565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190612d64565b8786815181106109f9576109f96130b1565b60200260200101516020019060ff16908160ff1681525050868581518110610a2357610a236130b1565b6020908102919091010151516040516370a0823160e01b81526001600160a01b038b81166004830152909116906370a082319060240160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa99190612bc8565b878681518110610abb57610abb6130b1565b602002602001015160400181815250506000878681518110610adf57610adf6130b1565b6020026020010151606001818152505073057835ad21a177dbdd3090bb1cae03eacf78fc6d6001600160a01b03166335ea6a75888781518110610b2457610b246130b1565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016101406040518083038186803b158015610b7057600080fd5b505afa158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba89190612cdb565b50508e519497508e96508c955050509183109150610bca905057610bca6130b1565b602002602001015160800181815250506000600a6064898881518110610bf257610bf26130b1565b6020026020010151610180015160000151610c0d9190613046565b610c179190613046565b61ffff1690506000610d2f8a8881518110610c3457610c346130b1565b60200260200101518a8981518110610c4e57610c4e6130b1565b60200260200101516020015160ff16876001600160a01b031663b3596f078d8c81518110610c7e57610c7e6130b1565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610cc957600080fd5b505afa158015610cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d019190612bc8565b878d8c81518110610d1457610d146130b1565b602002602001015161018001516080015161ffff16876125cf565b8b8a81518110610d4157610d416130b1565b602002602001015160e0018c8b81518110610d5e57610d5e6130b1565b602002602001015161014001828152508281525082935050505073ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03166370a082318b8981518110610dad57610dad6130b1565b60200260200101516040518263ffffffff1660e01b8152600401610de091906001600160a01b0391909116815260200190565b60206040518083038186803b158015610df857600080fd5b505afa158015610e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e309190612bc8565b73ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03166370a08231886001600160a01b031663dc9356986040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8c57600080fd5b505afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec49190612995565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190612bc8565b610f459083612f00565b610f4f9190612f00565b898881518110610f6157610f616130b1565b602002602001015160c00181815250505050505b6000836001600160a01b031663cc4a01586040518163ffffffff1660e01b8152600401604080518083038186803b158015610faf57600080fd5b505afa158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190612be1565b506040516370a0823160e01b81526001600160a01b038b81166004830152919250670de0b6b3a7640000918391908716906370a082319060240160206040518083038186803b15801561103957600080fd5b505afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190612bc8565b61107b9190613027565b6110859190612f18565b878681518110611097576110976130b1565b602090810291909101015161010001526040516335ea6a7560e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482015273057835ad21a177dbdd3090bb1cae03eacf78fc6d906335ea6a75906024016101406040518083038186803b15801561110657600080fd5b505afa15801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190612cdb565b50508e519397508e96508c9550505090831091506111609050576111606130b1565b602002602001015160a0018181525050670de0b6b3a764000081856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b357600080fd5b505afa1580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111eb9190612bc8565b6111f59190613027565b6111ff9190612f18565b878681518110611211576112116130b1565b6020026020010151610120018181525050836001600160a01b03166336e4ec646040518163ffffffff1660e01b815260040160206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190612bc8565b8786815181106112a5576112a56130b1565b60200260200101516101600181815250505050505080806112c590613080565b91505061015b565b505092915050565b6000806000806000806000806000806112ec61286a565b73a6978cba39f86491ae5dca53f4cdefcb100e3e3d6001600160a01b031663e0a73a936040518163ffffffff1660e01b815260040160206040518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113719190612bc8565b98508c6001600160a01b0316638bc7e8c46040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190612bc8565b8160000181815250508c6001600160a01b031663cc4a01586040518163ffffffff1660e01b8152600401604080518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d9190612be1565b509650866114738d670de0b6b3a7640000613027565b61147d9190612f18565b815190965061271090611490908e613027565b61149a9190612f18565b6114a4908d613069565b9b506114af8d611f5e565b8260200183604001828152508281525050508c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156114fa57600080fd5b505afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190612d64565b60ff1699506001600160a01b038d1673c383a3833a87009fd9597f8184979af5edfad01914156118895773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a50670de0b6b3a7640000975060008d6001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160806040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190612aac565b90508d6001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561162d57600080fd5b505afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190612c05565b5060c086015260a085018190526080808601929092526060850192909252015160e0830152805161ffff166101008301819052602083015110156116e85761010082015160808301516116ba90612710613027565b6116c49190612f18565b82606001516116d39190613069565b8260e0018181516116e49190612f00565b9052505b8160a00151608001518d111561173f578160800151826060015161170c9190613069565b60a08301516080015161171f908f613069565b836080015161172e9190613027565b6117389190612f18565b9550611744565b600095505b81608001518260c001516117589190613069565b8d83608001516117689190613027565b6117729190612f18565b94508c8260e001511115801561178f57508160a00151608001518d115b1561180a5780516117a290600a90613046565b6117ae90612710613046565b61ffff168d8360c001516117c29190613069565b82516117d090600a90613046565b61ffff166117de9190613027565b60808401516117ef90612710613027565b6117f99190613069565b6118039190612f18565b925061180f565b600092505b8c8260e001511161187e57602081015161182b90612710613046565b61ffff168d8360c0015161183f9190613069565b826020015161ffff166118529190613027565b608084015161186390612710613027565b61186d9190613069565b6118779190612f18565b9350611883565b600093505b50611f4e565b8c6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c257600080fd5b505afa1580156118d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fa9190612995565b9a5060008d6001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160c06040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f9190612b29565b90508d6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119aa57600080fd5b505afa1580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190612995565b8261012001906001600160a01b031690816001600160a01b0316815250508d6001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190612c91565b6101a088015261018087018190526101608701829052610140870194909452611a9d9392509050612f00565b826101c0018181525050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612995565b61012084015160405163b3596f0760e01b81526001600160a01b03918216600482015291925082169063b3596f079060240160206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612bc8565b6101e084015260405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0382169063b3596f079060240160206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190612bc8565b61020084018190526101e0840151611c6190670de0b6b3a7640000613027565b611c6b9190612f18565b9950611c788c600a612f7d565b8a846101400151611c899190613027565b611c939190612f18565b610220840152611ca48c600a612f7d565b8a846101a00151611cb59190613027565b611cbf9190612f18565b610240840152611cd08c600a612f7d565b8a8f611cdc9190613027565b611ce69190612f18565b610260840152611cf78c600a612f7d565b8a846101c00151611d089190613027565b611d129190612f18565b61028084018190526102608401511115611d71576080820151611d3790612710613046565b61ffff16836102800151846102600151611d519190613069565b8460200151611d609190613027565b611d6a9190612f18565b9650611d76565b600096505b6080820151611d8790612710613046565b61ffff168361026001518460400151611da09190613027565b611daa9190612f18565b9550826101800151836101600151611dc29190612f00565b60e08401528151611dd590606490613046565b61ffff16610100840181905260208401511015611e30576101008301516101408401516020850151611e079083613069565b611e119190613027565b611e1b9190612f18565b8360e001818151611e2c9190612f00565b9052505b8d8360e0015111158015611e485750826101c001518e115b15611ec8576080820151611e5e90612710613046565b61ffff16836102800151846102600151611e789190613069565b846102200151611e889190613069565b8351611e98919061ffff16613027565b8461022001518560200151611ead9190613027565b611eb79190613069565b611ec19190612f18565b9350611ecd565b600093505b8d8360e0015111611f46576080820151611ee990612710613046565b61ffff16836102600151846102400151611f039190613069565b836040015161ffff16611f169190613027565b8461024001518560400151611f2b9190613027565b611f359190613069565b611f3f9190612f18565b9450611f4b565b600094505b50505b509295989b9194979a5092959850565b600080611fea60405180610200016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b03841673c383a3833a87009fd9597f8184979af5edfad01914156120d257836001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561204957600080fd5b505afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120819190612c05565b506040850152506020830181905281835261209e90612710613027565b6120a89190612f18565b9250806040015181602001516127106120c19190613027565b6120cb9190612f18565b91506125c9565b6000849050806001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211057600080fd5b505afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121489190612995565b82606001906001600160a01b031690816001600160a01b031681525050846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561219e57600080fd5b505afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190612d64565b60ff16826080018181525050806001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b15801561221b57600080fd5b505afa15801561222f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122539190612c91565b610100880152505060e085015260c08085019190915260a0840191909152604080516367b6b12f60e11b815290516000926001600160a01b0385169263cf6d625e9260048083019392829003018186803b1580156122b057600080fd5b505afa1580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190612b29565b9050612710816080015161ffff168460c001516123059190613027565b61230f9190612f18565b610120840181905260e08401511161232857600061233d565b8261012001518360e0015161233d9190613069565b83610140018181525050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612995565b606085015160405163b3596f0760e01b81526001600160a01b03918216600482015291925082169063b3596f079060240160206040518083038186803b15801561241757600080fd5b505afa15801561242b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244f9190612bc8565b61016085015260405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0382169063b3596f079060240160206040518083038186803b1580156124a857600080fd5b505afa1580156124bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e09190612bc8565b6101808501819052610140850151670de0b6b3a76400009161250191613027565b61250b9190612f18565b6101a0850152608084015161252190600a612f7d565b8461016001518560a001516125369190613027565b6125409190612f18565b6101c0850152608084015161255690600a612f7d565b84610160015185610100015161256c9190613027565b6125769190612f18565b6101e08501526101c08401516101a085015161259490612710613027565b61259e9190612f18565b9550836101e00151846101a001516127106125b99190613027565b6125c39190612f18565b94505050505b50915091565b60008060008089905061260a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b15801561264357600080fd5b505afa158015612657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267b9190612c91565b6060870152604086015260208501526080840192909252955093506000886126ab8b670de0b6b3a7640000613027565b6126b59190612f18565b905060006126c48c600a612f7d565b8284608001516126d49190613027565b6126de9190612f18565b905060006127106126ef8b8a613027565b6126f99190612f18565b9050600087821061270b576000612715565b6127158289613069565b90506000831561273b578361272c83612710613027565b6127369190612f18565b61273e565b60005b9050856040015186602001516127549190612f00565b97508a8110156127905760808601518b9061276f8383613069565b6127799190613027565b6127839190612f18565b61278d9089612f00565b97505b5050505050505096509650969350505050565b604051806101a0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016128656040518060c00160405280600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160006001600160801b031681525090565b905290565b604051806102a0016040528060008152602001600081526020016000815260200160008152602001600081526020016128cb6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516001600160801b038116811461295a57600080fd5b919050565b805161ffff8116811461295a57600080fd5b60006020828403121561298357600080fd5b813561298e816130dd565b9392505050565b6000602082840312156129a757600080fd5b815161298e816130dd565b600080604083850312156129c557600080fd5b82356129d0816130dd565b915060208381013567ffffffffffffffff808211156129ee57600080fd5b818601915086601f830112612a0257600080fd5b813581811115612a1457612a146130c7565b8060051b9150612a25848301612ecf565b8181528481019084860184860187018b1015612a4057600080fd5b600095505b83861015612a6f5780359450612a5a856130dd565b84835260019590950194918601918601612a45565b508096505050505050509250929050565b60008060408385031215612a9357600080fd5b8235612a9e816130dd565b946020939093013593505050565b600060808284031215612abe57600080fd5b6040516080810181811067ffffffffffffffff82111715612ae157612ae16130c7565b604052612aed8361295f565b8152612afb6020840161295f565b6020820152612b0c6040840161295f565b6040820152612b1d60608401612943565b60608201529392505050565b600060c08284031215612b3b57600080fd5b60405160c0810181811067ffffffffffffffff82111715612b5e57612b5e6130c7565b604052612b6a8361295f565b8152612b786020840161295f565b6020820152612b896040840161295f565b6040820152612b9a6060840161295f565b6060820152612bab6080840161295f565b6080820152612bbc60a08401612943565b60a08201529392505050565b600060208284031215612bda57600080fd5b5051919050565b60008060408385031215612bf457600080fd5b505080516020909101519092909150565b6000806000806000858703610120811215612c1f57600080fd5b865195506020870151945060a0603f1982011215612c3c57600080fd5b50612c45612ea6565b60408701518152606087015160208201526080870151604082015260a0870151606082015260c087015160808201528093505060e0860151915061010086015190509295509295909350565b60008060008060008060c08789031215612caa57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b6000806000806000806000806000806101408b8d031215612cfb57600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506101208b015164ffffffffff81168114612d5157600080fd5b809150509295989b9194979a5092959850565b600060208284031215612d7657600080fd5b815160ff8116811461298e57600080fd5b602080825282518282018190526000919060409081850190868401855b82811015612e9957815180516001600160a01b031685528681015160ff16878601528581015186860152606080820151818701526080808301518188015260a0808401518189015260c0808501519089015260e08085015190890152610100808501519089015261012080850151908901526101408085015190890152610160808501519089015261018093840151805161ffff908116958a0195909552602081015185166101a08a0152604081015185166101c08a01529283015184166101e08901529082015190921661020087015201516001600160801b03166102208501526102409093019290850190600101612da4565b5091979650505050505050565b60405160a0810167ffffffffffffffff81118282101715612ec957612ec96130c7565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ef857612ef86130c7565b604052919050565b60008219821115612f1357612f1361309b565b500190565b600082612f3557634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612f75578160001904821115612f5b57612f5b61309b565b80851615612f6857918102915b93841c9390800290612f3f565b509250929050565b600061298e8383600082612f9357506001613021565b81612fa057506000613021565b8160018114612fb65760028114612fc057612fdc565b6001915050613021565b60ff841115612fd157612fd161309b565b50506001821b613021565b5060208310610133831016604e8410600b8410161715612fff575081810a613021565b6130098383612f3a565b806000190482111561301d5761301d61309b565b0290505b92915050565b60008160001904831182151516156130415761304161309b565b500290565b600061ffff838116908316818110156130615761306161309b565b039392505050565b60008282101561307b5761307b61309b565b500390565b60006000198214156130945761309461309b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146130f257600080fd5b5056fea2646970667358221220fc933c5c82748dd57fab68bd06e885a6ac92ee47ea61bfed35f0e867ae67726564736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100415760003560e01c806328327584146100465780639bdbd7f71461006f578063c691d6dc146100d6575b600080fd5b6100596100543660046129b2565b6100fe565b6040516100669190612d87565b60405180910390f35b61008261007d366004612a80565b6112d5565b604080516001600160a01b03909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e084015261010083015261012082015261014001610066565b6100e96100e4366004612971565b611f5e565b60408051928352602083019190915201610066565b80516060908067ffffffffffffffff81111561011c5761011c6130c7565b60405190808252806020026020018201604052801561015557816020015b6101426127a3565b81526020019060019003908161013a5790505b50915060005b818110156112cd576000848281518110610177576101776130b1565b60200260200101519050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156101d057600080fd5b505afa1580156101e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102089190612995565b60405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201529091506000906001600160a01b0383169063b3596f079060240160206040518083038186803b15801561026157600080fd5b505afa158015610275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102999190612bc8565b905073c383a3833a87009fd9597f8184979af5edfad0196001600160a01b03168785815181106102cb576102cb6130b1565b60200260200101516001600160a01b0316141561081e576103146040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000888681518110610328576103286130b1565b602002602001015190506000816001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160806040518083038186803b15801561036d57600080fd5b505afa158015610381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a59190612aac565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8988815181106103ce576103ce6130b1565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506012898881518110610406576104066130b1565b60200260200101516020019060ff16908160ff16815250508a6001600160a01b03163189888151811061043b5761043b6130b1565b6020908102919091010151604090810191909152516370a0823160e01b81526001600160a01b038c16600482015273ae7ab96520de3a18e5e111b5eaab095312d7fe84906370a082319060240160206040518083038186803b1580156104a057600080fd5b505afa1580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190612bc8565b8988815181106104ea576104ea6130b1565b60200260200101516060018181525050600089888151811061050e5761050e6130b1565b602002602001015160800181815250506105506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b826001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561058a57600080fd5b505afa15801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190612c05565b905050866000018d8c815181106105db576105db6130b1565b602002602001015160e001829550838152508381525050505080604001518160600151856000015161060d9190612f00565b6106179190612f00565b8a8981518110610629576106296130b1565b602002602001015160c001818152505080608001518a8981518110610650576106506130b1565b6020026020010151610140018181525050600084600001518b8a8151811061067a5761067a6130b1565b602002602001015160e001516127106106939190613027565b61069d9190612f18565b90506000600a84600001516106b29190613046565b61ffff1690508082101561073157808c8b815181106106d3576106d36130b1565b602002602001015160e001516127106106ec9190613027565b6106f69190612f18565b86516107029190613069565b8c8b81518110610714576107146130b1565b60200260200101516101400181815161072d9190612f00565b9052505b83600001518c8b81518110610748576107486130b1565b602002602001015161018001516000019061ffff16908161ffff168152505083602001518c8b8151811061077e5761077e6130b1565b602002602001015161018001516040019061ffff16908161ffff168152505083604001518c8b815181106107b4576107b46130b1565b602002602001015161018001516060019061ffff16908161ffff168152505083606001518c8b815181106107ea576107ea6130b1565b6020026020010151610180015160a001906001600160801b031690816001600160801b031681525050505050505050610f75565b6000878581518110610832576108326130b1565b60200260200101519050806001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160c06040518083038186803b15801561087557600080fd5b505afa158015610889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ad9190612b29565b8786815181106108bf576108bf6130b1565b60200260200101516101800181905250806001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561090857600080fd5b505afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190612995565b878681518110610952576109526130b1565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190612d64565b8786815181106109f9576109f96130b1565b60200260200101516020019060ff16908160ff1681525050868581518110610a2357610a236130b1565b6020908102919091010151516040516370a0823160e01b81526001600160a01b038b81166004830152909116906370a082319060240160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa99190612bc8565b878681518110610abb57610abb6130b1565b602002602001015160400181815250506000878681518110610adf57610adf6130b1565b6020026020010151606001818152505073057835ad21a177dbdd3090bb1cae03eacf78fc6d6001600160a01b03166335ea6a75888781518110610b2457610b246130b1565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016101406040518083038186803b158015610b7057600080fd5b505afa158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba89190612cdb565b50508e519497508e96508c955050509183109150610bca905057610bca6130b1565b602002602001015160800181815250506000600a6064898881518110610bf257610bf26130b1565b6020026020010151610180015160000151610c0d9190613046565b610c179190613046565b61ffff1690506000610d2f8a8881518110610c3457610c346130b1565b60200260200101518a8981518110610c4e57610c4e6130b1565b60200260200101516020015160ff16876001600160a01b031663b3596f078d8c81518110610c7e57610c7e6130b1565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610cc957600080fd5b505afa158015610cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d019190612bc8565b878d8c81518110610d1457610d146130b1565b602002602001015161018001516080015161ffff16876125cf565b8b8a81518110610d4157610d416130b1565b602002602001015160e0018c8b81518110610d5e57610d5e6130b1565b602002602001015161014001828152508281525082935050505073ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03166370a082318b8981518110610dad57610dad6130b1565b60200260200101516040518263ffffffff1660e01b8152600401610de091906001600160a01b0391909116815260200190565b60206040518083038186803b158015610df857600080fd5b505afa158015610e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e309190612bc8565b73ae7ab96520de3a18e5e111b5eaab095312d7fe846001600160a01b03166370a08231886001600160a01b031663dc9356986040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8c57600080fd5b505afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec49190612995565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190612bc8565b610f459083612f00565b610f4f9190612f00565b898881518110610f6157610f616130b1565b602002602001015160c00181815250505050505b6000836001600160a01b031663cc4a01586040518163ffffffff1660e01b8152600401604080518083038186803b158015610faf57600080fd5b505afa158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190612be1565b506040516370a0823160e01b81526001600160a01b038b81166004830152919250670de0b6b3a7640000918391908716906370a082319060240160206040518083038186803b15801561103957600080fd5b505afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190612bc8565b61107b9190613027565b6110859190612f18565b878681518110611097576110976130b1565b602090810291909101015161010001526040516335ea6a7560e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482015273057835ad21a177dbdd3090bb1cae03eacf78fc6d906335ea6a75906024016101406040518083038186803b15801561110657600080fd5b505afa15801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190612cdb565b50508e519397508e96508c9550505090831091506111609050576111606130b1565b602002602001015160a0018181525050670de0b6b3a764000081856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b357600080fd5b505afa1580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111eb9190612bc8565b6111f59190613027565b6111ff9190612f18565b878681518110611211576112116130b1565b6020026020010151610120018181525050836001600160a01b03166336e4ec646040518163ffffffff1660e01b815260040160206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190612bc8565b8786815181106112a5576112a56130b1565b60200260200101516101600181815250505050505080806112c590613080565b91505061015b565b505092915050565b6000806000806000806000806000806112ec61286a565b73a6978cba39f86491ae5dca53f4cdefcb100e3e3d6001600160a01b031663e0a73a936040518163ffffffff1660e01b815260040160206040518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113719190612bc8565b98508c6001600160a01b0316638bc7e8c46040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ac57600080fd5b505afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190612bc8565b8160000181815250508c6001600160a01b031663cc4a01586040518163ffffffff1660e01b8152600401604080518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d9190612be1565b509650866114738d670de0b6b3a7640000613027565b61147d9190612f18565b815190965061271090611490908e613027565b61149a9190612f18565b6114a4908d613069565b9b506114af8d611f5e565b8260200183604001828152508281525050508c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156114fa57600080fd5b505afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190612d64565b60ff1699506001600160a01b038d1673c383a3833a87009fd9597f8184979af5edfad01914156118895773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a50670de0b6b3a7640000975060008d6001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160806040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190612aac565b90508d6001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561162d57600080fd5b505afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190612c05565b5060c086015260a085018190526080808601929092526060850192909252015160e0830152805161ffff166101008301819052602083015110156116e85761010082015160808301516116ba90612710613027565b6116c49190612f18565b82606001516116d39190613069565b8260e0018181516116e49190612f00565b9052505b8160a00151608001518d111561173f578160800151826060015161170c9190613069565b60a08301516080015161171f908f613069565b836080015161172e9190613027565b6117389190612f18565b9550611744565b600095505b81608001518260c001516117589190613069565b8d83608001516117689190613027565b6117729190612f18565b94508c8260e001511115801561178f57508160a00151608001518d115b1561180a5780516117a290600a90613046565b6117ae90612710613046565b61ffff168d8360c001516117c29190613069565b82516117d090600a90613046565b61ffff166117de9190613027565b60808401516117ef90612710613027565b6117f99190613069565b6118039190612f18565b925061180f565b600092505b8c8260e001511161187e57602081015161182b90612710613046565b61ffff168d8360c0015161183f9190613069565b826020015161ffff166118529190613027565b608084015161186390612710613027565b61186d9190613069565b6118779190612f18565b9350611883565b600093505b50611f4e565b8c6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c257600080fd5b505afa1580156118d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fa9190612995565b9a5060008d6001600160a01b031663cf6d625e6040518163ffffffff1660e01b815260040160c06040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f9190612b29565b90508d6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119aa57600080fd5b505afa1580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190612995565b8261012001906001600160a01b031690816001600160a01b0316815250508d6001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190612c91565b6101a088015261018087018190526101608701829052610140870194909452611a9d9392509050612f00565b826101c0018181525050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612995565b61012084015160405163b3596f0760e01b81526001600160a01b03918216600482015291925082169063b3596f079060240160206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612bc8565b6101e084015260405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0382169063b3596f079060240160206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190612bc8565b61020084018190526101e0840151611c6190670de0b6b3a7640000613027565b611c6b9190612f18565b9950611c788c600a612f7d565b8a846101400151611c899190613027565b611c939190612f18565b610220840152611ca48c600a612f7d565b8a846101a00151611cb59190613027565b611cbf9190612f18565b610240840152611cd08c600a612f7d565b8a8f611cdc9190613027565b611ce69190612f18565b610260840152611cf78c600a612f7d565b8a846101c00151611d089190613027565b611d129190612f18565b61028084018190526102608401511115611d71576080820151611d3790612710613046565b61ffff16836102800151846102600151611d519190613069565b8460200151611d609190613027565b611d6a9190612f18565b9650611d76565b600096505b6080820151611d8790612710613046565b61ffff168361026001518460400151611da09190613027565b611daa9190612f18565b9550826101800151836101600151611dc29190612f00565b60e08401528151611dd590606490613046565b61ffff16610100840181905260208401511015611e30576101008301516101408401516020850151611e079083613069565b611e119190613027565b611e1b9190612f18565b8360e001818151611e2c9190612f00565b9052505b8d8360e0015111158015611e485750826101c001518e115b15611ec8576080820151611e5e90612710613046565b61ffff16836102800151846102600151611e789190613069565b846102200151611e889190613069565b8351611e98919061ffff16613027565b8461022001518560200151611ead9190613027565b611eb79190613069565b611ec19190612f18565b9350611ecd565b600093505b8d8360e0015111611f46576080820151611ee990612710613046565b61ffff16836102600151846102400151611f039190613069565b836040015161ffff16611f169190613027565b8461024001518560400151611f2b9190613027565b611f359190613069565b611f3f9190612f18565b9450611f4b565b600094505b50505b509295989b9194979a5092959850565b600080611fea60405180610200016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b03841673c383a3833a87009fd9597f8184979af5edfad01914156120d257836001600160a01b0316630782d4216040518163ffffffff1660e01b81526004016101206040518083038186803b15801561204957600080fd5b505afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120819190612c05565b506040850152506020830181905281835261209e90612710613027565b6120a89190612f18565b9250806040015181602001516127106120c19190613027565b6120cb9190612f18565b91506125c9565b6000849050806001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211057600080fd5b505afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121489190612995565b82606001906001600160a01b031690816001600160a01b031681525050846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561219e57600080fd5b505afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190612d64565b60ff16826080018181525050806001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b15801561221b57600080fd5b505afa15801561222f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122539190612c91565b610100880152505060e085015260c08085019190915260a0840191909152604080516367b6b12f60e11b815290516000926001600160a01b0385169263cf6d625e9260048083019392829003018186803b1580156122b057600080fd5b505afa1580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e89190612b29565b9050612710816080015161ffff168460c001516123059190613027565b61230f9190612f18565b610120840181905260e08401511161232857600061233d565b8261012001518360e0015161233d9190613069565b83610140018181525050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612995565b606085015160405163b3596f0760e01b81526001600160a01b03918216600482015291925082169063b3596f079060240160206040518083038186803b15801561241757600080fd5b505afa15801561242b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244f9190612bc8565b61016085015260405163b3596f0760e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0382169063b3596f079060240160206040518083038186803b1580156124a857600080fd5b505afa1580156124bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e09190612bc8565b6101808501819052610140850151670de0b6b3a76400009161250191613027565b61250b9190612f18565b6101a0850152608084015161252190600a612f7d565b8461016001518560a001516125369190613027565b6125409190612f18565b6101c0850152608084015161255690600a612f7d565b84610160015185610100015161256c9190613027565b6125769190612f18565b6101e08501526101c08401516101a085015161259490612710613027565b61259e9190612f18565b9550836101e00151846101a001516127106125b99190613027565b6125c39190612f18565b94505050505b50915091565b60008060008089905061260a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816001600160a01b031663223706856040518163ffffffff1660e01b815260040160c06040518083038186803b15801561264357600080fd5b505afa158015612657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267b9190612c91565b6060870152604086015260208501526080840192909252955093506000886126ab8b670de0b6b3a7640000613027565b6126b59190612f18565b905060006126c48c600a612f7d565b8284608001516126d49190613027565b6126de9190612f18565b905060006127106126ef8b8a613027565b6126f99190612f18565b9050600087821061270b576000612715565b6127158289613069565b90506000831561273b578361272c83612710613027565b6127369190612f18565b61273e565b60005b9050856040015186602001516127549190612f00565b97508a8110156127905760808601518b9061276f8383613069565b6127799190613027565b6127839190612f18565b61278d9089612f00565b97505b5050505050505096509650969350505050565b604051806101a0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016128656040518060c00160405280600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160006001600160801b031681525090565b905290565b604051806102a0016040528060008152602001600081526020016000815260200160008152602001600081526020016128cb6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516001600160801b038116811461295a57600080fd5b919050565b805161ffff8116811461295a57600080fd5b60006020828403121561298357600080fd5b813561298e816130dd565b9392505050565b6000602082840312156129a757600080fd5b815161298e816130dd565b600080604083850312156129c557600080fd5b82356129d0816130dd565b915060208381013567ffffffffffffffff808211156129ee57600080fd5b818601915086601f830112612a0257600080fd5b813581811115612a1457612a146130c7565b8060051b9150612a25848301612ecf565b8181528481019084860184860187018b1015612a4057600080fd5b600095505b83861015612a6f5780359450612a5a856130dd565b84835260019590950194918601918601612a45565b508096505050505050509250929050565b60008060408385031215612a9357600080fd5b8235612a9e816130dd565b946020939093013593505050565b600060808284031215612abe57600080fd5b6040516080810181811067ffffffffffffffff82111715612ae157612ae16130c7565b604052612aed8361295f565b8152612afb6020840161295f565b6020820152612b0c6040840161295f565b6040820152612b1d60608401612943565b60608201529392505050565b600060c08284031215612b3b57600080fd5b60405160c0810181811067ffffffffffffffff82111715612b5e57612b5e6130c7565b604052612b6a8361295f565b8152612b786020840161295f565b6020820152612b896040840161295f565b6040820152612b9a6060840161295f565b6060820152612bab6080840161295f565b6080820152612bbc60a08401612943565b60a08201529392505050565b600060208284031215612bda57600080fd5b5051919050565b60008060408385031215612bf457600080fd5b505080516020909101519092909150565b6000806000806000858703610120811215612c1f57600080fd5b865195506020870151945060a0603f1982011215612c3c57600080fd5b50612c45612ea6565b60408701518152606087015160208201526080870151604082015260a0870151606082015260c087015160808201528093505060e0860151915061010086015190509295509295909350565b60008060008060008060c08789031215612caa57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b6000806000806000806000806000806101408b8d031215612cfb57600080fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506101208b015164ffffffffff81168114612d5157600080fd5b809150509295989b9194979a5092959850565b600060208284031215612d7657600080fd5b815160ff8116811461298e57600080fd5b602080825282518282018190526000919060409081850190868401855b82811015612e9957815180516001600160a01b031685528681015160ff16878601528581015186860152606080820151818701526080808301518188015260a0808401518189015260c0808501519089015260e08085015190890152610100808501519089015261012080850151908901526101408085015190890152610160808501519089015261018093840151805161ffff908116958a0195909552602081015185166101a08a0152604081015185166101c08a01529283015184166101e08901529082015190921661020087015201516001600160801b03166102208501526102409093019290850190600101612da4565b5091979650505050505050565b60405160a0810167ffffffffffffffff81118282101715612ec957612ec96130c7565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ef857612ef86130c7565b604052919050565b60008219821115612f1357612f1361309b565b500190565b600082612f3557634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612f75578160001904821115612f5b57612f5b61309b565b80851615612f6857918102915b93841c9390800290612f3f565b509250929050565b600061298e8383600082612f9357506001613021565b81612fa057506000613021565b8160018114612fb65760028114612fc057612fdc565b6001915050613021565b60ff841115612fd157612fd161309b565b50506001821b613021565b5060208310610133831016604e8410600b8410161715612fff575081810a613021565b6130098383612f3a565b806000190482111561301d5761301d61309b565b0290505b92915050565b60008160001904831182151516156130415761304161309b565b500290565b600061ffff838116908316818110156130615761306161309b565b039392505050565b60008282101561307b5761307b61309b565b500390565b60006000198214156130945761309461309b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146130f257600080fd5b5056fea2646970667358221220fc933c5c82748dd57fab68bd06e885a6ac92ee47ea61bfed35f0e867ae67726564736f6c63430008060033

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.