Contract 0xEe7403d3f2660928b2B39BAb80A820975520aFe0 10

 
Txn Hash Method
Block
From
To
Value
0x27d37417636c83ea2c1d2a24fc0d22750ae51486e83a40944e24afcf5a881853Withdraw1126589172023-11-25 12:50:1187 days 11 hrs ago0x91199826dbc27ae3033357d91b6fd3b7eb4d2149 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000340153180.007857
0xb95a0a360a6b230dd22be5256230e87407b9c8abbe0bff26259f5fb7d7524400Withdraw1117550262023-11-04 14:40:29108 days 9 hrs ago0xb4d754219c4d19128c94d759a4ef79427325fe51 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000352974540.008894078
0x9f95c64e10257a0a41a4fcf54b417c5cbe6cc84d411842ceb05f6b744df4d149Withdraw1117172532023-11-03 17:41:23109 days 6 hrs ago0xa60f492f5d52e0461b55d37ba4ce95c9d5eff62b IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000568804380.012534153
0x0b5c26af9b035a97b27b4a3728ee2a262d851f63094946184785f797b9c8c5c2Withdraw1117171422023-11-03 17:37:41109 days 7 hrs ago0x40a0086369bc0c4a8d8aaed28b327fb8a4f6cb45 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000677319420.015377325
0x982470cef048df594e282961309e6309976be71176c4be124892d92b1cd9564fWithdraw1117170712023-11-03 17:35:19109 days 7 hrs ago0xa9f51db4725f0eaf9d530bae8db0fd858d505547 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000756089420.023154339
0xfc725e8ffeeae668bffa8913d85eab8e80ad1c3acc57fd9b5fd4449635f42836Withdraw1093770112023-09-10 13:33:19163 days 11 hrs ago0x854ce16536cc41a0593a754f88a3eaf14eee9938 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.000017783140.000000098
0x037d13cd7dd28209fa4e6497ff8ceede749202ed6fe952772034d943e10bc13fWithdraw1082956492023-08-16 12:47:55188 days 11 hrs ago0x5a0dc15c9ececeded97c7b1121461edc623a0349 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000662034390.101588354
0x7dfe913dda5786df71f1994ee129c224104525138b8cc2ddbe09e4476086f2cbWithdraw1078428002023-08-06 1:12:57198 days 23 hrs ago0xbd1f7d88c76a86c60d41bddd4819fae404e7151e IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000252893710.000007617
0x799be419d71311c91ba65bec4490d37e4fc495dbbcf16ec6826d538dc1da9feaWithdraw1076346992023-08-01 5:36:15203 days 19 hrs ago0xdc0b62fd77e84ea91642699e302a140aa290a60b IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.000026763860.000022796
0xb98144356126f427e2d6df97deadb25391d945a5c65026b05718cbb4ccc61faaWithdraw1076303672023-08-01 3:11:51203 days 21 hrs ago0xcb7958ddf673aa8f21614346d3e1c46182a9454d IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000420931330.008757814
0xe11fd7927250032887eddd189b9aee10af49019be802ca7f4a6a893b4401e577Withdraw1074611592023-07-28 5:11:35207 days 19 hrs ago0x1a51b1df1a4dcfe1657073389e4f34b0c8be8301 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000299263170.000006532
0x9c398e093eda3378d3a5771ea8e34ba5890dcc68eb9d722a3fad9294aa835461Withdraw1074610882023-07-28 5:09:13207 days 19 hrs ago0x669950f1da362e4f7e5315f9680140aae1d0fc0b IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000287588690.00000012
0xef7c036e5d5f268f4c11c63e92a993bed54080feb62847d331f3f168efc0e55dWithdraw1074425682023-07-27 18:51:53208 days 5 hrs ago0x1695a8ba3f3313f9a9ed075df09c9fcc60840ba1 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0001159223720.127128534
0xb722eb286bc8e70ed751719cc3f16f6599f6328a4af8c8c392859635cf76239eWithdraw1074396092023-07-27 17:13:15208 days 7 hrs ago0x899b2d61a5943dd2452cbc9ff5d158c63a2275dd IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0001796657790.17548424
0x15f75528f138d32f52336a231f07b8a9449694525d0f284522f57dddaf1ac4b4Withdraw1074332212023-07-27 13:40:19208 days 10 hrs ago0xc0d3410439bdcda8f8364483b3bc9686b7e56639 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000843618520.210567442
0x86b0be60d5eb78d5aa0d27facea3c7b4676d0b452526d851c5664102d30da6dbWithdraw1074321862023-07-27 13:05:49208 days 11 hrs ago0x7c7df8a5bd86947d7eccca0019f77592912e2de4 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000767172470.229039098
0x101435c8d81306f38ece5929617f977caa9e1949f482451eea5678ec02beaf43Withdraw1074303822023-07-27 12:05:41208 days 12 hrs ago 0x66143d695baff44a3c8549bbdb16098d55674f9d IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000704143250.2200001
0xd2a01ed5a3f69841ed8de0ef5252f6520aa9b52426e3f06553a16184377b8d4aWithdraw1066792062023-07-10 2:46:29225 days 21 hrs ago0x669950f1da362e4f7e5315f9680140aae1d0fc0b IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000268823140.00005006
0x6db1de196c75740ad05b423431381aa951a86f54e025d3f57b253f028723cc8eDeposit1066618012023-07-09 17:06:19226 days 7 hrs ago0x1341df844780b66af4ccc98ae0f34be87eabe1d5 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000422699850.000000077
0x1f8d2d5b7b8c5ce2518c354860977c3a0ea79688f823fab9de79d65caf5f30b9Deposit1066490752023-07-09 10:02:07226 days 14 hrs ago0xbce49959edb00ebc509e6a9e11dce059582e7756 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000240095570.000000246
0x0dfb077dc55517ab53d6d38c7e4f587545b8f4e62dc69aba9274d5059bef8f26Withdraw1066257662023-07-08 21:05:09227 days 3 hrs ago0x158deb9f418f6800c57808ebcb5506517361eefc IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000235727410.000000069
0x571607bd8b2a4f6f7c47748c59fe0b53a4d5d1c53d542bc785344ef50e442c54Deposit1066021992023-07-08 7:59:35227 days 16 hrs ago0xa60f492f5d52e0461b55d37ba4ce95c9d5eff62b IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000240419690.000000097
0x88b79b384289860c6933a251c4c771bce2ad92b3ece7e579e7fd17dfc74e6e16Deposit1065918502023-07-08 2:14:37227 days 22 hrs ago0x7c7df8a5bd86947d7eccca0019f77592912e2de4 IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000291151380.000000095
0xc3b00cc6968650b63c0190351c6ca6e5845c325b8f985a9bc5bbfe5a99fe573dWithdraw1065890342023-07-08 0:40:45227 days 23 hrs ago0x27e9f3d1354a735a37a564fd2a9dd905c944a08e IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.000037881350.00000023
0x0dc7c79699c819561d67d2325136de585ffa161a69b2b5bfb02784a8d7cb5994Deposit1065889332023-07-08 0:37:23228 days 2 mins ago0x27e9f3d1354a735a37a564fd2a9dd905c944a08e IN  0xee7403d3f2660928b2b39bab80a820975520afe00 ETH0.0000362216190.000000245
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe11fd7927250032887eddd189b9aee10af49019be802ca7f4a6a893b4401e5771074611592023-07-28 5:11:35207 days 19 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xe11fd7927250032887eddd189b9aee10af49019be802ca7f4a6a893b4401e5771074611592023-07-28 5:11:35207 days 19 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x9c398e093eda3378d3a5771ea8e34ba5890dcc68eb9d722a3fad9294aa8354611074610882023-07-28 5:09:13207 days 19 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x9c398e093eda3378d3a5771ea8e34ba5890dcc68eb9d722a3fad9294aa8354611074610882023-07-28 5:09:13207 days 19 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xef7c036e5d5f268f4c11c63e92a993bed54080feb62847d331f3f168efc0e55d1074425682023-07-27 18:51:53208 days 5 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xef7c036e5d5f268f4c11c63e92a993bed54080feb62847d331f3f168efc0e55d1074425682023-07-27 18:51:53208 days 5 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xb722eb286bc8e70ed751719cc3f16f6599f6328a4af8c8c392859635cf76239e1074396092023-07-27 17:13:15208 days 7 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xb722eb286bc8e70ed751719cc3f16f6599f6328a4af8c8c392859635cf76239e1074396092023-07-27 17:13:15208 days 7 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x15f75528f138d32f52336a231f07b8a9449694525d0f284522f57dddaf1ac4b41074332212023-07-27 13:40:19208 days 10 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x15f75528f138d32f52336a231f07b8a9449694525d0f284522f57dddaf1ac4b41074332212023-07-27 13:40:19208 days 10 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x86b0be60d5eb78d5aa0d27facea3c7b4676d0b452526d851c5664102d30da6db1074321862023-07-27 13:05:49208 days 11 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x86b0be60d5eb78d5aa0d27facea3c7b4676d0b452526d851c5664102d30da6db1074321862023-07-27 13:05:49208 days 11 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x101435c8d81306f38ece5929617f977caa9e1949f482451eea5678ec02beaf431074303822023-07-27 12:05:41208 days 12 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x101435c8d81306f38ece5929617f977caa9e1949f482451eea5678ec02beaf431074303822023-07-27 12:05:41208 days 12 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x0087e72187a4e798f1e94d58b0818ffc7428813cf6f13e69b3102da151a208631073496982023-07-25 15:16:13210 days 9 hrs ago 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d 0xee7403d3f2660928b2b39bab80a820975520afe00 ETH
0x0087e72187a4e798f1e94d58b0818ffc7428813cf6f13e69b3102da151a208631073496982023-07-25 15:16:13210 days 9 hrs ago 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d 0xee7403d3f2660928b2b39bab80a820975520afe00 ETH
0xd2a01ed5a3f69841ed8de0ef5252f6520aa9b52426e3f06553a16184377b8d4a1066792062023-07-10 2:46:29225 days 21 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0xd2a01ed5a3f69841ed8de0ef5252f6520aa9b52426e3f06553a16184377b8d4a1066792062023-07-10 2:46:29225 days 21 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x6db1de196c75740ad05b423431381aa951a86f54e025d3f57b253f028723cc8e1066618012023-07-09 17:06:19226 days 7 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x6db1de196c75740ad05b423431381aa951a86f54e025d3f57b253f028723cc8e1066618012023-07-09 17:06:19226 days 7 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x1f8d2d5b7b8c5ce2518c354860977c3a0ea79688f823fab9de79d65caf5f30b91066490752023-07-09 10:02:07226 days 14 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x1f8d2d5b7b8c5ce2518c354860977c3a0ea79688f823fab9de79d65caf5f30b91066490752023-07-09 10:02:07226 days 14 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x0dfb077dc55517ab53d6d38c7e4f587545b8f4e62dc69aba9274d5059bef8f261066257662023-07-08 21:05:09227 days 3 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x0dfb077dc55517ab53d6d38c7e4f587545b8f4e62dc69aba9274d5059bef8f261066257662023-07-08 21:05:09227 days 3 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 ETH
0x571607bd8b2a4f6f7c47748c59fe0b53a4d5d1c53d542bc785344ef50e442c541066021992023-07-08 7:59:35227 days 16 hrs ago 0xee7403d3f2660928b2b39bab80a820975520afe0 0x9aa024d3fd962701ed17f76c17cab22d3dc9d92d0 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"}]

