Contract 0x200C24184c50796fB72343C7578b6639F515757E 10

 
Txn Hash Method
Block
From
To
Value
0x16ad7e3d4fb3e37292f534929554c942cd2f45b812acb747abe78d483ed8e968Permit1114483582023-10-28 12:18:13115 days 14 hrs ago0xfcb5a922877683128cc8b52cd7883cab12d21229 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000456558220.015053804
0xfe8b679e49152d495d3d917202299a1622d4386a4dbae92069e2f72818f269faPermit1104017512023-10-04 6:51:19139 days 19 hrs ago0xfcb5a922877683128cc8b52cd7883cab12d21229 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.000018889850.030587176
0x1213c73927d5e7718a188994de1ce88ef829836224d1e6f3c6de04710d9b577fPermit1085423032023-08-22 5:49:43182 days 20 hrs ago0xfcb5a922877683128cc8b52cd7883cab12d21229 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000388356520.000000189
0xbb819f52cc59529a9793c6a30129111cc129d4b27841ba366d64757085130d31Withdraw1063070972023-07-01 12:02:51234 days 14 hrs ago0x01327ca699949ca90b9dc330ea53ce299bf71795 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000295452150.000007527
0xc5e6b837dc9fc6c1837458a32974a48fa3516d70e7143a86846a56764845da21Withdraw1060275152023-06-25 0:43:27241 days 1 hr ago0x5602551c4d64623bd4b2f189c0f1cad29a4eb108 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000224881980.000000084
0x4a801978e0406ebe8d034097b8355b6811d6398518d5558e045b5b823e81319fDeposit1059262222023-06-22 16:27:01243 days 10 hrs ago0x32a59b87352e980dd6ab1baf462696d28e63525d IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000307798490.000000594
0xf62f7f2b79c6df2dccf55f6d2a21e250c69fed2c60cc34e7e0de196a7b93dd70Deposit1054770372023-06-12 6:54:11253 days 19 hrs ago0x31c683a67f0e3919a86fead9241d94f34679f11f IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000265697030.0002
0x7fc3018a50a71e54cac838cdf8d7fa7407e000ccc899735b91cc42d73a3159f0Withdraw1054014832023-06-10 12:55:43255 days 13 hrs ago0xb71d05cf5cdf7a9b15b20b9aab5e91332c271c96 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000325180550.000000231
0xede02d736bedb4ec64423ac6297d7d138a83e14af6db07b566f0f4fad8e2c2eeWithdraw1043122772023-06-03 21:55:04262 days 4 hrs ago0x4c046bb14f0ae9623c940aa95a70aa384698e6bf IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0000986470390.001
0x9b3c275d8b98f1ff75037fe8a0424042b1e5c39fdd40ca38db24b286c046eddeWithdraw1041484862023-06-03 10:42:28262 days 15 hrs ago0x4c046bb14f0ae9623c940aa95a70aa384698e6bf IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001008670630.001
0xbaaaef90c1d65fdabe872c7918cde738d5b9e5a5a38165c592f21902aaf3c76cWithdraw1039452962023-06-02 18:48:01263 days 7 hrs ago0x4c046bb14f0ae9623c940aa95a70aa384698e6bf IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001137839670.001
0x28169e50e3091cb76eaba3de0e4dea0d20ad50eff0fa7bd1f6eab86a20c8b906Deposit1035843432023-06-01 13:59:46264 days 12 hrs ago0x4c046bb14f0ae9623c940aa95a70aa384698e6bf IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001611091250.001
0x0aa65a998c16816bc810d3dfce825bc08779a1ee667d6594d91f96a23878ddceWithdraw1020811562023-05-27 16:02:53269 days 10 hrs ago0xfba206e73709f614e5a85aff27a98692d4f3c579 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001533414640.001
0x5a575678abccdba94fc9c85d406fe4f96f8fb8e6a69541e29ce59d6efaef4c24Deposit1017974452023-05-26 17:54:52270 days 8 hrs ago0x86e39d06c9f61242fa4d2c1925d606ce07cbc9b4 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001621017620.001
0xd18388e76c8ae3ee40530ea36f929f60c3619086cf0e7ca04b2e1783d4ddb586Withdraw1017518102023-05-26 14:43:12270 days 11 hrs ago0xfba206e73709f614e5a85aff27a98692d4f3c579 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001736883690.001
0x80d599efec0477cbffac6d56c0e5d974b2a1b89af6836a525bd20e69e34d0936Deposit1016966812023-05-26 11:48:03270 days 14 hrs ago0x4c046bb14f0ae9623c940aa95a70aa384698e6bf IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001061919840.001
0x05d921838469e51b59487ffa2138f09b8771e1f769e983e06aaeced6061352b6Withdraw1011028342023-05-24 14:54:25272 days 11 hrs ago0xbdfa4f4492dd7b7cf211209c4791af8d52bf5c50 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.000275130730.0012
0x93709acb2331e683f89b55ce51e6ab6416b676a556731dff6575ab613583dcdfWithdraw1005806852023-05-23 0:06:39274 days 2 hrs ago0xf3e112e0c32e7a30da87517e98a22103ade76d01 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001855834820.001
0x6ae21a7e6f4fc1074c3e087f47c3b5917ab4cba4627973495a612978c1bfca30Withdraw989971332023-05-17 7:21:41279 days 19 hrs ago0x8b4e2b9d4cc9355f2a965be94cc7166754e27704 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0002042010190.0013
0xc6f86270faa76674762e91fcffd07916077a304f4e198fa4ca08da3094f8756dWithdraw989969232023-05-17 7:20:56279 days 19 hrs ago0x8b4e2b9d4cc9355f2a965be94cc7166754e27704 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001796081710.0012
0xee1e40a349e0ce086c45577aefdf877ab55daada1094e3f3203a2373aa97b15cWithdraw989968102023-05-17 7:20:41279 days 19 hrs ago0x8b4e2b9d4cc9355f2a965be94cc7166754e27704 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001795941990.0012
0xc5efb4a332cf29dec504ec08268d6615260b8e27a732be345b76ef797ec5dbc1Deposit989966562023-05-17 7:20:11279 days 19 hrs ago0x8b4e2b9d4cc9355f2a965be94cc7166754e27704 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0001659119270.0012
0x48b2069b05d9c13d7341701b27e18313cb20cd79ceb12a1084549d217dc18168Withdraw974936432023-05-11 17:51:42285 days 8 hrs ago0x3d1d397acd3b0989d9e633d6dbf7e6f8f5c03a2d IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.000711936050.001048154
0xd4964efc8ddee28e5388051f077352fff07b64f2376f07fd1f9412acdc2031ebDeposit974213132023-05-11 11:37:33285 days 15 hrs ago0x522d634b6bffb444fdbcde5932738995a4cfd1f1 IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.0003723940760.001048154
0x36ef506dab05c5167ba17e244b491ff55d91b580ccf7d4a766a6b65096c96057Deposit963796002023-05-04 16:27:56292 days 10 hrs ago0x32a59b87352e980dd6ab1baf462696d28e63525d IN  0x200c24184c50796fb72343c7578b6639f515757e0 ETH0.00038321960.001
[ Download CSV Export 
Latest 14 internal transactions
Parent Txn Hash Block From To Value
0xc346e7a7b047278952307ab6960e884ab39a2342e3ddef73f17012c791be65b61073497062023-07-25 15:16:29210 days 11 hrs ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x200c24184c50796fb72343c7578b6639f515757e0 ETH
0xca7c1a0fde444e1a68a8c2b8ae3fb76ec384d1f7ae9a50d26f8bfdd37c7a0afe1066764952023-07-10 1:16:07226 days 1 hr ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x200c24184c50796fb72343c7578b6639f515757e0 ETH
0xbb819f52cc59529a9793c6a30129111cc129d4b27841ba366d64757085130d311063070972023-07-01 12:02:51234 days 14 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xbb819f52cc59529a9793c6a30129111cc129d4b27841ba366d64757085130d311063070972023-07-01 12:02:51234 days 14 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xc5e6b837dc9fc6c1837458a32974a48fa3516d70e7143a86846a56764845da211060275152023-06-25 0:43:27241 days 1 hr ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xc5e6b837dc9fc6c1837458a32974a48fa3516d70e7143a86846a56764845da211060275152023-06-25 0:43:27241 days 1 hr ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x4a801978e0406ebe8d034097b8355b6811d6398518d5558e045b5b823e81319f1059262222023-06-22 16:27:01243 days 10 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x4a801978e0406ebe8d034097b8355b6811d6398518d5558e045b5b823e81319f1059262222023-06-22 16:27:01243 days 10 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xf62f7f2b79c6df2dccf55f6d2a21e250c69fed2c60cc34e7e0de196a7b93dd701054770372023-06-12 6:54:11253 days 19 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xf62f7f2b79c6df2dccf55f6d2a21e250c69fed2c60cc34e7e0de196a7b93dd701054770372023-06-12 6:54:11253 days 19 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x7fc3018a50a71e54cac838cdf8d7fa7407e000ccc899735b91cc42d73a3159f01054014832023-06-10 12:55:43255 days 13 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x7fc3018a50a71e54cac838cdf8d7fa7407e000ccc899735b91cc42d73a3159f01054014832023-06-10 12:55:43255 days 13 hrs ago 0x200c24184c50796fb72343c7578b6639f515757e 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xe2e72de2c1ea58176ee64bc3ca770a58dabb34f9b6a523fb5c3194dbd426ce971053969852023-06-10 10:25:47255 days 16 hrs ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x200c24184c50796fb72343c7578b6639f515757e0 ETH
0xed75c90eb18296e75b808d845d694359d238761e26248e75d43e5310d7f5d7821053789302023-06-10 0:23:57256 days 2 hrs ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x200c24184c50796fb72343c7578b6639f515757e0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Tranche

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : 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 2 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 3 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 4 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 5 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 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 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"}]

6101206040523480156200001257600080fd5b5060405162002dfe38038062002dfe833981016040819052620000359162000504565b33836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000583565b83856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000583565b6001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001699190810190620005aa565b6040516020016200017c929190620005ea565b60405160208183030381529060405283866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000583565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200022f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002599190810190620005aa565b6040516020016200026c92919062000632565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000674565b6000620002f0848262000728565b506001620002ff838262000728565b5060ff81166080524660a0526200031562000382565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506001600160a01b03166101005262000872565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620003b69190620007f4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200043457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200046a57818101518382015260200162000450565b50506000910152565b600082601f8301126200048557600080fd5b81516001600160401b0380821115620004a257620004a262000437565b604051601f8301601f19908116603f01168101908282118183101715620004cd57620004cd62000437565b81604052838152866020858801011115620004e757600080fd5b620004fa8460208301602089016200044d565b9695505050505050565b6000806000606084860312156200051a57600080fd5b835162000527816200041e565b60208501519093506001600160401b03808211156200054557600080fd5b620005538783880162000473565b935060408601519150808211156200056a57600080fd5b50620005798682870162000473565b9150509250925092565b6000602082840312156200059657600080fd5b8151620005a3816200041e565b9392505050565b600060208284031215620005bd57600080fd5b81516001600160401b03811115620005d457600080fd5b620005e28482850162000473565b949350505050565b60008351620005fe8184602088016200044d565b6801020b931b0b234b0960bd1b9083019081528351620006268160098401602088016200044d565b01600901949350505050565b60008351620006468184602088016200044d565b6261726360e81b9083019081528351620006688160038401602088016200044d565b01600301949350505050565b6000602082840312156200068757600080fd5b815160ff81168114620005a357600080fd5b600181811c90821680620006ae57607f821691505b602082108103620006cf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200072357600081815260208120601f850160051c81016020861015620006fe5750805b601f850160051c820191505b818110156200071f578281556001016200070a565b5050505b505050565b81516001600160401b0381111562000744576200074462000437565b6200075c8162000755845462000699565b84620006d5565b602080601f8311600181146200079457600084156200077b5750858301515b600019600386901b1c1916600185901b1785556200071f565b600085815260208120601f198616915b82811015620007c557888601518255948401946001909101908401620007a4565b5085821015620007e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620008048162000699565b600182811680156200081f5760018114620008355762000866565b60ff198416875282151583028701945062000866565b8760005260208060002060005b858110156200085d5781548a82015290840190820162000842565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516124ad62000951600039600081816104680152818161062c0152818161094e015281816109df01528181610a6e01528181610afd01528181610cdb01528181610e2d015281816110c6015281816112b801528181611313015281816113a401528181611433015281816114c2015281816115f70152818161169b015281816119e201528181611ab001528181611ca801528181611d6f0152611e61015260008181610349015281816116c60152611adf01526000610900015260006108d00152600061030801526124ad6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108fd5761069f611ef6565b507f000000000000000000000000000000000000000000000000000000000000000090565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091611b4a917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000064a756e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026a72000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000420000000000000000000000000000000000000681565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000a46146108fd5761069f611ef6565b507f4f3c4db685e96ceaaaa213f676e2bcdbf56e68a06db7042f2734bd455a7e838d90565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc811660048301526000917f0000000000000000000000004200000000000000000000000000000000000006909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81166004830152600091611b4a917f000000000000000000000000420000000000000000000000000000000000000616906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033

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

000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000064a756e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026a72000000000000000000000000000000000000000000000000000000000000

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

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 4a756e696f720000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 6a72000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.