ETH Price: $3,281.13 (+0.80%)
Gas: 5 Gwei

Contract

0xEe7403d3f2660928b2B39BAb80A820975520aFe0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Permit183608082023-10-16 5:20:35285 days ago1697433635IN
0xEe7403d3...75520aFe0
0 ETH0.000368836.78364801
Withdraw181185952023-09-12 6:54:11319 days ago1694501651IN
0xEe7403d3...75520aFe0
0 ETH0.001096488.9179593
Withdraw180921672023-09-08 14:03:11323 days ago1694181791IN
0xEe7403d3...75520aFe0
0 ETH0.0023262316.61112391
Withdraw176608572023-07-10 4:21:11383 days ago1688962871IN
0xEe7403d3...75520aFe0
0 ETH0.0018078613.42328824
Deposit176419732023-07-07 12:38:11386 days ago1688733491IN
0xEe7403d3...75520aFe0
0 ETH0.0063627938.3730591
Withdraw176144752023-07-03 15:58:59389 days ago1688399939IN
0xEe7403d3...75520aFe0
0 ETH0.0042197931.33176123
Withdraw176016822023-07-01 20:50:35391 days ago1688244635IN
0xEe7403d3...75520aFe0
0 ETH0.0017423113.21125791
Withdraw175480802023-06-24 8:04:23399 days ago1687593863IN
0xEe7403d3...75520aFe0
0 ETH0.0020759813.25819294
Withdraw175243412023-06-21 0:02:35402 days ago1687305755IN
0xEe7403d3...75520aFe0
0 ETH0.0020926615.53791035
Withdraw174999282023-06-17 13:48:47406 days ago1687009727IN
0xEe7403d3...75520aFe0
0 ETH0.0019271214.30881017
Withdraw174829072023-06-15 4:25:47408 days ago1686803147IN
0xEe7403d3...75520aFe0
0 ETH0.0020336515.09977184
Withdraw174613032023-06-12 3:26:35411 days ago1686540395IN
0xEe7403d3...75520aFe0
0 ETH0.0018785313.9468051
Withdraw174285412023-06-07 12:36:59416 days ago1686141419IN
0xEe7403d3...75520aFe0
0 ETH0.0029718319.57975561
Withdraw174244682023-06-06 22:49:59416 days ago1686091799IN
0xEe7403d3...75520aFe0
0 ETH0.0025417618.87246535
Withdraw174127092023-06-05 7:01:11418 days ago1685948471IN
0xEe7403d3...75520aFe0
0 ETH0.0030836522.10615561
Withdraw174056952023-06-04 7:13:23419 days ago1685862803IN
0xEe7403d3...75520aFe0
0 ETH0.002376418.02093662
Withdraw173907672023-06-02 4:43:11421 days ago1685680991IN
0xEe7403d3...75520aFe0
0 ETH0.003837525.28316677
Withdraw173848572023-06-01 8:44:47422 days ago1685609087IN
0xEe7403d3...75520aFe0
0 ETH0.0043324532.85723933
Withdraw173818172023-05-31 22:29:23422 days ago1685572163IN
0xEe7403d3...75520aFe0
0 ETH0.0044307429.19169496
Withdraw173768642023-05-31 5:45:23423 days ago1685511923IN
0xEe7403d3...75520aFe0
0 ETH0.0048543831
Withdraw173737012023-05-30 19:04:59423 days ago1685473499IN
0xEe7403d3...75520aFe0
0 ETH0.0068405349.04698746
Deposit173493882023-05-27 9:05:11427 days ago1685178311IN
0xEe7403d3...75520aFe0
0 ETH0.0035906522.02665216
Withdraw173128812023-05-22 5:52:59432 days ago1684734779IN
0xEe7403d3...75520aFe0
0 ETH0.0042922227.41428409
Withdraw172672162023-05-15 19:20:47438 days ago1684178447IN
0xEe7403d3...75520aFe0
0 ETH0.0132749998.55743666
Withdraw172467632023-05-12 21:56:35441 days ago1683928595IN
0xEe7403d3...75520aFe0
0 ETH0.0066265947.50896777
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Tranche

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : Tranche.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */
pragma solidity ^0.8.13;

