ETH Price: $3,462.78 (+5.23%)

Token

eUSD (eUSD)
 

Overview

Max Total Supply

462,025.419253303638195252 eUSD

Holders

1,473 (0.00%)

Market

Price

$0.98 @ 0.000282 ETH (+0.11%)

Onchain Market Cap

$451,667.73

Circulating Supply Market Cap

$5,838,074.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 eUSD

Value
$0.00 ( ~0 Eth) [0.0000%]
0xaa64ecdd0ba9d6d31ce13751e4f6a5cfd52a722c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Lybra Finance Protocol is a cutting-edge decentralized platform designed to bring stability to the volatile world of cryptocurrency.

Market

Volume (24H):$964.90
Market Capitalization:$5,838,074.00
Circulating Supply:5,971,956.00 eUSD
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Lybra

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : Lybra.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.8.17;

import "./EUSD.sol";
import "./Governable.sol";

interface Ilido {
    function submit(address _referral) external payable returns (uint256 StETH);

    function withdraw(address _to) external returns (uint256 ETH);

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

    function transfer(address _recipient, uint256 _amount)
        external
        returns (bool);

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external returns (bool);
}

interface LbrStakingPool {
    function notifyRewardAmount(uint256 amount) external;
}

interface esLBRMinter {
    function refreshReward(address user) external;
}

interface IPriceFeed {
    function fetchPrice() external returns (uint256);
}