6101206040523480156200001257600080fd5b5060405162002dfe38038062002dfe833981016040819052620000359162000504565b33836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000583565b83856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000583565b6001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001699190810190620005aa565b6040516020016200017c929190620005ea565b60405160208183030381529060405283866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000583565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200022f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002599190810190620005aa565b6040516020016200026c92919062000632565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000674565b6000620002f0848262000728565b506001620002ff838262000728565b5060ff81166080524660a0526200031562000382565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506001600160a01b03166101005262000872565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620003b69190620007f4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200043457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200046a57818101518382015260200162000450565b50506000910152565b600082601f8301126200048557600080fd5b81516001600160401b0380821115620004a257620004a262000437565b604051601f8301601f19908116603f01168101908282118183101715620004cd57620004cd62000437565b81604052838152866020858801011115620004e757600080fd5b620004fa8460208301602089016200044d565b9695505050505050565b6000806000606084860312156200051a57600080fd5b835162000527816200041e565b60208501519093506001600160401b03808211156200054557600080fd5b620005538783880162000473565b935060408601519150808211156200056a57600080fd5b50620005798682870162000473565b9150509250925092565b6000602082840312156200059657600080fd5b8151620005a3816200041e565b9392505050565b600060208284031215620005bd57600080fd5b81516001600160401b03811115620005d457600080fd5b620005e28482850162000473565b949350505050565b60008351620005fe8184602088016200044d565b6801020b931b0b234b0960bd1b9083019081528351620006268160098401602088016200044d565b01600901949350505050565b60008351620006468184602088016200044d565b6261726360e81b9083019081528351620006688160038401602088016200044d565b01600301949350505050565b6000602082840312156200068757600080fd5b815160ff81168114620005a357600080fd5b600181811c90821680620006ae57607f821691505b602082108103620006cf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200072357600081815260208120601f850160051c81016020861015620006fe5750805b601f850160051c820191505b818110156200071f578281556001016200070a565b5050505b505050565b81516001600160401b0381111562000744576200074462000437565b6200075c8162000755845462000699565b84620006d5565b602080601f8311600181146200079457600084156200077b5750858301515b600019600386901b1c1916600185901b1785556200071f565b600085815260208120601f198616915b82811015620007c557888601518255948401946001909101908401620007a4565b5085821015620007e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620008048162000699565b600182811680156200081f5760018114620008355762000866565b60ff198416875282151583028701945062000866565b8760005260208060002060005b858110156200085d5781548a82015290840190820162000842565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516124ad62000951600039600081816104680152818161062c0152818161094e015281816109df01528181610a6e01528181610afd01528181610cdb01528181610e2d015281816110c6015281816112b801528181611313015281816113a401528181611433015281816114c2015281816115f70152818161169b015281816119e201528181611ab001528181611ca801528181611d6f0152611e61015260008181610349015281816116c60152611adf01526000610900015260006108d00152600061030801526124ad6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108fd5761069f611ef6565b507f000000000000000000000000000000000000000000000000000000000000000090565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091611b4a917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c634300081100330000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f0000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160781565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d81565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000a46146108fd5761069f611ef6565b507f1c04418aed113aadfce00b1faec23ca6318447b084d26f3ebcb5a65c11b3500d90565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d16906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d16906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d811660048301526000917f0000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d81166004830152600091611b4a917f0000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160716906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d1614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d1614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d6001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033

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

0000000000000000000000009aa024d3fd962701ed17f76c17cab22d3dc9d92d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

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

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


Block Transaction Difficulty Gas Used Reward
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.