import { Owned } from "../lib/solmate/src/auth/Owned.sol";
import { ERC4626 } from "../lib/solmate/src/mixins/ERC4626.sol";
import { ILendingPool } from "./interfaces/ILendingPool.sol";
import { FixedPointMathLib } from "../lib/solmate/src/utils/FixedPointMathLib.sol";
import { ITranche } from "./interfaces/ITranche.sol";
import { IGuardian } from "./interfaces/IGuardian.sol";

/**
 * @title Tranche
 * @author Pragma Labs
 * @notice The Tranche contract allows for lending of a specified ERC20 token, managed by a lending pool.
 * @dev Protocol is according the ERC4626 standard, with a certain ERC20 as underlying
 * @dev Implementation not vulnerable to ERC4626 inflation attacks,
 * since totalAssets() cannot be manipulated by first minter when total amount of shares are low.
 * For more information, see https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706
 */
contract Tranche is ITranche, ERC4626, Owned {
    using FixedPointMathLib for uint256;

    ILendingPool public immutable lendingPool;

    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // Flag indicating if the Tranche is locked or not.
    bool public locked;
    // Flag indicating if there are ongoing auctions or not.
    bool public auctionInProgress;

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event LockSet(bool status);
    event AuctionFlagSet(bool status);

    /* //////////////////////////////////////////////////////////////
                                MODIFIERS
    ////////////////////////////////////////////////////////////// */

    modifier notLocked() {
        require(!locked, "TRANCHE: LOCKED");
        _;
    }

    /**
     * @dev Certain actions (depositing and withdrawing) can be halted on the most junior tranche while auctions are in progress.
     * This prevents frontrunning both in the case there is bad debt (by pulling out the tranche before the bad debt is settled),
     * as in the case there are big payouts to the LPs (mitigate Just In Time attacks, where MEV bots front-run the payout of
     * Liquidation penalties to the most junior tranche and withdraw immediately after).
     */
    modifier notDuringAuction() {
        require(!auctionInProgress, "TRANCHE: AUCTION IN PROGRESS");
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    /**
     * @notice The constructor for a tranche.
     * @param lendingPool_ the Lending Pool of the underlying ERC-20 token, with the lending logic.
     * @param prefix_ The prefix of the contract name (eg. Senior -> Mezzanine -> Junior).
     * @param prefixSymbol_ The prefix of the contract symbol (eg. SR  -> MZ -> JR).
     * @dev The name and symbol of the tranche are automatically generated, based on the name and symbol of the underlying token.
     */
    constructor(address lendingPool_, string memory prefix_, string memory prefixSymbol_)
        ERC4626(
            ERC4626(address(lendingPool_)).asset(),
            string(abi.encodePacked(prefix_, " Arcadia ", ERC4626(lendingPool_).asset().name())),
            string(abi.encodePacked(prefixSymbol_, "arc", ERC4626(lendingPool_).asset().symbol()))
        )
        Owned(msg.sender)
    {
        lendingPool = ILendingPool(lendingPool_);
    }

    /*//////////////////////////////////////////////////////////////
                        LOCKING LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @notice Locks the tranche in case all liquidity of the tranche is written off due to bad debt.
     * @dev Only the Lending Pool can call this function, only trigger is a severe default event.
     */
    function lock() external {
        require(msg.sender == address(lendingPool), "T_L: UNAUTHORIZED");
        locked = true;
        auctionInProgress = false;

        emit LockSet(true);
        emit AuctionFlagSet(false);
    }

    /**
     * @notice Unlocks the tranche.
     * @dev Only the Owner can call this function, since tranches are locked due to complete defaults,
     * This function will only be called to partially refund existing share-holders after a default.
     */
    function unLock() external onlyOwner {
        locked = false;

        emit LockSet(false);
    }

    /**
     * @notice Locks the tranche when an auction is in progress.
     * @param auctionInProgress_ Flag indicating if there are auctions in progress.
     * @dev Only the Lending Pool can call this function.
     * This function is to make sure no JIT liquidity is provided during a positive auction,
     * and that no liquidity can be withdrawn during a negative auction.
     */
    function setAuctionInProgress(bool auctionInProgress_) external {
        require(msg.sender == address(lendingPool), "T_SAIP: UNAUTHORIZED");
        auctionInProgress = auctionInProgress_;

        emit AuctionFlagSet(auctionInProgress_);
    }

    /*//////////////////////////////////////////////////////////////
                        DEPOSIT/WITHDRAWAL LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @notice Modification of the standard ERC-4626 deposit implementation.
     * @param assets The amount of assets of the underlying ERC-20 token being deposited.
     * @param receiver The address that receives the minted shares.
     * @return shares The amount of shares minted.
     * @dev This contract does not directly transfer the underlying assets from the sender to the receiver.
     * Instead it calls the deposit of the Lending Pool which calls the transferFrom of the underlying assets.
     * Hence the sender should not give this contract an allowance to transfer the underlying asset but the Lending Pool.
     */
    function deposit(uint256 assets, address receiver)
        public
        override
        notLocked
        notDuringAuction
        returns (uint256 shares)
    {
        // Check for rounding error since we round down in previewDeposit.
        require((shares = previewDepositAndSync(assets)) != 0, "T_D: ZERO_SHARES");

        // Need to transfer (via lendingPool.depositInLendingPool()) before minting or ERC777s could reenter.
        lendingPool.depositInLendingPool(assets, msg.sender);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);
    }

    /**
     * @notice Modification of the standard ERC-4626 mint implementation.
     * @param shares The amount of shares minted.
     * @param receiver The address that receives the minted shares.
     * @return assets The corresponding amount of assets of the underlying ERC-20 token being deposited.
     * @dev This contract does not directly transfers the underlying assets from the sender to the receiver.
     * Instead it calls the deposit of the Lending Pool which calls the transferFrom of the underlying assets.
     * Hence the sender should not give this contract an allowance to transfer the underlying asset but the Lending Pool.
     */
    function mint(uint256 shares, address receiver)
        public
        override
        notLocked
        notDuringAuction
        returns (uint256 assets)
    {
        assets = previewMintAndSync(shares); // No need to check for rounding error, previewMint rounds up.

        // Need to transfer (via lendingPool.depositInLendingPool()) before minting or ERC777s could reenter.
        lendingPool.depositInLendingPool(assets, msg.sender);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);
    }

    /**
     * @notice Modification of the standard ERC-4626 withdraw implementation.
     * @param assets The amount of assets of the underlying ERC-20 token being withdrawn.
     * @param receiver The address of the receiver of the underlying ERC-20 tokens.
     * @param owner_ The address of the owner of the assets being withdrawn.
     * @return shares The corresponding amount of shares redeemed.
     */
    function withdraw(uint256 assets, address receiver, address owner_)
        public
        override
        notLocked
        notDuringAuction
        returns (uint256 shares)
    {
        shares = previewWithdrawAndSync(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner_) {
            uint256 allowed = allowance[owner_][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) {
                allowance[owner_][msg.sender] = allowed - shares;
            }
        }

        _burn(owner_, shares);

        emit Withdraw(msg.sender, receiver, owner_, assets, shares);

        lendingPool.withdrawFromLendingPool(assets, receiver);
    }

    /**
     * @notice Modification of the standard ERC-4626 redeem implementation.
     * @param shares the amount of shares being redeemed.
     * @param receiver The address of the receiver of the underlying ERC-20 tokens.
     * @param owner_ The address of the owner of the shares being redeemed.
     * @return assets The corresponding amount of assets withdrawn.
     */
    function redeem(uint256 shares, address receiver, address owner_)
        public
        override
        notLocked
        notDuringAuction
        returns (uint256 assets)
    {
        if (msg.sender != owner_) {
            uint256 allowed = allowance[owner_][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) {
                allowance[owner_][msg.sender] = allowed - shares;
            }
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeemAndSync(shares)) != 0, "T_R: ZERO_ASSETS");

        _burn(owner_, shares);

        emit Withdraw(msg.sender, receiver, owner_, assets, shares);

        lendingPool.withdrawFromLendingPool(assets, receiver);
    }

    /*//////////////////////////////////////////////////////////////
                            ACCOUNTING LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @notice Returns the total amount of underlying assets, to which liquidity providers have a claim.
     * @return assets The total amount of underlying assets, to which liquidity providers have a claim.
     * @dev The Liquidity Pool does the accounting of the outstanding claim on liquidity per tranche.
     */
    function totalAssets() public view override returns (uint256 assets) {
        assets = lendingPool.liquidityOf(address(this));
    }

    /**
     * @dev Modification of totalAssets() where interests are realised (state modification).
     */
    function totalAssetsAndSync() public returns (uint256 assets) {
        assets = lendingPool.liquidityOfAndSync(address(this));
    }

    /**
     * @dev Modification of convertToShares() where interests are realised (state modification).
     */
    function convertToSharesAndSync(uint256 assets) public returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssetsAndSync());
    }

    /**
     * @dev Modification of convertToAssets() where interests are realised (state modification).
     */
    function convertToAssetsAndSync(uint256 shares) public returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivDown(totalAssetsAndSync(), supply);
    }

    /**
     * @dev Modification of previewDeposit() where interests are realised (state modification).
     */
    function previewDepositAndSync(uint256 assets) public returns (uint256) {
        return convertToSharesAndSync(assets);
    }

    /**
     * @dev Modification of previewMint() where interests are realised (state modification).
     */
    function previewMintAndSync(uint256 shares) public returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivUp(totalAssetsAndSync(), supply);
    }

    /**
     * @dev Modification of previewWithdraw() where interests are realised (state modification).
     */
    function previewWithdrawAndSync(uint256 assets) public returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivUp(supply, totalAssetsAndSync());
    }

    /**
     * @dev Modification of previewRedeem() where interests are realised (state modification).
     */
    function previewRedeemAndSync(uint256 shares) public returns (uint256) {
        return convertToAssetsAndSync(shares);
    }

    /*//////////////////////////////////////////////////////////////
                     DEPOSIT/WITHDRAWAL LIMIT LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev maxDeposit() according the EIP-4626 specification.
     */
    function maxDeposit(address) public view override returns (uint256 maxAssets) {
        if (locked || auctionInProgress || IGuardian(address(lendingPool)).depositPaused()) return 0;

        uint256 supplyCap = lendingPool.supplyCap();
        uint256 realisedLiquidity = lendingPool.totalRealisedLiquidity();
        uint256 interests = lendingPool.calcUnrealisedDebt();

        if (supplyCap > 0) {
            if (realisedLiquidity + interests > supplyCap) return 0;
            maxAssets = supplyCap - realisedLiquidity - interests;
        } else {
            maxAssets = type(uint128).max - realisedLiquidity - interests;
        }
    }

    /**
     * @dev maxMint() according the EIP-4626 specification.
     */
    function maxMint(address) public view override returns (uint256 maxShares) {
        if (locked || auctionInProgress || IGuardian(address(lendingPool)).depositPaused()) return 0;

        uint256 supplyCap = lendingPool.supplyCap();
        uint256 realisedLiquidity = lendingPool.totalRealisedLiquidity();
        uint256 interests = lendingPool.calcUnrealisedDebt();

        if (supplyCap > 0) {
            if (realisedLiquidity + interests > supplyCap) return 0;
            maxShares = convertToShares(supplyCap - realisedLiquidity - interests);
        } else {
            maxShares = convertToShares(type(uint128).max - realisedLiquidity - interests);
        }
    }

    /**
     * @dev maxWithdraw() according the EIP-4626 specification.
     */
    function maxWithdraw(address owner_) public view override returns (uint256 maxAssets) {
        if (locked || auctionInProgress || IGuardian(address(lendingPool)).withdrawPaused()) return 0;

        uint256 availableAssets = asset.balanceOf(address(lendingPool));
        uint256 claimableAssets = convertToAssets(balanceOf[owner_]);

        maxAssets = availableAssets < claimableAssets ? availableAssets : claimableAssets;
    }

    /**
     * @dev maxRedeem() according the EIP-4626 specification.
     */
    function maxRedeem(address owner_) public view override returns (uint256 maxShares) {
        if (locked || auctionInProgress || IGuardian(address(lendingPool)).withdrawPaused()) return 0;

        uint256 claimableShares = balanceOf[owner_];
        if (claimableShares == 0) return 0;
        uint256 availableShares = convertToShares(asset.balanceOf(address(lendingPool)));

        maxShares = availableShares < claimableShares ? availableShares : claimableShares;
    }
}