contract Lybra is EUSD, Governable {
    uint256 public totalDepositedEther;
    uint256 public lastReportTime;
    uint256 public totalEUSDCirculation;
    uint256 year = 86400 * 365;

    uint256 public mintFeeApy = 150;
    uint256 public safeCollateralRate = 160 * 1e18;
    uint256 public immutable badCollateralRate = 150 * 1e18;
    uint256 public redemptionFee = 50;
    uint8 public keeperRate = 1;

    mapping(address => uint256) public depositedEther;
    mapping(address => uint256) borrowed;
    mapping(address => bool) redemptionProvider;
    uint256 public feeStored;

    Ilido lido = Ilido(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84);
    esLBRMinter public eslbrMinter;
    LbrStakingPool public serviceFeePool;

    event BorrowApyChanged(uint256 newApy);
    event SafeCollateralRateChanged(uint256 newRatio);
    event KeeperRateChanged(uint256 newSlippage);
    event RedemptionFeeChanged(uint256 newSlippage);
    event DepositEther(
        address sponsor,
        address indexed onBehalfOf,
        uint256 amount,
        uint256 timestamp
    );
    event WithdrawEther(
        address sponsor,
        address indexed onBehalfOf,
        uint256 amount,
        uint256 timestamp
    );
    event Mint(
        address sponsor,
        address indexed onBehalfOf,
        uint256 amount,
        uint256 timestamp
    );
    event Burn(
        address sponsor,
        address indexed onBehalfOf,
        uint256 amount,
        uint256 timestamp
    );
    event LiquidationRecord(
        address provider,
        address keeper,
        address indexed onBehalfOf,
        uint256 eusdamount,
        uint256 LiquidateEtherAmount,
        uint256 keeperReward,
        bool superLiquidation,
        uint256 timestamp
    );
    event LSDistribution(
        uint256 stETHAdded,
        uint256 payoutEUSD,
        uint256 timestamp
    );
    event RedemptionProvider(address user, bool status);
    event RigidRedemption(
        address indexed caller,
        address indexed provider,
        uint256 eusdAmount,
        uint256 etherAmount,
        uint256 timestamp
    );
    event FeeDistribution(
        address indexed feeAddress,
        uint256 feeAmount,
        uint256 timestamp
    );
    event ServiceFeePoolChanged(address pool, uint256 timestamp);
    event ESLBRMinterChanged(address pool, uint256 timestamp);

    constructor() {
        gov = msg.sender;
    }

    function setBorrowApy(uint256 newApy) external onlyGov {
        require(newApy <= 150, "Borrow APY cannot exceed 1.5%");
        _saveReport();
        mintFeeApy = newApy;
        emit BorrowApyChanged(newApy);
    }

    /**
     * @notice  safeCollateralRate can be decided by DAO,starts at 160%
     */
    function setSafeCollateralRate(uint256 newRatio) external onlyGov {
        require(
            newRatio >= 160 * 1e18,
            "Safe CollateralRate should more than 160%"
        );
        safeCollateralRate = newRatio;
        emit SafeCollateralRateChanged(newRatio);
    }

    /**
     * @notice KeeperRate can be decided by DAO,1 means 1% of revenue
     */
    function setKeeperRate(uint8 newRate) external onlyGov {
        require(newRate <= 5, "Max Keeper reward is 5%");
        keeperRate = newRate;
        emit KeeperRateChanged(newRate);
    }

    /**
     * @notice DAO sets RedemptionFee, 100 means 1%
     */
    function setRedemptionFee(uint8 newFee) external onlyGov {
        require(newFee <= 500, "Max Redemption Fee is 5%");
        redemptionFee = newFee;
        emit RedemptionFeeChanged(newFee);
    }

    function setLbrStakingPool(address addr) external onlyGov {
        serviceFeePool = LbrStakingPool(addr);
        emit ServiceFeePoolChanged(addr, block.timestamp);
    }

    function setESLBRMinter(address addr) external onlyGov {
        eslbrMinter = esLBRMinter(addr);
        emit ESLBRMinterChanged(addr, block.timestamp);
    }

    /**
     * @notice User chooses to become a Redemption Provider
     */
    function becomeRedemptionProvider(bool _bool) external {
        eslbrMinter.refreshReward(msg.sender);
        redemptionProvider[msg.sender] = _bool;
        emit RedemptionProvider(msg.sender, _bool);
    }

    /**
     * @notice Deposit ETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly
     *
     * Emits a `DepositEther` event.
     *
     * Requirements:
     * - `onBehalfOf` cannot be the zero address.
     * - `mintAmount` Send 0 if doesn't mint EUSD
     * - msg.value Must be higher than 0.
     *
     * @dev Record the deposited ETH in the ratio of 1:1 and convert it into stETH.
     */
    function depositEtherToMint(address onBehalfOf, uint256 mintAmount)
        external
        payable
    {
        require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS");
        require(msg.value >= 1 ether, "Deposit should not be less than 1 ETH.");

        //convert to steth
        uint256 sharesAmount = lido.submit{value: msg.value}(gov);
        require(sharesAmount > 0, "ZERO_DEPOSIT");

        totalDepositedEther += msg.value;
        depositedEther[onBehalfOf] += msg.value;

        if (mintAmount > 0) {
            _mintEUSD(onBehalfOf, onBehalfOf, mintAmount);
        }

        emit DepositEther(msg.sender, onBehalfOf, msg.value, block.timestamp);
    }

    /**
     * @notice Deposit stETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly
     * Emits a `DepositEther` event.
     *
     * Requirements:
     * - `onBehalfOf` cannot be the zero address.
     * - `stETHamount` Must be higher than 0.
     * - `mintAmount` Send 0 if doesn't mint EUSD
     * @dev Record the deposited stETH in the ratio of 1:1.
     */
    function depositStETHToMint(
        address onBehalfOf,
        uint256 stETHamount,
        uint256 mintAmount
    ) external {
        require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS");
        require(stETHamount >= 1 ether, "Deposit should not be less than 1 stETH.");
        lido.transferFrom(msg.sender, address(this), stETHamount);

        totalDepositedEther += stETHamount;
        depositedEther[onBehalfOf] += stETHamount;
        if (mintAmount > 0) {
            _mintEUSD(onBehalfOf, onBehalfOf, mintAmount);
        }
        emit DepositEther(msg.sender, onBehalfOf, stETHamount, block.timestamp);
    }

    /**
     * @notice Withdraw collateral assets to an address
     * Emits a `WithdrawEther` event.
     *
     * Requirements:
     * - `onBehalfOf` cannot be the zero address.
     * - `amount` Must be higher than 0.
     *
     * @dev Withdraw stETH. Check user’s collateral rate after withdrawal, should be higher than `safeCollateralRate`
     */
    function withdraw(address onBehalfOf, uint256 amount) external {
        require(onBehalfOf != address(0), "WITHDRAW_TO_THE_ZERO_ADDRESS");
        require(amount > 0, "ZERO_WITHDRAW");
        require(depositedEther[msg.sender] >= amount, "Insufficient Balance");
        totalDepositedEther -= amount;
        depositedEther[msg.sender] -= amount;

        lido.transfer(onBehalfOf, amount);
        if (borrowed[msg.sender] > 0) {
            _checkHealth(msg.sender);
        }
        emit WithdrawEther(msg.sender, onBehalfOf, amount, block.timestamp);
    }

    /**
     * @notice The mint amount number of EUSD is minted to the address
     * Emits a `Mint` event.
     *
     * Requirements:
     * - `onBehalfOf` cannot be the zero address.
     * - `amount` Must be higher than 0. Individual mint amount shouldn't surpass 10% when the circulation reaches 10_000_000
     */
    function mint(address onBehalfOf, uint256 amount) public {
        require(onBehalfOf != address(0), "MINT_TO_THE_ZERO_ADDRESS");
        require(amount > 0, "ZERO_MINT");
        _mintEUSD(msg.sender, onBehalfOf, amount);
        if (
            (borrowed[msg.sender] * 100) / totalSupply() > 10 &&
            totalSupply() > 10_000_000 * 1e18
        ) revert("Mint Amount cannot be more than 10% of total circulation");
    }

    /**
     * @notice Burn the amount of EUSD and payback the amount of minted EUSD
     * Emits a `Burn` event.
     * Requirements:
     * - `onBehalfOf` cannot be the zero address.
     * - `amount` Must be higher than 0.
     * @dev Calling the internal`_repay`function.
     */
    function burn(address onBehalfOf, uint256 amount) external {
        require(onBehalfOf != address(0), "BURN_TO_THE_ZERO_ADDRESS");
        _repay(msg.sender, onBehalfOf, amount);
    }

    /**
     * @notice When overallCollateralRate is above 150%, Keeper liquidates borrowers whose collateral rate is below badCollateralRate, using EUSD provided by Liquidation Provider.
     *
     * Requirements:
     * - onBehalfOf Collateral Rate should be below badCollateralRate
     * - etherAmount should be less than 50% of collateral
     * - provider should authorize Lybra to utilize EUSD
     * @dev After liquidation, borrower's debt is reduced by etherAmount * etherPrice, collateral is reduced by the etherAmount corresponding to 110% of the value. Keeper gets keeperRate / 110 of Liquidation Reward and Liquidator gets the remaining stETH.
     */
    function liquidation(
        address provider,
        address onBehalfOf,
        uint256 etherAmount
    ) external {
        uint256 etherPrice = _etherPrice();
        uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] *
            etherPrice *
            100) / borrowed[onBehalfOf];
        require(
            onBehalfOfCollateralRate < badCollateralRate,
            "Borrowers collateral rate should below badCollateralRate"
        );

        require(
            etherAmount * 2 <= depositedEther[onBehalfOf],
            "a max of 50% collateral can be liquidated"
        );
        uint256 eusdAmount = (etherAmount * etherPrice) / 1e18;
        require(
            allowance(provider, address(this)) >= eusdAmount,
            "provider should authorize to provide liquidation EUSD"
        );

        _repay(provider, onBehalfOf, eusdAmount);
        uint256 reducedEther = (etherAmount * 11) / 10;
        totalDepositedEther -= reducedEther;
        depositedEther[onBehalfOf] -= reducedEther;
        uint256 reward2keeper;
        if (provider == msg.sender) {
            lido.transfer(msg.sender, reducedEther);
        } else {
            reward2keeper = (reducedEther * keeperRate) / 110;
            lido.transfer(provider, reducedEther - reward2keeper);
            lido.transfer(msg.sender, reward2keeper);
        }
        emit LiquidationRecord(
            provider,
            msg.sender,
            onBehalfOf,
            eusdAmount,
            reducedEther,
            reward2keeper,
            false,
            block.timestamp
        );
    }

    /**
     * @notice When overallCollateralRate is below badCollateralRate, borrowers with collateralRate below 125% could be fully liquidated.
     * Emits a `LiquidationRecord` event.
     *
     * Requirements:
     * - Current overallCollateralRate should be below badCollateralRate
     * - `onBehalfOf`collateralRate should be below 125%
     * @dev After Liquidation, borrower's debt is reduced by etherAmount * etherPrice, deposit is reduced by etherAmount * borrower's collateralRate. Keeper gets a liquidation reward of `keeperRate / borrower's collateralRate
     */
    function superLiquidation(
        address provider,
        address onBehalfOf,
        uint256 etherAmount
    ) external {
        uint256 etherPrice = _etherPrice();
        require(
            (totalDepositedEther * etherPrice * 100) / totalSupply() <
                badCollateralRate,
            "overallCollateralRate should below 150%"
        );
        uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] *
            etherPrice *
            100) / borrowed[onBehalfOf];
        require(
            onBehalfOfCollateralRate < 125 * 1e18,
            "borrowers collateralRate should below 125%"
        );
        require(
            etherAmount <= depositedEther[onBehalfOf],
            "total of collateral can be liquidated at most"
        );
        uint256 eusdAmount = (etherAmount * etherPrice) / 1e18;
        if (onBehalfOfCollateralRate >= 1e20) {
            eusdAmount = (eusdAmount * 1e20) / onBehalfOfCollateralRate;
        }
        require(
            allowance(provider, address(this)) >= eusdAmount,
            "provider should authorize to provide liquidation EUSD"
        );

        _repay(provider, onBehalfOf, eusdAmount);

        totalDepositedEther -= etherAmount;
        depositedEther[onBehalfOf] -= etherAmount;
        uint256 reward2keeper;
        if (
            msg.sender != provider &&
            onBehalfOfCollateralRate >= 1e20 + keeperRate * 1e18
        ) {
            reward2keeper =
                ((etherAmount * keeperRate) * 1e18) /
                onBehalfOfCollateralRate;
            lido.transfer(msg.sender, reward2keeper);
        }
        lido.transfer(provider, etherAmount - reward2keeper);

        emit LiquidationRecord(
            provider,
            msg.sender,
            onBehalfOf,
            eusdAmount,
            etherAmount,
            reward2keeper,
            true,
            block.timestamp
        );
    }

    /**
     * @notice When stETH balance increases through LSD or other reasons, the excess income is sold for EUSD, allocated to EUSD holders through rebase mechanism.
     * Emits a `LSDistribution` event.
     *
     * *Requirements:
     * - stETH balance in the contract cannot be less than totalDepositedEther after exchange.
     * @dev Income is used to cover accumulated Service Fee first.
     */
    function excessIncomeDistribution(uint256 payAmount) external {
        uint256 payoutEther = (payAmount * 1e18) / _etherPrice();
        require(
            payoutEther <=
                lido.balanceOf(address(this)) - totalDepositedEther &&
                payoutEther > 0,
            "Only LSD excess income can be exchanged"
        );

        uint256 income = feeStored + _newFee();

        if (payAmount > income) {
            _transfer(msg.sender, address(serviceFeePool), income);
            serviceFeePool.notifyRewardAmount(income);

            uint256 sharesAmount = getSharesByMintedEUSD(payAmount - income);
            if (sharesAmount == 0) {
                //EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1
                sharesAmount = payAmount - income;
            }
            //Income is distributed to LBR staker.
            _burnShares(msg.sender, sharesAmount);
            feeStored = 0;
            emit FeeDistribution(
                address(serviceFeePool),
                income,
                block.timestamp
            );
        } else {
            _transfer(msg.sender, address(serviceFeePool), payAmount);
            serviceFeePool.notifyRewardAmount(payAmount);
            feeStored = income - payAmount;
            emit FeeDistribution(
                address(serviceFeePool),
                payAmount,
                block.timestamp
            );
        }

        lastReportTime = block.timestamp;
        lido.transfer(msg.sender, payoutEther);

        emit LSDistribution(payoutEther, payAmount, block.timestamp);
    }

    /**
     * @notice Choose a Redemption Provider, Rigid Redeem `eusdAmount` of EUSD and get 1:1 value of stETH
     * Emits a `RigidRedemption` event.
     *
     * *Requirements:
     * - `provider` must be a Redemption Provider
     * - `provider`debt must equal to or above`eusdAmount`
     * @dev Service Fee for rigidRedemption `redemptionFee` is set to 0.5% by default, can be revised by DAO.
     */
    function rigidRedemption(address provider, uint256 eusdAmount) external {
        require(
            redemptionProvider[provider],
            "provider is not a RedemptionProvider"
        );
        require(
            borrowed[provider] >= eusdAmount,
            "eusdAmount cannot surpass providers debt"
        );
        uint256 etherPrice = _etherPrice();
        uint256 providerCollateralRate = (depositedEther[provider] *
            etherPrice *
            100) / borrowed[provider];
        require(
            providerCollateralRate >= 100 * 1e18,
            "provider's collateral rate should more than 100%"
        );
        _repay(msg.sender, provider, eusdAmount);
        uint256 etherAmount = (((eusdAmount * 1e18) / etherPrice) *
            (10000 - redemptionFee)) / 10000;
        depositedEther[provider] -= etherAmount;
        totalDepositedEther -= etherAmount;
        lido.transfer(msg.sender, etherAmount);
        emit RigidRedemption(
            msg.sender,
            provider,
            eusdAmount,
            etherAmount,
            block.timestamp
        );
    }

    /**
     * @dev Refresh LBR reward before adding providers debt. Refresh Lybra generated service fee before adding totalEUSDCirculation. Check providers collateralRate cannot below `safeCollateralRate`after minting.
     */
    function _mintEUSD(
        address _provider,
        address _onBehalfOf,
        uint256 _amount
    ) internal {
        uint256 sharesAmount = getSharesByMintedEUSD(_amount);
        if (sharesAmount == 0) {
            //EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1
            sharesAmount = _amount;
        }
        eslbrMinter.refreshReward(_provider);
        borrowed[_provider] += _amount;

        _mintShares(_onBehalfOf, sharesAmount);

        _saveReport();
        totalEUSDCirculation += _amount;
        _checkHealth(_provider);
        emit Mint(msg.sender, _onBehalfOf, _amount, block.timestamp);
    }

    /**
     * @notice Burn _provideramount EUSD to payback minted EUSD for _onBehalfOf.
     *
     * @dev Refresh LBR reward before reducing providers debt. Refresh Lybra generated service fee before reducing totalEUSDCirculation.
     */
    function _repay(
        address _provider,
        address _onBehalfOf,
        uint256 _amount
    ) internal {
        require(
            borrowed[_onBehalfOf] >= _amount,
            "Repaying Amount Surpasses Borrowing Amount"
        );

        uint256 sharesAmount = getSharesByMintedEUSD(_amount);
        _burnShares(_provider, sharesAmount);

        eslbrMinter.refreshReward(_onBehalfOf);

        borrowed[_onBehalfOf] -= _amount;
        _saveReport();
        totalEUSDCirculation -= _amount;

        emit Burn(_provider, _onBehalfOf, _amount, block.timestamp);
    }

    function _saveReport() internal {
        feeStored += _newFee();
        lastReportTime = block.timestamp;
    }

    /**
     * @dev Get USD value of current collateral asset and minted EUSD through price oracle / Collateral asset USD value must higher than safe Collateral Rate.
     */
    function _checkHealth(address user) internal {
        if (
            ((depositedEther[user] * _etherPrice() * 100) / borrowed[user]) <
            safeCollateralRate
        ) revert("collateralRate is Below safeCollateralRate");
    }

    /**
     * @dev Return USD value of current ETH through Liquity PriceFeed Contract.
     * https://etherscan.io/address/0x4c517D4e2C851CA76d7eC94B805269Df0f2201De#code
     */
    function _etherPrice() internal returns (uint256) {
        return
            IPriceFeed(0x4c517D4e2C851CA76d7eC94B805269Df0f2201De).fetchPrice();
    }

    function _newFee() internal view returns (uint256) {
        return
            (totalEUSDCirculation *
                mintFeeApy *
                (block.timestamp - lastReportTime)) /
            year /
            10000;
    }

    /**
     * @dev total circulation of EUSD
     */
    function _getTotalMintedEUSD() internal view override returns (uint256) {
        return totalEUSDCirculation;
    }

    function getBorrowedOf(address user) external view returns (uint256) {
        return borrowed[user];
    }

    function isRedemptionProvider(address user) external view returns (bool) {
        return redemptionProvider[user];
    }
}

