ETH Price: $3,425.59 (+0.17%)
Gas: 48 Gwei

Contract

0x68847530E93789Cc2e602130f6B53C55E1159Bb9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw186488142023-11-25 12:48:5998 days ago1700916539IN
0x68847530...5E1159Bb9
0 ETH0.0021799117.21242743
Withdraw181338192023-09-14 10:07:11170 days ago1694686031IN
0x68847530...5E1159Bb9
0 ETH0.0012169211.11105432
Withdraw180921622023-09-08 14:02:11176 days ago1694181731IN
0x68847530...5E1159Bb9
0 ETH0.0018401516.79766787
Withdraw180881852023-09-08 0:40:23176 days ago1694133623IN
0x68847530...5E1159Bb9
0 ETH0.001629712.86800579
Withdraw179901182023-08-25 7:07:59190 days ago1692947279IN
0x68847530...5E1159Bb9
0 ETH0.0021472416.9544033
Withdraw178121382023-07-31 9:36:59215 days ago1690796219IN
0x68847530...5E1159Bb9
0 ETH0.0018310916.71497264
Withdraw177863052023-07-27 18:50:59218 days ago1690483859IN
0x68847530...5E1159Bb9
0 ETH0.0051514747.02481874
Withdraw177842842023-07-27 12:05:11219 days ago1690459511IN
0x68847530...5E1159Bb9
0 ETH0.0030395524
Deposit176484752023-07-08 10:33:23238 days ago1688812403IN
0x68847530...5E1159Bb9
0 ETH0.0021499914.65510166
Withdraw176016892023-07-01 20:51:59244 days ago1688244719IN
0x68847530...5E1159Bb9
0 ETH0.0018842613.21716493
Withdraw175650902023-06-26 17:30:35249 days ago1687800635IN
0x68847530...5E1159Bb9
0 ETH0.0021584715.14061881
Deposit175639822023-06-26 13:45:59250 days ago1687787159IN
0x68847530...5E1159Bb9
0 ETH0.0018577513.11261802
Withdraw175238032023-06-20 22:14:23255 days ago1687299263IN
0x68847530...5E1159Bb9
0 ETH0.0022528417.95465333
Transfer175206732023-06-20 11:40:59256 days ago1687261259IN
0x68847530...5E1159Bb9
0 ETH0.0006259313.44905528
Withdraw175033962023-06-18 1:27:47258 days ago1687051667IN
0x68847530...5E1159Bb9
0 ETH0.0019090813.39010893
Withdraw174999342023-06-17 13:49:59259 days ago1687009799IN
0x68847530...5E1159Bb9
0 ETH0.0018162314.47502578
Withdraw174937512023-06-16 17:02:11260 days ago1686934931IN
0x68847530...5E1159Bb9
0 ETH0.002879220.19782713
Withdraw174413162023-06-09 7:51:59267 days ago1686297119IN
0x68847530...5E1159Bb9
0 ETH0.0028716420.14141366
Withdraw174193242023-06-06 5:25:35270 days ago1686029135IN
0x68847530...5E1159Bb9
0 ETH0.0027108419.01358589
Withdraw174192322023-06-06 5:07:11270 days ago1686028031IN
0x68847530...5E1159Bb9
0 ETH0.0040219332.06005886
Withdraw174101092023-06-04 22:10:47271 days ago1685916647IN
0x68847530...5E1159Bb9
0 ETH0.0028992223.10620041
Withdraw174012472023-06-03 16:09:35273 days ago1685808575IN
0x68847530...5E1159Bb9
0 ETH0.0040657432.12450629
Withdraw173972562023-06-03 2:41:59273 days ago1685760119IN
0x68847530...5E1159Bb9
0 ETH0.0030570624.15470736
Withdraw173500092023-05-27 11:11:35280 days ago1685185895IN
0x68847530...5E1159Bb9
0 ETH0.0028873122.81129192
Withdraw173262612023-05-24 3:03:47283 days ago1684897427IN
0x68847530...5E1159Bb9
0 ETH0.0048455933.98940276
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 6 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"}]

6101206040523480156200001257600080fd5b5060405162002dfe38038062002dfe833981016040819052620000359162000504565b33836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000583565b83856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000583565b6001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001699190810190620005aa565b6040516020016200017c929190620005ea565b60405160208183030381529060405283866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000583565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200022f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002599190810190620005aa565b6040516020016200026c92919062000632565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000674565b6000620002f0848262000728565b506001620002ff838262000728565b5060ff81166080524660a0526200031562000382565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506001600160a01b03166101005262000872565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620003b69190620007f4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200043457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200046a57818101518382015260200162000450565b50506000910152565b600082601f8301126200048557600080fd5b81516001600160401b0380821115620004a257620004a262000437565b604051601f8301601f19908116603f01168101908282118183101715620004cd57620004cd62000437565b81604052838152866020858801011115620004e757600080fd5b620004fa8460208301602089016200044d565b9695505050505050565b6000806000606084860312156200051a57600080fd5b835162000527816200041e565b60208501519093506001600160401b03808211156200054557600080fd5b620005538783880162000473565b935060408601519150808211156200056a57600080fd5b50620005798682870162000473565b9150509250925092565b6000602082840312156200059657600080fd5b8151620005a3816200041e565b9392505050565b600060208284031215620005bd57600080fd5b81516001600160401b03811115620005d457600080fd5b620005e28482850162000473565b949350505050565b60008351620005fe8184602088016200044d565b6801020b931b0b234b0960bd1b9083019081528351620006268160098401602088016200044d565b01600901949350505050565b60008351620006468184602088016200044d565b6261726360e81b9083019081528351620006688160038401602088016200044d565b01600301949350505050565b6000602082840312156200068757600080fd5b815160ff81168114620005a357600080fd5b600181811c90821680620006ae57607f821691505b602082108103620006cf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200072357600081815260208120601f850160051c81016020861015620006fe5750805b601f850160051c820191505b818110156200071f578281556001016200070a565b5050505b505050565b81516001600160401b0381111562000744576200074462000437565b6200075c8162000755845462000699565b84620006d5565b602080601f8311600181146200079457600084156200077b5750858301515b600019600386901b1c1916600185901b1785556200071f565b600085815260208120601f198616915b82811015620007c557888601518255948401946001909101908401620007a4565b5085821015620007e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620008048162000699565b600182811680156200081f5760018114620008355762000866565b60ff198416875282151583028701945062000866565b8760005260208060002060005b858110156200085d5781548a82015290840190820162000842565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516124ad62000951600039600081816104680152818161062c0152818161094e015281816109df01528181610a6e01528181610afd01528181610cdb01528181610e2d015281816110c6015281816112b801528181611313015281816113a401528181611433015281816114c2015281816115f70152818161169b015281816119e201528181611ab001528181611ca801528181611d6f0152611e61015260008181610349015281816116c60152611adf01526000610900015260006108d00152600061030801526124ad6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108fd5761069f611ef6565b507f000000000000000000000000000000000000000000000000000000000000000090565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091611b4a917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146108fd5761069f611ef6565b507ffbb30f14a5da55187490e0e08c09d4e388cbb2db8f62241e01183a3b9db6e3dc90565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc811660048301526000917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81166004830152600091611b4a917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033

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

000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

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

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc
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

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