File 2 of 9 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 3 of 9 : ERC4626.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";
import {SafeTransferLib} from "../utils/SafeTransferLib.sol";
import {FixedPointMathLib} from "../utils/FixedPointMathLib.sol";

/// @notice Minimal ERC4626 tokenized Vault implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol)
abstract contract ERC4626 is ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed caller,
        address indexed receiver,
        address indexed owner,
        uint256 assets,
        uint256 shares
    );

    /*//////////////////////////////////////////////////////////////
                               IMMUTABLES
    //////////////////////////////////////////////////////////////*/

    ERC20 public immutable asset;

    constructor(
        ERC20 _asset,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol, _asset.decimals()) {
        asset = _asset;
    }

    /*//////////////////////////////////////////////////////////////
                        DEPOSIT/WITHDRAWAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function deposit(uint256 assets, address receiver) public virtual returns (uint256 shares) {
        // Check for rounding error since we round down in previewDeposit.
        require((shares = previewDeposit(assets)) != 0, "ZERO_SHARES");

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) {
        assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up.

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) public virtual returns (uint256 shares) {
        shares = previewWithdraw(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) public virtual returns (uint256 assets) {
        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS");

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    /*//////////////////////////////////////////////////////////////
                            ACCOUNTING LOGIC
    //////////////////////////////////////////////////////////////*/

    function totalAssets() public view virtual returns (uint256);

    function convertToShares(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets());
    }

    function convertToAssets(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply);
    }

    function previewDeposit(uint256 assets) public view virtual returns (uint256) {
        return convertToShares(assets);
    }

    function previewMint(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);
    }

    function previewWithdraw(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivUp(supply, totalAssets());
    }

    function previewRedeem(uint256 shares) public view virtual returns (uint256) {
        return convertToAssets(shares);
    }

    /*//////////////////////////////////////////////////////////////
                     DEPOSIT/WITHDRAWAL LIMIT LOGIC
    //////////////////////////////////////////////////////////////*/

    function maxDeposit(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxMint(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxWithdraw(address owner) public view virtual returns (uint256) {
        return convertToAssets(balanceOf[owner]);
    }

    function maxRedeem(address owner) public view virtual returns (uint256) {
        return balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HOOKS LOGIC
    //////////////////////////////////////////////////////////////*/

    function beforeWithdraw(uint256 assets, uint256 shares) internal virtual {}

    function afterDeposit(uint256 assets, uint256 shares) internal virtual {}
}

File 4 of 9 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 5 of 9 : FixedPointMathLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

File 6 of 9 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 7 of 9 : IGuardian.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IGuardian {
    /**
     * @notice Returns if Withdrawals are paused or not.
     * @return bool indicating if Withdrawals are paused or not.
     */
    function withdrawPaused() external view returns (bool);

    /**
     * @notice Returns if Deposits are paused or not.
     * @return bool indicating if Deposits are paused or not.
     */
    function depositPaused() external view returns (bool);
}

File 8 of 9 : ILendingPool.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

import { ERC20 } from "../../lib/solmate/src/tokens/ERC20.sol";

interface ILendingPool {
    /**
     * @notice returns the supply cap of the Lending Pool.
     * @return supplyCap The supply cap of the Lending Pool.
     */
    function supplyCap() external view returns (uint128);

    /**
     * @notice returns the total realised liquidity of the Lending Pool.
     * @return totalRealisedLiquidity The total realised liquidity of the Lending Pool.
     */
    function totalRealisedLiquidity() external view returns (uint128);

    /**
     * @notice Deposit assets in the Lending Pool.
     * @param assets The amount of assets of the underlying ERC-20 token being deposited.
     * @param from The address of the Liquidity Provider who deposits the underlying ERC-20 token via a Tranche.
     */
    function depositInLendingPool(uint256 assets, address from) external;

    /**
     * @notice Withdraw assets from the Lending Pool.
     * @param assets The amount of assets of the underlying ERC-20 tokens being withdrawn.
     * @param receiver The address of the receiver of the underlying ERC-20 tokens.
     */
    function withdrawFromLendingPool(uint256 assets, address receiver) external;

    /**
     * @notice Returns the redeemable amount of liquidity in the underlying asset of an address.
     * @param owner The address of the liquidity provider.
     * @return assets The redeemable amount of liquidity in the underlying asset.
     */
    function liquidityOf(address owner) external view returns (uint256);

    /**
     * @notice liquidityOf, but syncs the unrealised interest first.
     * @param owner The address of the liquidity provider.
     * @return assets The redeemable amount of liquidity in the underlying asset.
     */
    function liquidityOfAndSync(address owner) external returns (uint256);

    /**
     * @notice Calculates the unrealised debt (interests).
     * @return unrealisedDebt The unrealised debt.
     */
    function calcUnrealisedDebt() external view returns (uint256);
}

File 9 of 9 : ITranche.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface ITranche {
    /**
     * @notice Locks the tranche in case all liquidity of the tranche is written of due to bad debt.
     */
    function lock() external;

    /**
     * @notice Locks the tranche while an auction is in progress.
     * @param auctionInProgress Flag indicating if there are auctions in progress.
     */
    function setAuctionInProgress(bool auctionInProgress) external;
}

Settings
{
  "remappings": [
    "arcadia-lending/=lib/arcadia-lending/",
    "ds-test/=lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "v2-periphery/=lib/v2-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"lendingPool_","type":"address"},{"internalType":"string","name":"prefix_","type":"string"},{"internalType":"string","name":"prefixSymbol_","type":"string"}],"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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"AuctionFlagSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssetsAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToSharesAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lendingPool","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDepositAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMintAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeemAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdrawAndSync","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"auctionInProgress_","type":"bool"}],"name":"setAuctionInProgress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssetsAndSync","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b5060405162002dfe38038062002dfe833981016040819052620000359162000504565b33836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000583565b83856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000583565b6001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001699190810190620005aa565b6040516020016200017c929190620005ea565b60405160208183030381529060405283866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000583565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200022f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002599190810190620005aa565b6040516020016200026c92919062000632565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000674565b6000620002f0848262000728565b506001620002ff838262000728565b5060ff81166080524660a0526200031562000382565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506001600160a01b03166101005262000872565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620003b69190620007f4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200043457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200046a57818101518382015260200162000450565b50506000910152565b600082601f8301126200048557600080fd5b81516001600160401b0380821115620004a257620004a262000437565b604051601f8301601f19908116603f01168101908282118183101715620004cd57620004cd62000437565b81604052838152866020858801011115620004e757600080fd5b620004fa8460208301602089016200044d565b9695505050505050565b6000806000606084860312156200051a57600080fd5b835162000527816200041e565b60208501519093506001600160401b03808211156200054557600080fd5b620005538783880162000473565b935060408601519150808211156200056a57600080fd5b50620005798682870162000473565b9150509250925092565b6000602082840312156200059657600080fd5b8151620005a3816200041e565b9392505050565b600060208284031215620005bd57600080fd5b81516001600160401b03811115620005d457600080fd5b620005e28482850162000473565b949350505050565b60008351620005fe8184602088016200044d565b6801020b931b0b234b0960bd1b9083019081528351620006268160098401602088016200044d565b01600901949350505050565b60008351620006468184602088016200044d565b6261726360e81b9083019081528351620006688160038401602088016200044d565b01600301949350505050565b6000602082840312156200068757600080fd5b815160ff81168114620005a357600080fd5b600181811c90821680620006ae57607f821691505b602082108103620006cf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200072357600081815260208120601f850160051c81016020861015620006fe5750805b601f850160051c820191505b818110156200071f578281556001016200070a565b5050505b505050565b81516001600160401b0381111562000744576200074462000437565b6200075c8162000755845462000699565b84620006d5565b602080601f8311600181146200079457600084156200077b5750858301515b600019600386901b1c1916600185901b1785556200071f565b600085815260208120601f198616915b82811015620007c557888601518255948401946001909101908401620007a4565b5085821015620007e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620008048162000699565b600182811680156200081f5760018114620008355762000866565b60ff198416875282151583028701945062000866565b8760005260208060002060005b858110156200085d5781548a82015290840190820162000842565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516124ad62000951600039600081816104680152818161062c0152818161094e015281816109df01528181610a6e01528181610afd01528181610cdb01528181610e2d015281816110c6015281816112b801528181611313015281816113a401528181611433015281816114c2015281816115f70152818161169b015281816119e201528181611ab001528181611ca801528181611d6f0152611e61015260008181610349015281816116c60152611adf01526000610900015260006108d00152600061030801526124ad6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108fd5761069f611ef6565b507f000000000000000000000000000000000000000000000000000000000000000090565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091611b4a917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c634300081100330000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d81565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146108fd5761069f611ef6565b507f61a3533aad9e5fd303e459226ab69051c24add2bf459a187691e7994d35213d590565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d16906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d16906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d811660048301526000917f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d81166004830152600091611b4a917f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d1614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d1614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033

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

0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : lendingPool_ (address): 0x9aa024D3fd962701ED17F76c17CaB22d3dc9D92d
Arg [1] : prefix_ (string): Senior
Arg [2] : prefixSymbol_ (string): sr

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 53656e696f720000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 7372000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.