File 2 of 5 : Governable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.17;
contract Governable {
    address public gov;

    event GovernanceAuthorityTransfer(address newGov);

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
        emit GovernanceAuthorityTransfer(_gov);
    }
}

File 3 of 5 : EUSD.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.8.17;

import "./SafeMath.sol";
import "./IERC20.sol";
/**
 * @title Interest-bearing ERC20-like token for Lybra protocol.
 *
 * This contract is abstract. To make the contract deployable override the
 * `_getTotalMintedEUSD` function. `Lybra.sol` contract inherits EUSD and defines
 * the `_getTotalMintedEUSD` function.
 *
 * EUSD balances are dynamic and represent the holder's share in the total amount
 * of Ether controlled by the protocol. Account shares aren't normalized, so the
 * contract also stores the sum of all shares to calculate each account's token balance
 * which equals to:
 *
 *   shares[account] * _getTotalMintedEUSD() / _getTotalShares()
 *
 * For example, assume that we have:
 *
 *   _getTotalMintedEUSD() -> 1000 EUSD
 *   sharesOf(user1) -> 100
 *   sharesOf(user2) -> 400
 *
 * Therefore:
 *
 *   balanceOf(user1) -> 2 tokens which corresponds 200 EUSD
 *   balanceOf(user2) -> 8 tokens which corresponds 800 EUSD
 *
 * Since balances of all token holders change when the amount of total supplied EUSD
 * changes, this token cannot fully implement ERC20 standard: it only emits `Transfer`
 * events upon explicit transfer between holders. In contrast, when total amount of
 * pooled Ether increases, no `Transfer` events are generated: doing so would require
 * emitting an event for each token holder and thus running an unbounded loop.
 */
abstract contract EUSD is IERC20 {
    using SafeMath for uint256;
    uint256 private totalShares;

    /**
     * @dev EUSD balances are dynamic and are calculated based on the accounts' shares
     * and the total supply by the protocol. Account shares aren't
     * normalized, so the contract also stores the sum of all shares to calculate
     * each account's token balance which equals to:
     *
     *   shares[account] * _getTotalMintedEUSD() / _getTotalShares()
     */
    mapping(address => uint256) private shares;

    /**
     * @dev Allowances are nominated in tokens, not token shares.
     */
    mapping(address => mapping(address => uint256)) private allowances;

    /**
     * @notice An executed shares transfer from `sender` to `recipient`.
     *
     * @dev emitted in pair with an ERC20-defined `Transfer` event.
     */
    event TransferShares(
        address indexed from,
        address indexed to,
        uint256 sharesValue
    );

    /**
     * @notice An executed `burnShares` request
     *
     * @dev Reports simultaneously burnt shares amount
     * and corresponding EUSD amount.
     * The EUSD amount is calculated twice: before and after the burning incurred rebase.
     *
     * @param account holder of the burnt shares
     * @param preRebaseTokenAmount amount of EUSD the burnt shares corresponded to before the burn
     * @param postRebaseTokenAmount amount of EUSD the burnt shares corresponded to after the burn
     * @param sharesAmount amount of burnt shares
     */
    event SharesBurnt(
        address indexed account,
        uint256 preRebaseTokenAmount,
        uint256 postRebaseTokenAmount,
        uint256 sharesAmount
    );

    /**
     * @return the name of the token.
     */
    function name() public pure returns (string memory) {
        return "eUSD";
    }

    /**
     * @return the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public pure returns (string memory) {
        return "eUSD";
    }

    /**
     * @return the number of decimals for getting user representation of a token amount.
     */
    function decimals() public pure returns (uint8) {
        return 18;
    }

    /**
     * @return the amount of EUSD in existence.
     *
     * @dev Always equals to `_getTotalMintedEUSD()` since token amount
     * is pegged to the total amount of EUSD controlled by the protocol.
     */
    function totalSupply() public view returns (uint256) {
        return _getTotalMintedEUSD();
    }

    /**
     * @return the amount of tokens owned by the `_account`.
     *
     * @dev Balances are dynamic and equal the `_account`'s share in the amount of the
     * total Ether controlled by the protocol. See `sharesOf`.
     */
    function balanceOf(address _account) public view returns (uint256) {
        return getMintedEUSDByShares(_sharesOf(_account));
    }

    /**
     * @notice Moves `_amount` tokens from the caller's account to the `_recipient` account.
     *
     * @return a boolean value indicating whether the operation succeeded.
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the caller must have a balance of at least `_amount`.
     * - the contract must not be paused.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function transfer(
        address _recipient,
        uint256 _amount
    ) public returns (bool) {
        _transfer(msg.sender, _recipient, _amount);
        return true;
    }

    /**
     * @return the remaining number of tokens that `_spender` is allowed to spend
     * on behalf of `_owner` through `transferFrom`. This is zero by default.
     *
     * @dev This value changes when `approve` or `transferFrom` is called.
     */
    function allowance(
        address _owner,
        address _spender
    ) public view returns (uint256) {
        return allowances[_owner][_spender];
    }

    /**
     * @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens.
     *
     * @return a boolean value indicating whether the operation succeeded.
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `_spender` cannot be the zero address.
     * - the contract must not be paused.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function approve(address _spender, uint256 _amount) public returns (bool) {
        _approve(msg.sender, _spender, _amount);
        return true;
    }

    /**
     * @notice Moves `_amount` tokens from `_sender` to `_recipient` using the
     * allowance mechanism. `_amount` is then deducted from the caller's
     * allowance.
     *
     * @return a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_sender` and `_recipient` cannot be the zero addresses.
     * - `_sender` must have a balance of at least `_amount`.
     * - the caller must have allowance for `_sender`'s tokens of at least `_amount`.
     * - the contract must not be paused.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) public returns (bool) {
        uint256 currentAllowance = allowances[_sender][msg.sender];
        require(
            currentAllowance >= _amount,
            "TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE"
        );

        _transfer(_sender, _recipient, _amount);
        _approve(_sender, msg.sender, currentAllowance.sub(_amount));
        return true;
    }

    /**
     * @notice Atomically increases the allowance granted to `_spender` by the caller by `_addedValue`.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_spender` cannot be the the zero address.
     * - the contract must not be paused.
     */
    function increaseAllowance(
        address _spender,
        uint256 _addedValue
    ) public returns (bool) {
        _approve(
            msg.sender,
            _spender,
            allowances[msg.sender][_spender].add(_addedValue)
        );
        return true;
    }

    /**
     * @notice Atomically decreases the allowance granted to `_spender` by the caller by `_subtractedValue`.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_spender` cannot be the zero address.
     * - `_spender` must have allowance for the caller of at least `_subtractedValue`.
     * - the contract must not be paused.
     */
    function decreaseAllowance(
        address _spender,
        uint256 _subtractedValue
    ) public returns (bool) {
        uint256 currentAllowance = allowances[msg.sender][_spender];
        require(
            currentAllowance >= _subtractedValue,
            "DECREASED_ALLOWANCE_BELOW_ZERO"
        );
        _approve(msg.sender, _spender, currentAllowance.sub(_subtractedValue));
        return true;
    }

    /**
     * @return the total amount of shares in existence.
     *
     * @dev The sum of all accounts' shares can be an arbitrary number, therefore
     * it is necessary to store it in order to calculate each account's relative share.
     */
    function getTotalShares() public view returns (uint256) {
        return _getTotalShares();
    }

    /**
     * @return the amount of shares owned by `_account`.
     */
    function sharesOf(address _account) public view returns (uint256) {
        return _sharesOf(_account);
    }

    /**
     * @return the amount of shares that corresponds to `_EUSDAmount` protocol-supplied EUSD.
     */
    function getSharesByMintedEUSD(
        uint256 _EUSDAmount
    ) public view returns (uint256) {
        uint256 totalMintedEUSD = _getTotalMintedEUSD();
        if (totalMintedEUSD == 0) {
            return 0;
        } else {
            return _EUSDAmount.mul(_getTotalShares()).div(totalMintedEUSD);
        }
    }

    /**
     * @return the amount of EUSD that corresponds to `_sharesAmount` token shares.
     */
    function getMintedEUSDByShares(
        uint256 _sharesAmount
    ) public view returns (uint256) {
        uint256 totalSharesAmount = _getTotalShares();
        if (totalShares == 0) {
            return 0;
        } else {
            return
                _sharesAmount.mul(_getTotalMintedEUSD()).div(totalSharesAmount);
        }
    }

    /**
     * @notice Moves `_sharesAmount` token shares from the caller's account to the `_recipient` account.
     *
     * @return amount of transferred tokens.
     * Emits a `TransferShares` event.
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the caller must have at least `_sharesAmount` shares.
     * - the contract must not be paused.
     *
     * @dev The `_sharesAmount` argument is the amount of shares, not tokens.
     */
    function transferShares(
        address _recipient,
        uint256 _sharesAmount
    ) public returns (uint256) {
        _transferShares(msg.sender, _recipient, _sharesAmount);
        emit TransferShares(msg.sender, _recipient, _sharesAmount);
        uint256 tokensAmount = getMintedEUSDByShares(_sharesAmount);
        emit Transfer(msg.sender, _recipient, tokensAmount);
        return tokensAmount;
    }

    /**
     * @return the total amount of EUSD.
     * @dev This is used for calculating tokens from shares and vice versa.
     * @dev This function is required to be implemented in a derived contract.
     */
    function _getTotalMintedEUSD() internal view virtual returns (uint256);

    /**
     * @notice Moves `_amount` tokens from `_sender` to `_recipient`.
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     */
    function _transfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        uint256 _sharesToTransfer = getSharesByMintedEUSD(_amount);
        _transferShares(_sender, _recipient, _sharesToTransfer);
        emit Transfer(_sender, _recipient, _amount);
        emit TransferShares(_sender, _recipient, _sharesToTransfer);
    }

    /**
     * @notice Sets `_amount` as the allowance of `_spender` over the `_owner` s tokens.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `_owner` cannot be the zero address.
     * - `_spender` cannot be the zero address.
     * - the contract must not be paused.
     */
    function _approve(
        address _owner,
        address _spender,
        uint256 _amount
    ) internal {
        require(_owner != address(0), "APPROVE_FROM_ZERO_ADDRESS");
        require(_spender != address(0), "APPROVE_TO_ZERO_ADDRESS");

        allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /**
     * @return the total amount of shares in existence.
     */
    function _getTotalShares() internal view returns (uint256) {
        return totalShares;
    }

    /**
     * @return the amount of shares owned by `_account`.
     */
    function _sharesOf(address _account) internal view returns (uint256) {
        return shares[_account];
    }

    /**
     * @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`.
     *
     * Requirements:
     *
     * - `_sender` cannot be the zero address.
     * - `_recipient` cannot be the zero address.
     * - `_sender` must hold at least `_sharesAmount` shares.
     * - the contract must not be paused.
     */
    function _transferShares(
        address _sender,
        address _recipient,
        uint256 _sharesAmount
    ) internal {
        require(_sender != address(0), "TRANSFER_FROM_THE_ZERO_ADDRESS");
        require(_recipient != address(0), "TRANSFER_TO_THE_ZERO_ADDRESS");

        uint256 currentSenderShares = shares[_sender];
        require(
            _sharesAmount <= currentSenderShares,
            "TRANSFER_AMOUNT_EXCEEDS_BALANCE"
        );

        shares[_sender] = currentSenderShares.sub(_sharesAmount);
        shares[_recipient] = shares[_recipient].add(_sharesAmount);
    }

    /**
     * @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares.
     * @dev This doesn't increase the token total supply.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the contract must not be paused.
     */
    function _mintShares(
        address _recipient,
        uint256 _sharesAmount
    ) internal returns (uint256 newTotalShares) {
        require(_recipient != address(0), "MINT_TO_THE_ZERO_ADDRESS");

        newTotalShares = _getTotalShares().add(_sharesAmount);
        totalShares = newTotalShares;

        shares[_recipient] = shares[_recipient].add(_sharesAmount);

        // Notice: we're not emitting a Transfer event from the zero address here since shares mint
        // works by taking the amount of tokens corresponding to the minted shares from all other
        // token holders, proportionally to their share. The total supply of the token doesn't change
        // as the result. This is equivalent to performing a send from each other token holder's
        // address to `address`, but we cannot reflect this as it would require sending an unbounded
        // number of events.
    }

    /**
     * @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares.
     * @dev This doesn't decrease the token total supply.
     *
     * Requirements:
     *
     * - `_account` cannot be the zero address.
     * - `_account` must hold at least `_sharesAmount` shares.
     * - the contract must not be paused.
     */
    function _burnShares(
        address _account,
        uint256 _sharesAmount
    ) internal returns (uint256 newTotalShares) {
        require(_account != address(0), "BURN_FROM_THE_ZERO_ADDRESS");

        uint256 accountShares = shares[_account];
        require(_sharesAmount <= accountShares, "BURN_AMOUNT_EXCEEDS_BALANCE");

        uint256 preRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount);

        newTotalShares = _getTotalShares().sub(_sharesAmount);
        totalShares = newTotalShares;

        shares[_account] = accountShares.sub(_sharesAmount);

        uint256 postRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount);

        emit SharesBurnt(
            _account,
            preRebaseTokenAmount,
            postRebaseTokenAmount,
            _sharesAmount
        );

        // Notice: we're not emitting a Transfer event to the zero address here since shares burn
        // works by redistributing the amount of tokens corresponding to the burned shares between
        // all other token holders. The total supply of the token doesn't change as the result.
        // This is equivalent to performing a send from `address` to each other token holder address,
        // but we cannot reflect this as it would require sending an unbounded number of events.

        // We're emitting `SharesBurnt` event to provide an explicit rebase log record nonetheless.
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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);
}

File 5 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"BorrowApyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DepositEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ESLBRMinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeeDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGov","type":"address"}],"name":"GovernanceAuthorityTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSlippage","type":"uint256"}],"name":"KeeperRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stETHAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payoutEUSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LSDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"eusdamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LiquidateEtherAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"keeperReward","type":"uint256"},{"indexed":false,"internalType":"bool","name":"superLiquidation","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LiquidationRecord","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSlippage","type":"uint256"}],"name":"RedemptionFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"RedemptionProvider","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"eusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"etherAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RigidRedemption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"SafeCollateralRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ServiceFeePoolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"preRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesAmount","type":"uint256"}],"name":"SharesBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesValue","type":"uint256"}],"name":"TransferShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WithdrawEther","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"badCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_bool","type":"bool"}],"name":"becomeRedemptionProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"depositEtherToMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"stETHamount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"depositStETHToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eslbrMinter","outputs":[{"internalType":"contract esLBRMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"payAmount","type":"uint256"}],"name":"excessIncomeDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBorrowedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"getMintedEUSDByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_EUSDAmount","type":"uint256"}],"name":"getSharesByMintedEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isRedemptionProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeperRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReportTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"etherAmount","type":"uint256"}],"name":"liquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeApy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"redemptionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"eusdAmount","type":"uint256"}],"name":"rigidRedemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFeePool","outputs":[{"internalType":"contract LbrStakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"setBorrowApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setESLBRMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newRate","type":"uint8"}],"name":"setKeeperRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLbrStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"setRedemptionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"setSafeCollateralRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"etherAmount","type":"uint256"}],"name":"superLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDepositedEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEUSDCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"transferShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526301e1338060075560966008556808ac7230489e800000600955680821ab0d44149800006080526032600a55600b805460ff19166001179055601080546001600160a01b03191673ae7ab96520de3a18e5e111b5eaab095312d7fe8417905534801561006f57600080fd5b50600380546001600160a01b031916331790556080516135c66100ab60003960008181610708015281816117dd015261202301526135c66000f3fe6080604052600436106102935760003560e01c80638a70a3c61161015a578063b85364e5116100c1578063dd62ed3e1161007a578063dd62ed3e146107f5578063e0115d0d14610815578063e914555e1461082b578063f3fef3a31461084b578063f5eb42dc1461086b578063fd55276a1461088b57600080fd5b8063b85364e514610740578063ba129df414610760578063baab9dab14610780578063c05ebc2c146107a0578063cfad57a2146107c0578063d5002f2e146107e057600080fd5b80639dc29fac116101135780639dc29fac146106765780639e48d6cc14610696578063a457c2d7146106b6578063a9059cbb146106d6578063ac0799dd146106f6578063b0df27fd1461072a57600080fd5b80638a70a3c6146105e05780638fcb4e5b1461060057806395d89b411461030357806396171e591461062057806399f009a2146106405780639b4d51f41461066057600080fd5b806340c10f19116101fe5780636cfa6a75116101b75780636cfa6a75146105215780636da6d8f11461054157806370a0823114610557578063733346e5146105775780637890444c1461058d57806378cf2cff146105c657600080fd5b806340c10f191461045e57806344ac84b01461047e578063458f58151461049e578063482ed2a2146104b45780634b3094f5146104e15780636bef22ee1461050157600080fd5b80631a7b9ef5116102505780631a7b9ef5146103b357806323b872dd146103d357806324bc1090146103f35780632d47194014610406578063313ce5671461041c578063395093511461043e57600080fd5b80630359d4cc1461029857806305ad8308146102ba57806306fdde0314610303578063095ea7b31461033657806312d43a511461036657806318160ddd1461039e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046131f6565b6108ab565b005b3480156102c657600080fd5b506102f06102d53660046131f6565b6001600160a01b03166000908152600d602052604090205490565b6040519081526020015b60405180910390f35b34801561030f57600080fd5b506040805180820182526004815263195554d160e21b602082015290516102fa9190613211565b34801561034257600080fd5b5061035661035136600461325f565b610936565b60405190151581526020016102fa565b34801561037257600080fd5b50600354610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156103aa57600080fd5b506102f061094d565b3480156103bf57600080fd5b506102b86103ce36600461325f565b61095d565b3480156103df57600080fd5b506103566103ee366004613289565b610c76565b6102b861040136600461325f565b610d1e565b34801561041257600080fd5b506102f060095481565b34801561042857600080fd5b5060125b60405160ff90911681526020016102fa565b34801561044a57600080fd5b5061035661045936600461325f565b610f34565b34801561046a57600080fd5b506102b861047936600461325f565b610f6a565b34801561048a57600080fd5b506102b86104993660046132c5565b6110c6565b3480156104aa57600080fd5b506102f0600a5481565b3480156104c057600080fd5b506102f06104cf3660046131f6565b600c6020526000908152604090205481565b3480156104ed57600080fd5b506102b86104fc3660046132e8565b61117e565b34801561050d57600080fd5b506102b861051c3660046132e8565b611248565b34801561052d57600080fd5b50601254610386906001600160a01b031681565b34801561054d57600080fd5b506102f060085481565b34801561056357600080fd5b506102f06105723660046131f6565b6115fe565b34801561058357600080fd5b506102f060065481565b34801561059957600080fd5b506103566105a83660046131f6565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105d257600080fd5b50600b5461042c9060ff1681565b3480156105ec57600080fd5b506102b86105fb3660046132e8565b611620565b34801561060c57600080fd5b506102f061061b36600461325f565b6116d8565b34801561062c57600080fd5b506102b861063b366004613289565b611786565b34801561064c57600080fd5b506102b861065b3660046131f6565b611ba2565b34801561066c57600080fd5b506102f060045481565b34801561068257600080fd5b506102b861069136600461325f565b611c19565b3480156106a257600080fd5b506102b86106b1366004613301565b611c7a565b3480156106c257600080fd5b506103566106d136600461325f565b611e47565b3480156106e257600080fd5b506103566106f136600461325f565b611ed4565b34801561070257600080fd5b506102f07f000000000000000000000000000000000000000000000000000000000000000081565b34801561073657600080fd5b506102f0600f5481565b34801561074c57600080fd5b506102f061075b3660046132e8565b611ee1565b34801561076c57600080fd5b506102b861077b3660046132c5565b611f24565b34801561078c57600080fd5b506102f061079b3660046132e8565b611fe4565b3480156107ac57600080fd5b506102b86107bb366004613289565b612015565b3480156107cc57600080fd5b506102b86107db3660046131f6565b61249d565b3480156107ec57600080fd5b506000546102f0565b34801561080157600080fd5b506102f0610810366004613334565b612515565b34801561082157600080fd5b506102f060055481565b34801561083757600080fd5b506102b8610846366004613375565b612540565b34801561085757600080fd5b506102b861086636600461325f565b6125f1565b34801561087757600080fd5b506102f06108863660046131f6565b6127f5565b34801561089757600080fd5b50601154610386906001600160a01b031681565b6003546001600160a01b031633146108de5760405162461bcd60e51b81526004016108d590613392565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0383161790556040517f78816b31283624f96a34a58e5f9cb743d63d7a325d42d4be00858daa99cf96199061092b90839042906133c1565b60405180910390a150565b6000610943338484612813565b5060015b92915050565b600061095860065490565b905090565b6001600160a01b0382166000908152600e602052604090205460ff166109d15760405162461bcd60e51b8152602060048201526024808201527f70726f7669646572206973206e6f74206120526564656d7074696f6e50726f7660448201526334b232b960e11b60648201526084016108d5565b6001600160a01b0382166000908152600d6020526040902054811115610a4a5760405162461bcd60e51b815260206004820152602860248201527f65757364416d6f756e742063616e6e6f7420737572706173732070726f766964604482015267195c9cc81919589d60c21b60648201526084016108d5565b6000610a54612920565b6001600160a01b0384166000908152600d6020908152604080832054600c9092528220549293509091610a889084906133f0565b610a939060646133f0565b610a9d9190613407565b905068056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152603060248201527f70726f7669646572277320636f6c6c61746572616c20726174652073686f756c60448201526f64206d6f7265207468616e203130302560801b60648201526084016108d5565b610b1c33858561299a565b6000612710600a54612710610b319190613429565b84610b4487670de0b6b3a76400006133f0565b610b4e9190613407565b610b5891906133f0565b610b629190613407565b6001600160a01b0386166000908152600c6020526040812080549293508392909190610b8f908490613429565b925050819055508060046000828254610ba89190613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610bdf90339085906004016133c1565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c22919061343c565b506040805185815260208101839052428183015290516001600160a01b0387169133917f1a7ab636ab77b4d93c0afba804a009a127e77def45e623e572144ca8f8a03ac59181900360600190a35050505050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cf45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016108d5565b610cff858585612b26565b610d138533610d0e8487612bde565b612813565b506001949350505050565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000341015610ddb5760405162461bcd60e51b815260206004820152602660248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015265189022aa241760d11b60648201526084016108d5565b60105460035460405163a1903eab60e01b81526001600160a01b039182166004820152600092919091169063a1903eab90349060240160206040518083038185885af1158015610e2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e549190613459565b905060008111610e955760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108d5565b3460046000828254610ea79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054349290610ed4908490613472565b90915550508115610eea57610eea838484612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89333442604051610f2793929190613485565b60405180910390a2505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610943918590610d0e9086612d00565b6001600160a01b038216610fbb5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b60008111610ff75760405162461bcd60e51b815260206004820152600960248201526816915493d7d352539560ba1b60448201526064016108d5565b611002338383612bea565b600a61100c61094d565b336000908152600d60205260409020546110279060646133f0565b6110319190613407565b11801561104f57506a084595161401484a00000061104d61094d565b115b156110c25760405162461bcd60e51b815260206004820152603860248201527f4d696e7420416d6f756e742063616e6e6f74206265206d6f7265207468616e2060448201527f313025206f6620746f74616c2063697263756c6174696f6e000000000000000060648201526084016108d5565b5050565b6003546001600160a01b031633146110f05760405162461bcd60e51b81526004016108d590613392565b6101f48160ff1611156111455760405162461bcd60e51b815260206004820152601860248201527f4d617820526564656d7074696f6e20466565206973203525000000000000000060448201526064016108d5565b60ff8116600a8190556040519081527f4dbf9634a3aaf3bc15ab627faeaac7c6b0a4754ead77206f1c11277356f2878f9060200161092b565b6003546001600160a01b031633146111a85760405162461bcd60e51b81526004016108d590613392565b6808ac7230489e8000008110156112135760405162461bcd60e51b815260206004820152602960248201527f5361666520436f6c6c61746572616c526174652073686f756c64206d6f7265206044820152687468616e203136302560b81b60648201526084016108d5565b60098190556040518181527f0447b351edf3bf02a602777192e1d189ac70324a0ca5502acd0d0918601eeb2e9060200161092b565b6000611252612920565b61126483670de0b6b3a76400006133f0565b61126e9190613407565b600480546010546040516370a0823160e01b81523093810193909352929350916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613459565b6112ec9190613429565b81111580156112fb5750600081115b6113575760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204c53442065786365737320696e636f6d652063616e20626520657860448201526618da185b99d95960ca1b60648201526084016108d5565b6000611361612d0c565b600f5461136e9190613472565b905080831115611473576012546113909033906001600160a01b031683612b26565b601254604051633c6b16ab60e01b8152600481018390526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b5050505060006113ff828561075b9190613429565b905080600003611416576114138285613429565b90505b6114203382612d50565b506000600f55601254604080518481524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a250611540565b60125461148b9033906001600160a01b031685612b26565b601254604051633c6b16ab60e01b8152600481018590526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050505082816114f59190613429565b600f55601254604080518581524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a25b4260055560105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157690339086906004016133c1565b6020604051808303816000875af1158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b9919061343c565b506040805183815260208101859052428183015290517fefa202e78b2ad7b96336e662b73d2b83b60668758a857269bd4d0962828329d19181900360600190a1505050565b6001600160a01b03811660009081526001602052604081205461094790611fe4565b6003546001600160a01b0316331461164a5760405162461bcd60e51b81526004016108d590613392565b609681111561169b5760405162461bcd60e51b815260206004820152601d60248201527f426f72726f77204150592063616e6e6f742065786365656420312e352500000060448201526064016108d5565b6116a3612ebf565b60088190556040518181527f3c62c9955fa46bea884e885afde8e7f674d06a027511ecb871d191869b8ab4819060200161092b565b60006116e5338484612ee3565b6040518281526001600160a01b0384169033907f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb9060200160405180910390a3600061173083611fe4565b9050836001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161177791815260200190565b60405180910390a39392505050565b6000611790612920565b6001600160a01b0384166000908152600d6020908152604080832054600c90925282205492935090916117c49084906133f0565b6117cf9060646133f0565b6117d99190613407565b90507f000000000000000000000000000000000000000000000000000000000000000081106118705760405162461bcd60e51b815260206004820152603860248201527f426f72726f7765727320636f6c6c61746572616c20726174652073686f756c6460448201527f2062656c6f7720626164436f6c6c61746572616c52617465000000000000000060648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020546118948460026133f0565b11156118f45760405162461bcd60e51b815260206004820152602960248201527f61206d6178206f662035302520636f6c6c61746572616c2063616e206265206c6044820152681a5c5d5a59185d195960ba1b60648201526084016108d5565b6000670de0b6b3a764000061190984866133f0565b6119139190613407565b9050806119208730612515565b101561193e5760405162461bcd60e51b81526004016108d5906134a6565b61194986868361299a565b6000600a61195886600b6133f0565b6119629190613407565b905080600460008282546119769190613429565b90915550506001600160a01b0386166000908152600c6020526040812080548392906119a3908490613429565b9091555060009050336001600160a01b03891603611a365760105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906119ed90339086906004016133c1565b6020604051808303816000875af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a30919061343c565b50611b4a565b600b54606e90611a499060ff16846133f0565b611a539190613407565b6010549091506001600160a01b031663a9059cbb89611a728486613429565b6040518363ffffffff1660e01b8152600401611a8f9291906133c1565b6020604051808303816000875af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad2919061343c565b5060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b0590339085906004016133c1565b6020604051808303816000875af1158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b48919061343c565b505b866001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad8933868686600042604051611b9097969594939291906134fb565b60405180910390a25050505050505050565b6003546001600160a01b03163314611bcc5760405162461bcd60e51b81526004016108d590613392565b601180546001600160a01b0319166001600160a01b0383161790556040517ffb30b10d69603a569e0dfcd8d074a070a51641dfbbe940536f216933cf6208889061092b90839042906133c1565b6001600160a01b038216611c6f5760405162461bcd60e51b815260206004820152601860248201527f4255524e5f544f5f5448455f5a45524f5f41444452455353000000000000000060448201526064016108d5565b6110c233838361299a565b6001600160a01b038316611cd05760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000821015611d395760405162461bcd60e51b815260206004820152602860248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015267189039ba22aa241760c11b60648201526084016108d5565b6010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db4919061343c565b508160046000828254611dc79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054849290611df4908490613472565b90915550508015611e0a57611e0a838483612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89338442604051610f2793929190613485565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611ebb5760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016108d5565b611eca3385610d0e8487612bde565b5060019392505050565b6000610943338484612b26565b600080611eed60065490565b905080600003611f005750600092915050565b611f1d81611f17611f1060005490565b8690613053565b9061305f565b9392505050565b6003546001600160a01b03163314611f4e5760405162461bcd60e51b81526004016108d590613392565b60058160ff161115611fa25760405162461bcd60e51b815260206004820152601760248201527f4d6178204b65657065722072657761726420697320352500000000000000000060448201526064016108d5565b600b805460ff191660ff83169081179091556040519081527f8e22963d45681714fade6b520d66ef5902422aac2bc9705573c0237d6a8f002a9060200161092b565b600080611ff060005490565b90506000546000036120055750600092915050565b611f1d81611f17611f1060065490565b600061201f612920565b90507f000000000000000000000000000000000000000000000000000000000000000061204a61094d565b8260045461205891906133f0565b6120639060646133f0565b61206d9190613407565b106120ca5760405162461bcd60e51b815260206004820152602760248201527f6f766572616c6c436f6c6c61746572616c526174652073686f756c642062656c6044820152666f77203135302560c81b60648201526084016108d5565b6001600160a01b0383166000908152600d6020908152604080832054600c9092528220546120f99084906133f0565b6121049060646133f0565b61210e9190613407565b90506806c6b935b8bbd40000811061217b5760405162461bcd60e51b815260206004820152602a60248201527f626f72726f7765727320636f6c6c61746572616c526174652073686f756c642060448201526962656c6f77203132352560b01b60648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020548311156121f95760405162461bcd60e51b815260206004820152602d60248201527f746f74616c206f6620636f6c6c61746572616c2063616e206265206c6971756960448201526c19185d195908185d081b5bdcdd609a1b60648201526084016108d5565b6000670de0b6b3a764000061220e84866133f0565b6122189190613407565b905068056bc75e2d63100000821061224b578161223e8268056bc75e2d631000006133f0565b6122489190613407565b90505b806122568730612515565b10156122745760405162461bcd60e51b81526004016108d5906134a6565b61227f86868361299a565b83600460008282546122919190613429565b90915550506001600160a01b0385166000908152600c6020526040812080548692906122be908490613429565b9091555060009050336001600160a01b0388161480159061231e5750600b546122f29060ff16670de0b6b3a764000061353b565b61230f9067ffffffffffffffff1668056bc75e2d63100000613567565b68ffffffffffffffffff168310155b156123c957600b5483906123359060ff16876133f0565b61234790670de0b6b3a76400006133f0565b6123519190613407565b60105460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061238490339085906004016133c1565b6020604051808303816000875af11580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c7919061343c565b505b6010546001600160a01b031663a9059cbb886123e58489613429565b6040518363ffffffff1660e01b81526004016124029291906133c1565b6020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612445919061343c565b50856001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad883385898660014260405161248c97969594939291906134fb565b60405180910390a250505050505050565b6003546001600160a01b031633146124c75760405162461bcd60e51b81526004016108d590613392565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f85314cee79a1d748bc922aee2e7514c754944bae54b9c5467dfd99629410fa9a9060200161092b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60115460405163fce67e0d60e01b81523360048201526001600160a01b039091169063fce67e0d90602401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050336000818152600e6020908152604091829020805460ff19168715159081179091558251938452908301527f3d9a02fcbaf508c27fa7c97d8e5795c8619e39299b3e8b7779fbe1f8d5de7970935001905061092b565b6001600160a01b0382166126475760405162461bcd60e51b815260206004820152601c60248201527f57495448445241575f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b600081116126875760405162461bcd60e51b815260206004820152600d60248201526c5a45524f5f574954484452415760981b60448201526064016108d5565b336000908152600c60205260409020548111156126dd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016108d5565b80600460008282546126ef9190613429565b9091555050336000908152600c602052604081208054839290612713908490613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061274a90859085906004016133c1565b6020604051808303816000875af1158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061343c565b50336000908152600d6020526040902054156127ac576127ac3361306b565b816001600160a01b03167f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db03383426040516127e993929190613485565b60405180910390a25050565b6001600160a01b038116600090815260016020526040812054610947565b6001600160a01b0383166128695760405162461bcd60e51b815260206004820152601960248201527f415050524f56455f46524f4d5f5a45524f5f414444524553530000000000000060448201526064016108d5565b6001600160a01b0382166128bf5760405162461bcd60e51b815260206004820152601760248201527f415050524f56455f544f5f5a45524f5f4144445245535300000000000000000060448201526064016108d5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000734c517d4e2c851ca76d7ec94b805269df0f2201de6001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612976573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109589190613459565b6001600160a01b0382166000908152600d6020526040902054811115612a155760405162461bcd60e51b815260206004820152602a60248201527f5265706179696e6720416d6f756e742053757270617373657320426f72726f776044820152691a5b99c8105b5bdd5b9d60b21b60648201526084016108d5565b6000612a2082611ee1565b9050612a2c8482612d50565b5060115460405163fce67e0d60e01b81526001600160a01b0385811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612a7457600080fd5b505af1158015612a88573d6000803e3d6000fd5b505050506001600160a01b0383166000908152600d602052604081208054849290612ab4908490613429565b90915550612ac29050612ebf565b8160066000828254612ad49190613429565b92505081905550826001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858442604051612b1893929190613485565b60405180910390a250505050565b6000612b3182611ee1565b9050612b3e848483612ee3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051612bd091815260200190565b60405180910390a350505050565b6000611f1d8284613429565b6000612bf582611ee1565b905080600003612c025750805b60115460405163fce67e0d60e01b81526001600160a01b0386811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612c4957600080fd5b505af1158015612c5d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600d602052604081208054849290612c89908490613472565b90915550612c999050838261312b565b50612ca2612ebf565b8160066000828254612cb49190613472565b90915550612cc390508461306b565b826001600160a01b03167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee338442604051612b1893929190613485565b6000611f1d8284613472565b600061271060075460055442612d229190613429565b600854600654612d3291906133f0565b612d3c91906133f0565b612d469190613407565b6109589190613407565b60006001600160a01b038316612da85760405162461bcd60e51b815260206004820152601a60248201527f4255524e5f46524f4d5f5448455f5a45524f5f4144445245535300000000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480831115612e115760405162461bcd60e51b815260206004820152601b60248201527f4255524e5f414d4f554e545f455843454544535f42414c414e4345000000000060448201526064016108d5565b6000612e1c84611fe4565b9050612e3184612e2b60005490565b90612bde565b60008190559250612e428285612bde565b6001600160a01b038616600090815260016020526040812091909155612e6785611fe4565b60408051848152602081018390529081018790529091506001600160a01b038716907f8b2a1e1ad5e0578c3dd82494156e985dade827a87c573b5c1c7716a32162ad649060600160405180910390a250505092915050565b612ec7612d0c565b600f6000828254612ed89190613472565b909155505042600555565b6001600160a01b038316612f395760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016108d5565b6001600160a01b038216612f8f5760405162461bcd60e51b815260206004820152601c60248201527f5452414e534645525f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480821115612ff85760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016108d5565b6130028183612bde565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546130319083612d00565b6001600160a01b03909316600090815260016020526040902092909255505050565b6000611f1d82846133f0565b6000611f1d8284613407565b6009546001600160a01b0382166000908152600d602052604090205461308f612920565b6001600160a01b0384166000908152600c60205260409020546130b291906133f0565b6130bd9060646133f0565b6130c79190613407565b10156131285760405162461bcd60e51b815260206004820152602a60248201527f636f6c6c61746572616c526174652069732042656c6f772073616665436f6c6c60448201526961746572616c5261746560b01b60648201526084016108d5565b50565b60006001600160a01b03831661317e5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b6131918261318b60005490565b90612d00565b60008181556001600160a01b0385168152600160205260409020549091506131b99083612d00565b6001600160a01b039093166000908152600160205260409020929092555090565b80356001600160a01b03811681146131f157600080fd5b919050565b60006020828403121561320857600080fd5b611f1d826131da565b600060208083528351808285015260005b8181101561323e57858101830151858201604001528201613222565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561327257600080fd5b61327b836131da565b946020939093013593505050565b60008060006060848603121561329e57600080fd5b6132a7846131da565b92506132b5602085016131da565b9150604084013590509250925092565b6000602082840312156132d757600080fd5b813560ff81168114611f1d57600080fd5b6000602082840312156132fa57600080fd5b5035919050565b60008060006060848603121561331657600080fd5b61331f846131da565b95602085013595506040909401359392505050565b6000806040838503121561334757600080fd5b613350836131da565b915061335e602084016131da565b90509250929050565b801515811461312857600080fd5b60006020828403121561338757600080fd5b8135611f1d81613367565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610947576109476133da565b60008261342457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610947576109476133da565b60006020828403121561344e57600080fd5b8151611f1d81613367565b60006020828403121561346b57600080fd5b5051919050565b80820180821115610947576109476133da565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082526035908201527f70726f76696465722073686f756c6420617574686f72697a6520746f2070726f6040820152741d9a5919481b1a5c5d5a59185d1a5bdb88115554d1605a1b606082015260800190565b6001600160a01b039788168152959096166020860152604085019390935260608401919091526080830152151560a082015260c081019190915260e00190565b67ffffffffffffffff81811683821602808216919082811461355f5761355f6133da565b505092915050565b68ffffffffffffffffff818116838216019080821115613589576135896133da565b509291505056fea2646970667358221220bc65e4a4fb18b1f5f97dcfbbea162a8c2708052c7e17cc41775af03291d08e0f64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102935760003560e01c80638a70a3c61161015a578063b85364e5116100c1578063dd62ed3e1161007a578063dd62ed3e146107f5578063e0115d0d14610815578063e914555e1461082b578063f3fef3a31461084b578063f5eb42dc1461086b578063fd55276a1461088b57600080fd5b8063b85364e514610740578063ba129df414610760578063baab9dab14610780578063c05ebc2c146107a0578063cfad57a2146107c0578063d5002f2e146107e057600080fd5b80639dc29fac116101135780639dc29fac146106765780639e48d6cc14610696578063a457c2d7146106b6578063a9059cbb146106d6578063ac0799dd146106f6578063b0df27fd1461072a57600080fd5b80638a70a3c6146105e05780638fcb4e5b1461060057806395d89b411461030357806396171e591461062057806399f009a2146106405780639b4d51f41461066057600080fd5b806340c10f19116101fe5780636cfa6a75116101b75780636cfa6a75146105215780636da6d8f11461054157806370a0823114610557578063733346e5146105775780637890444c1461058d57806378cf2cff146105c657600080fd5b806340c10f191461045e57806344ac84b01461047e578063458f58151461049e578063482ed2a2146104b45780634b3094f5146104e15780636bef22ee1461050157600080fd5b80631a7b9ef5116102505780631a7b9ef5146103b357806323b872dd146103d357806324bc1090146103f35780632d47194014610406578063313ce5671461041c578063395093511461043e57600080fd5b80630359d4cc1461029857806305ad8308146102ba57806306fdde0314610303578063095ea7b31461033657806312d43a511461036657806318160ddd1461039e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046131f6565b6108ab565b005b3480156102c657600080fd5b506102f06102d53660046131f6565b6001600160a01b03166000908152600d602052604090205490565b6040519081526020015b60405180910390f35b34801561030f57600080fd5b506040805180820182526004815263195554d160e21b602082015290516102fa9190613211565b34801561034257600080fd5b5061035661035136600461325f565b610936565b60405190151581526020016102fa565b34801561037257600080fd5b50600354610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156103aa57600080fd5b506102f061094d565b3480156103bf57600080fd5b506102b86103ce36600461325f565b61095d565b3480156103df57600080fd5b506103566103ee366004613289565b610c76565b6102b861040136600461325f565b610d1e565b34801561041257600080fd5b506102f060095481565b34801561042857600080fd5b5060125b60405160ff90911681526020016102fa565b34801561044a57600080fd5b5061035661045936600461325f565b610f34565b34801561046a57600080fd5b506102b861047936600461325f565b610f6a565b34801561048a57600080fd5b506102b86104993660046132c5565b6110c6565b3480156104aa57600080fd5b506102f0600a5481565b3480156104c057600080fd5b506102f06104cf3660046131f6565b600c6020526000908152604090205481565b3480156104ed57600080fd5b506102b86104fc3660046132e8565b61117e565b34801561050d57600080fd5b506102b861051c3660046132e8565b611248565b34801561052d57600080fd5b50601254610386906001600160a01b031681565b34801561054d57600080fd5b506102f060085481565b34801561056357600080fd5b506102f06105723660046131f6565b6115fe565b34801561058357600080fd5b506102f060065481565b34801561059957600080fd5b506103566105a83660046131f6565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105d257600080fd5b50600b5461042c9060ff1681565b3480156105ec57600080fd5b506102b86105fb3660046132e8565b611620565b34801561060c57600080fd5b506102f061061b36600461325f565b6116d8565b34801561062c57600080fd5b506102b861063b366004613289565b611786565b34801561064c57600080fd5b506102b861065b3660046131f6565b611ba2565b34801561066c57600080fd5b506102f060045481565b34801561068257600080fd5b506102b861069136600461325f565b611c19565b3480156106a257600080fd5b506102b86106b1366004613301565b611c7a565b3480156106c257600080fd5b506103566106d136600461325f565b611e47565b3480156106e257600080fd5b506103566106f136600461325f565b611ed4565b34801561070257600080fd5b506102f07f00000000000000000000000000000000000000000000000821ab0d441498000081565b34801561073657600080fd5b506102f0600f5481565b34801561074c57600080fd5b506102f061075b3660046132e8565b611ee1565b34801561076c57600080fd5b506102b861077b3660046132c5565b611f24565b34801561078c57600080fd5b506102f061079b3660046132e8565b611fe4565b3480156107ac57600080fd5b506102b86107bb366004613289565b612015565b3480156107cc57600080fd5b506102b86107db3660046131f6565b61249d565b3480156107ec57600080fd5b506000546102f0565b34801561080157600080fd5b506102f0610810366004613334565b612515565b34801561082157600080fd5b506102f060055481565b34801561083757600080fd5b506102b8610846366004613375565b612540565b34801561085757600080fd5b506102b861086636600461325f565b6125f1565b34801561087757600080fd5b506102f06108863660046131f6565b6127f5565b34801561089757600080fd5b50601154610386906001600160a01b031681565b6003546001600160a01b031633146108de5760405162461bcd60e51b81526004016108d590613392565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0383161790556040517f78816b31283624f96a34a58e5f9cb743d63d7a325d42d4be00858daa99cf96199061092b90839042906133c1565b60405180910390a150565b6000610943338484612813565b5060015b92915050565b600061095860065490565b905090565b6001600160a01b0382166000908152600e602052604090205460ff166109d15760405162461bcd60e51b8152602060048201526024808201527f70726f7669646572206973206e6f74206120526564656d7074696f6e50726f7660448201526334b232b960e11b60648201526084016108d5565b6001600160a01b0382166000908152600d6020526040902054811115610a4a5760405162461bcd60e51b815260206004820152602860248201527f65757364416d6f756e742063616e6e6f7420737572706173732070726f766964604482015267195c9cc81919589d60c21b60648201526084016108d5565b6000610a54612920565b6001600160a01b0384166000908152600d6020908152604080832054600c9092528220549293509091610a889084906133f0565b610a939060646133f0565b610a9d9190613407565b905068056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152603060248201527f70726f7669646572277320636f6c6c61746572616c20726174652073686f756c60448201526f64206d6f7265207468616e203130302560801b60648201526084016108d5565b610b1c33858561299a565b6000612710600a54612710610b319190613429565b84610b4487670de0b6b3a76400006133f0565b610b4e9190613407565b610b5891906133f0565b610b629190613407565b6001600160a01b0386166000908152600c6020526040812080549293508392909190610b8f908490613429565b925050819055508060046000828254610ba89190613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610bdf90339085906004016133c1565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c22919061343c565b506040805185815260208101839052428183015290516001600160a01b0387169133917f1a7ab636ab77b4d93c0afba804a009a127e77def45e623e572144ca8f8a03ac59181900360600190a35050505050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cf45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016108d5565b610cff858585612b26565b610d138533610d0e8487612bde565b612813565b506001949350505050565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000341015610ddb5760405162461bcd60e51b815260206004820152602660248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015265189022aa241760d11b60648201526084016108d5565b60105460035460405163a1903eab60e01b81526001600160a01b039182166004820152600092919091169063a1903eab90349060240160206040518083038185885af1158015610e2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e549190613459565b905060008111610e955760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108d5565b3460046000828254610ea79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054349290610ed4908490613472565b90915550508115610eea57610eea838484612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89333442604051610f2793929190613485565b60405180910390a2505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610943918590610d0e9086612d00565b6001600160a01b038216610fbb5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b60008111610ff75760405162461bcd60e51b815260206004820152600960248201526816915493d7d352539560ba1b60448201526064016108d5565b611002338383612bea565b600a61100c61094d565b336000908152600d60205260409020546110279060646133f0565b6110319190613407565b11801561104f57506a084595161401484a00000061104d61094d565b115b156110c25760405162461bcd60e51b815260206004820152603860248201527f4d696e7420416d6f756e742063616e6e6f74206265206d6f7265207468616e2060448201527f313025206f6620746f74616c2063697263756c6174696f6e000000000000000060648201526084016108d5565b5050565b6003546001600160a01b031633146110f05760405162461bcd60e51b81526004016108d590613392565b6101f48160ff1611156111455760405162461bcd60e51b815260206004820152601860248201527f4d617820526564656d7074696f6e20466565206973203525000000000000000060448201526064016108d5565b60ff8116600a8190556040519081527f4dbf9634a3aaf3bc15ab627faeaac7c6b0a4754ead77206f1c11277356f2878f9060200161092b565b6003546001600160a01b031633146111a85760405162461bcd60e51b81526004016108d590613392565b6808ac7230489e8000008110156112135760405162461bcd60e51b815260206004820152602960248201527f5361666520436f6c6c61746572616c526174652073686f756c64206d6f7265206044820152687468616e203136302560b81b60648201526084016108d5565b60098190556040518181527f0447b351edf3bf02a602777192e1d189ac70324a0ca5502acd0d0918601eeb2e9060200161092b565b6000611252612920565b61126483670de0b6b3a76400006133f0565b61126e9190613407565b600480546010546040516370a0823160e01b81523093810193909352929350916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613459565b6112ec9190613429565b81111580156112fb5750600081115b6113575760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204c53442065786365737320696e636f6d652063616e20626520657860448201526618da185b99d95960ca1b60648201526084016108d5565b6000611361612d0c565b600f5461136e9190613472565b905080831115611473576012546113909033906001600160a01b031683612b26565b601254604051633c6b16ab60e01b8152600481018390526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b5050505060006113ff828561075b9190613429565b905080600003611416576114138285613429565b90505b6114203382612d50565b506000600f55601254604080518481524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a250611540565b60125461148b9033906001600160a01b031685612b26565b601254604051633c6b16ab60e01b8152600481018590526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050505082816114f59190613429565b600f55601254604080518581524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a25b4260055560105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157690339086906004016133c1565b6020604051808303816000875af1158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b9919061343c565b506040805183815260208101859052428183015290517fefa202e78b2ad7b96336e662b73d2b83b60668758a857269bd4d0962828329d19181900360600190a1505050565b6001600160a01b03811660009081526001602052604081205461094790611fe4565b6003546001600160a01b0316331461164a5760405162461bcd60e51b81526004016108d590613392565b609681111561169b5760405162461bcd60e51b815260206004820152601d60248201527f426f72726f77204150592063616e6e6f742065786365656420312e352500000060448201526064016108d5565b6116a3612ebf565b60088190556040518181527f3c62c9955fa46bea884e885afde8e7f674d06a027511ecb871d191869b8ab4819060200161092b565b60006116e5338484612ee3565b6040518281526001600160a01b0384169033907f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb9060200160405180910390a3600061173083611fe4565b9050836001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161177791815260200190565b60405180910390a39392505050565b6000611790612920565b6001600160a01b0384166000908152600d6020908152604080832054600c90925282205492935090916117c49084906133f0565b6117cf9060646133f0565b6117d99190613407565b90507f00000000000000000000000000000000000000000000000821ab0d441498000081106118705760405162461bcd60e51b815260206004820152603860248201527f426f72726f7765727320636f6c6c61746572616c20726174652073686f756c6460448201527f2062656c6f7720626164436f6c6c61746572616c52617465000000000000000060648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020546118948460026133f0565b11156118f45760405162461bcd60e51b815260206004820152602960248201527f61206d6178206f662035302520636f6c6c61746572616c2063616e206265206c6044820152681a5c5d5a59185d195960ba1b60648201526084016108d5565b6000670de0b6b3a764000061190984866133f0565b6119139190613407565b9050806119208730612515565b101561193e5760405162461bcd60e51b81526004016108d5906134a6565b61194986868361299a565b6000600a61195886600b6133f0565b6119629190613407565b905080600460008282546119769190613429565b90915550506001600160a01b0386166000908152600c6020526040812080548392906119a3908490613429565b9091555060009050336001600160a01b03891603611a365760105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906119ed90339086906004016133c1565b6020604051808303816000875af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a30919061343c565b50611b4a565b600b54606e90611a499060ff16846133f0565b611a539190613407565b6010549091506001600160a01b031663a9059cbb89611a728486613429565b6040518363ffffffff1660e01b8152600401611a8f9291906133c1565b6020604051808303816000875af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad2919061343c565b5060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b0590339085906004016133c1565b6020604051808303816000875af1158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b48919061343c565b505b866001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad8933868686600042604051611b9097969594939291906134fb565b60405180910390a25050505050505050565b6003546001600160a01b03163314611bcc5760405162461bcd60e51b81526004016108d590613392565b601180546001600160a01b0319166001600160a01b0383161790556040517ffb30b10d69603a569e0dfcd8d074a070a51641dfbbe940536f216933cf6208889061092b90839042906133c1565b6001600160a01b038216611c6f5760405162461bcd60e51b815260206004820152601860248201527f4255524e5f544f5f5448455f5a45524f5f41444452455353000000000000000060448201526064016108d5565b6110c233838361299a565b6001600160a01b038316611cd05760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000821015611d395760405162461bcd60e51b815260206004820152602860248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015267189039ba22aa241760c11b60648201526084016108d5565b6010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db4919061343c565b508160046000828254611dc79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054849290611df4908490613472565b90915550508015611e0a57611e0a838483612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89338442604051610f2793929190613485565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611ebb5760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016108d5565b611eca3385610d0e8487612bde565b5060019392505050565b6000610943338484612b26565b600080611eed60065490565b905080600003611f005750600092915050565b611f1d81611f17611f1060005490565b8690613053565b9061305f565b9392505050565b6003546001600160a01b03163314611f4e5760405162461bcd60e51b81526004016108d590613392565b60058160ff161115611fa25760405162461bcd60e51b815260206004820152601760248201527f4d6178204b65657065722072657761726420697320352500000000000000000060448201526064016108d5565b600b805460ff191660ff83169081179091556040519081527f8e22963d45681714fade6b520d66ef5902422aac2bc9705573c0237d6a8f002a9060200161092b565b600080611ff060005490565b90506000546000036120055750600092915050565b611f1d81611f17611f1060065490565b600061201f612920565b90507f00000000000000000000000000000000000000000000000821ab0d441498000061204a61094d565b8260045461205891906133f0565b6120639060646133f0565b61206d9190613407565b106120ca5760405162461bcd60e51b815260206004820152602760248201527f6f766572616c6c436f6c6c61746572616c526174652073686f756c642062656c6044820152666f77203135302560c81b60648201526084016108d5565b6001600160a01b0383166000908152600d6020908152604080832054600c9092528220546120f99084906133f0565b6121049060646133f0565b61210e9190613407565b90506806c6b935b8bbd40000811061217b5760405162461bcd60e51b815260206004820152602a60248201527f626f72726f7765727320636f6c6c61746572616c526174652073686f756c642060448201526962656c6f77203132352560b01b60648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020548311156121f95760405162461bcd60e51b815260206004820152602d60248201527f746f74616c206f6620636f6c6c61746572616c2063616e206265206c6971756960448201526c19185d195908185d081b5bdcdd609a1b60648201526084016108d5565b6000670de0b6b3a764000061220e84866133f0565b6122189190613407565b905068056bc75e2d63100000821061224b578161223e8268056bc75e2d631000006133f0565b6122489190613407565b90505b806122568730612515565b10156122745760405162461bcd60e51b81526004016108d5906134a6565b61227f86868361299a565b83600460008282546122919190613429565b90915550506001600160a01b0385166000908152600c6020526040812080548692906122be908490613429565b9091555060009050336001600160a01b0388161480159061231e5750600b546122f29060ff16670de0b6b3a764000061353b565b61230f9067ffffffffffffffff1668056bc75e2d63100000613567565b68ffffffffffffffffff168310155b156123c957600b5483906123359060ff16876133f0565b61234790670de0b6b3a76400006133f0565b6123519190613407565b60105460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061238490339085906004016133c1565b6020604051808303816000875af11580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c7919061343c565b505b6010546001600160a01b031663a9059cbb886123e58489613429565b6040518363ffffffff1660e01b81526004016124029291906133c1565b6020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612445919061343c565b50856001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad883385898660014260405161248c97969594939291906134fb565b60405180910390a250505050505050565b6003546001600160a01b031633146124c75760405162461bcd60e51b81526004016108d590613392565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f85314cee79a1d748bc922aee2e7514c754944bae54b9c5467dfd99629410fa9a9060200161092b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60115460405163fce67e0d60e01b81523360048201526001600160a01b039091169063fce67e0d90602401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050336000818152600e6020908152604091829020805460ff19168715159081179091558251938452908301527f3d9a02fcbaf508c27fa7c97d8e5795c8619e39299b3e8b7779fbe1f8d5de7970935001905061092b565b6001600160a01b0382166126475760405162461bcd60e51b815260206004820152601c60248201527f57495448445241575f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b600081116126875760405162461bcd60e51b815260206004820152600d60248201526c5a45524f5f574954484452415760981b60448201526064016108d5565b336000908152600c60205260409020548111156126dd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016108d5565b80600460008282546126ef9190613429565b9091555050336000908152600c602052604081208054839290612713908490613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061274a90859085906004016133c1565b6020604051808303816000875af1158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061343c565b50336000908152600d6020526040902054156127ac576127ac3361306b565b816001600160a01b03167f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db03383426040516127e993929190613485565b60405180910390a25050565b6001600160a01b038116600090815260016020526040812054610947565b6001600160a01b0383166128695760405162461bcd60e51b815260206004820152601960248201527f415050524f56455f46524f4d5f5a45524f5f414444524553530000000000000060448201526064016108d5565b6001600160a01b0382166128bf5760405162461bcd60e51b815260206004820152601760248201527f415050524f56455f544f5f5a45524f5f4144445245535300000000000000000060448201526064016108d5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000734c517d4e2c851ca76d7ec94b805269df0f2201de6001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612976573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109589190613459565b6001600160a01b0382166000908152600d6020526040902054811115612a155760405162461bcd60e51b815260206004820152602a60248201527f5265706179696e6720416d6f756e742053757270617373657320426f72726f776044820152691a5b99c8105b5bdd5b9d60b21b60648201526084016108d5565b6000612a2082611ee1565b9050612a2c8482612d50565b5060115460405163fce67e0d60e01b81526001600160a01b0385811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612a7457600080fd5b505af1158015612a88573d6000803e3d6000fd5b505050506001600160a01b0383166000908152600d602052604081208054849290612ab4908490613429565b90915550612ac29050612ebf565b8160066000828254612ad49190613429565b92505081905550826001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858442604051612b1893929190613485565b60405180910390a250505050565b6000612b3182611ee1565b9050612b3e848483612ee3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051612bd091815260200190565b60405180910390a350505050565b6000611f1d8284613429565b6000612bf582611ee1565b905080600003612c025750805b60115460405163fce67e0d60e01b81526001600160a01b0386811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612c4957600080fd5b505af1158015612c5d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600d602052604081208054849290612c89908490613472565b90915550612c999050838261312b565b50612ca2612ebf565b8160066000828254612cb49190613472565b90915550612cc390508461306b565b826001600160a01b03167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee338442604051612b1893929190613485565b6000611f1d8284613472565b600061271060075460055442612d229190613429565b600854600654612d3291906133f0565b612d3c91906133f0565b612d469190613407565b6109589190613407565b60006001600160a01b038316612da85760405162461bcd60e51b815260206004820152601a60248201527f4255524e5f46524f4d5f5448455f5a45524f5f4144445245535300000000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480831115612e115760405162461bcd60e51b815260206004820152601b60248201527f4255524e5f414d4f554e545f455843454544535f42414c414e4345000000000060448201526064016108d5565b6000612e1c84611fe4565b9050612e3184612e2b60005490565b90612bde565b60008190559250612e428285612bde565b6001600160a01b038616600090815260016020526040812091909155612e6785611fe4565b60408051848152602081018390529081018790529091506001600160a01b038716907f8b2a1e1ad5e0578c3dd82494156e985dade827a87c573b5c1c7716a32162ad649060600160405180910390a250505092915050565b612ec7612d0c565b600f6000828254612ed89190613472565b909155505042600555565b6001600160a01b038316612f395760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016108d5565b6001600160a01b038216612f8f5760405162461bcd60e51b815260206004820152601c60248201527f5452414e534645525f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480821115612ff85760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016108d5565b6130028183612bde565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546130319083612d00565b6001600160a01b03909316600090815260016020526040902092909255505050565b6000611f1d82846133f0565b6000611f1d8284613407565b6009546001600160a01b0382166000908152600d602052604090205461308f612920565b6001600160a01b0384166000908152600c60205260409020546130b291906133f0565b6130bd9060646133f0565b6130c79190613407565b10156131285760405162461bcd60e51b815260206004820152602a60248201527f636f6c6c61746572616c526174652069732042656c6f772073616665436f6c6c60448201526961746572616c5261746560b01b60648201526084016108d5565b50565b60006001600160a01b03831661317e5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b6131918261318b60005490565b90612d00565b60008181556001600160a01b0385168152600160205260409020549091506131b99083612d00565b6001600160a01b039093166000908152600160205260409020929092555090565b80356001600160a01b03811681146131f157600080fd5b919050565b60006020828403121561320857600080fd5b611f1d826131da565b600060208083528351808285015260005b8181101561323e57858101830151858201604001528201613222565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561327257600080fd5b61327b836131da565b946020939093013593505050565b60008060006060848603121561329e57600080fd5b6132a7846131da565b92506132b5602085016131da565b9150604084013590509250925092565b6000602082840312156132d757600080fd5b813560ff81168114611f1d57600080fd5b6000602082840312156132fa57600080fd5b5035919050565b60008060006060848603121561331657600080fd5b61331f846131da565b95602085013595506040909401359392505050565b6000806040838503121561334757600080fd5b613350836131da565b915061335e602084016131da565b90509250929050565b801515811461312857600080fd5b60006020828403121561338757600080fd5b8135611f1d81613367565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610947576109476133da565b60008261342457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610947576109476133da565b60006020828403121561344e57600080fd5b8151611f1d81613367565b60006020828403121561346b57600080fd5b5051919050565b80820180821115610947576109476133da565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082526035908201527f70726f76696465722073686f756c6420617574686f72697a6520746f2070726f6040820152741d9a5919481b1a5c5d5a59185d1a5bdb88115554d1605a1b606082015260800190565b6001600160a01b039788168152959096166020860152604085019390935260608401919091526080830152151560a082015260c081019190915260e00190565b67ffffffffffffffff81811683821602808216919082811461355f5761355f6133da565b505092915050565b68ffffffffffffffffff818116838216019080821115613589576135896133da565b509291505056fea2646970667358221220bc65e4a4fb18b1f5f97dcfbbea162a8c2708052c7e17cc41775af03291d08e0f64736f6c63430008110033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.