Contract 0x68847530E93789Cc2e602130f6B53C55E1159Bb9 10

 
Txn Hash Method
Block
From
To
Value
0xb7bd3c2a2fcc45950b03254d563b9aed3c8e38e8670e31f27644a4ce0116f958Withdraw1095471122023-09-14 12:03:21159 days 13 hrs ago0x018c8a81cb02ca1a327baefd400f75f57ea57ba2 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000221870620.000308
0x96eb7cb593764e75b79554bfaefaa8e966e79b42eae5b4b64c3d9805eb56f709Withdraw1076443032023-08-01 10:56:23203 days 15 hrs ago0x11145fc22221d317784bd5fdc5dd429354aa0d9c IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000421151460.000007612
0x61d3f7205e2c5d7cc75c23d69ecc898c3d25b146ab0d9380a3a13dc855e61406Withdraw1076384152023-08-01 7:40:07203 days 18 hrs ago0xa727885f81b1a59aca992a97cab06b531366fe73 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000364429770.002811674
0x06f6c103eab654916fa8438f1642a2624582ce5230c77507612fed9a31452478Withdraw1075564682023-07-30 10:08:33205 days 15 hrs ago0x544a40955ba1c7e56e161a59e1319e3313c25251 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000334674390.000008893
0x0650126b2150553b6a9a5a39864ccd5046a899afec03013ba882639d66e6a0feWithdraw1074762212023-07-28 13:33:39207 days 12 hrs ago0x9bb0819842d82e6f4436bbd2e2f7d1910929a882 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000750822620.000000206
0x114e85e345b930cdf0ca3d107661d7c4a586b4e688c757404eb81c1f9884cf67Withdraw1074611272023-07-28 5:10:31207 days 20 hrs ago0x669950f1da362e4f7e5315f9680140aae1d0fc0b IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000291803330.00000018
0x25814785f6bf1c5a8442fd23008ae357b1f1055962a79f5f18ca6d1dcb9fc058Withdraw1074474592023-07-27 21:34:55208 days 4 hrs ago0x99b40b9b57c370aca09de4f58d26e2dec9086e1b IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000520889630.0120001
0x97e7321657301c153892e0bd9abc48182fcff39feefc548c61dd10f1200177a6Withdraw1074474372023-07-27 21:34:11208 days 4 hrs ago0x7b6912eba11626c97638d72a54009fc9f28d43e0 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000531524440.0125001
0xc0aae77d9f1248b7e379777a88e2bb7a60d1577e08598c2da9e517b339cd4c63Withdraw1074449112023-07-27 20:09:59208 days 5 hrs ago0xb3a898e8e48ed3fb1b6e147448de0f84be977876 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000959968960.000067539
0xf940b5e23fbc8753a0725404d3b780bde0e48cee98c377b169dce851d4098f3fWithdraw1074396002023-07-27 17:12:57208 days 8 hrs ago0x899b2d61a5943dd2452cbc9ff5d158c63a2275dd IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0001907047750.189975982
0xb4fffa4646d3a4c91bfeebdfe9644b95a57caed8bf3672ff126536fd15ce5e18Withdraw1074332872023-07-27 13:42:31208 days 12 hrs ago0xc0d3410439bdcda8f8364483b3bc9686b7e56639 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000879241610.220555267
0x5ad9f3f2e3ad8a3ac591fb4f2525ba4a97bcc27b0d0cbb613e15f09b020ed4c4Withdraw1066817322023-07-10 4:10:41225 days 21 hrs ago0x8f9be4310f9abb0e5843cc6363908c9b01dfeb3f IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000297997610.0001
0x05731f82cf2e7f4b98941c665346e866d945f80448e2eab5ada93ec7efb48cd5Withdraw1066791972023-07-10 2:46:11225 days 23 hrs ago0x669950f1da362e4f7e5315f9680140aae1d0fc0b IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000253801790.000050059
0x0aa75485f55b814194c2a6a1068d72ce5de77254b447990250cc8d6c0ffa697cDeposit1063883322023-07-03 9:10:41232 days 16 hrs ago0x52025bbe186f35edb5c02361f0bda4b5636ba6e9 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000288425810.00000012
0xe7a53ca90e6711b2816aa8cd86ed3235e3caca4bb3bd807ac4c4fbc353963ed1Withdraw1063623382023-07-02 18:44:13233 days 7 hrs ago 0xecd02810db92ff027ea1b0850d46bda963676d74 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000252332640.000000068
0x8862925e41bb48ab69ec4766d98e0aa8105b1ecad0f76ce69ae6cbe319952b98Withdraw1063069362023-07-01 11:57:29234 days 14 hrs ago0x01327ca699949ca90b9dc330ea53ce299bf71795 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000288723410.000006537
0x88f8094fedcc49a4a4934f75403ba1d44f3de01f4287675d63cc2e6a3f411632Deposit1060444742023-06-25 10:08:45240 days 15 hrs ago 0xecd02810db92ff027ea1b0850d46bda963676d74 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.000021418490.000000081
0x59a1cbdcc03e977d7a558c9f72ba40f95f193dee497b26356bd5745180209416Deposit1060154362023-06-24 18:00:49241 days 7 hrs ago0x43ea0ffc209b0776c12786280322f4b096585c66 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000286493560.000000141
0xa6a6cd9b60d9fdd6db9703634107ab24ecf4ae044be6aa5b8019af13d0fa1031Deposit1058349462023-06-20 13:44:29245 days 12 hrs ago0xa727885f81b1a59aca992a97cab06b531366fe73 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000284471850.000000105
0x4cc9971615aa0df076333d424877b1b9ad999c517ee2921aec90656c755ccef6Withdraw1056751122023-06-16 20:56:41249 days 5 hrs ago0x99b40b9b57c370aca09de4f58d26e2dec9086e1b IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000288642040.0001
0xd342d34dbbb87460840e67d84da462ad62f2fd260b98570f144e0ad558f6327cWithdraw1056750082023-06-16 20:53:13249 days 5 hrs ago0x7b6912eba11626c97638d72a54009fc9f28d43e0 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000278484920.0001
0x5bab7e9a04eeed380989cf191bd7138ecd30ae49b749e9ef0291bf5704d2faedWithdraw1055675592023-06-14 9:11:35251 days 16 hrs ago 0x2068d14ee50772dd6e89c6f64f32adad0cc936ef IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000332717380.025445048
0xe16b637b668ad67a118334b2c69f6fec88fdaa9c428c97ae53ac079937dc4579Withdraw1055593982023-06-14 4:39:33251 days 21 hrs ago0x83529a70fa70ddc5ecf8994bdb7774874e39362c IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000291324910.000000062
0xd6d74ef33664aacff7a05c3c8dfd2aaf720226819d4f963dcb6451e779790116Withdraw1054716732023-06-12 3:55:23253 days 22 hrs ago0x03894d4ac41dd6c4c2f524ed4417c90fa46972c6 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.0000325056670.000004123
0x8251c3f191c5c63b13ff24b45d4fc4c01a35c94ff557f5d1590d427b92abfd0cWithdraw1054014932023-06-10 12:56:03255 days 13 hrs ago0xb71d05cf5cdf7a9b15b20b9aab5e91332c271c96 IN  0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH0.000036671030.000000224
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x06f6c103eab654916fa8438f1642a2624582ce5230c77507612fed9a314524781075564682023-07-30 10:08:33205 days 15 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x06f6c103eab654916fa8438f1642a2624582ce5230c77507612fed9a314524781075564682023-07-30 10:08:33205 days 15 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x0650126b2150553b6a9a5a39864ccd5046a899afec03013ba882639d66e6a0fe1074762212023-07-28 13:33:39207 days 12 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x0650126b2150553b6a9a5a39864ccd5046a899afec03013ba882639d66e6a0fe1074762212023-07-28 13:33:39207 days 12 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x114e85e345b930cdf0ca3d107661d7c4a586b4e688c757404eb81c1f9884cf671074611272023-07-28 5:10:31207 days 20 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x114e85e345b930cdf0ca3d107661d7c4a586b4e688c757404eb81c1f9884cf671074611272023-07-28 5:10:31207 days 20 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x25814785f6bf1c5a8442fd23008ae357b1f1055962a79f5f18ca6d1dcb9fc0581074474592023-07-27 21:34:55208 days 4 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x25814785f6bf1c5a8442fd23008ae357b1f1055962a79f5f18ca6d1dcb9fc0581074474592023-07-27 21:34:55208 days 4 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x97e7321657301c153892e0bd9abc48182fcff39feefc548c61dd10f1200177a61074474372023-07-27 21:34:11208 days 4 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x97e7321657301c153892e0bd9abc48182fcff39feefc548c61dd10f1200177a61074474372023-07-27 21:34:11208 days 4 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xc0aae77d9f1248b7e379777a88e2bb7a60d1577e08598c2da9e517b339cd4c631074449112023-07-27 20:09:59208 days 5 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xc0aae77d9f1248b7e379777a88e2bb7a60d1577e08598c2da9e517b339cd4c631074449112023-07-27 20:09:59208 days 5 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xf940b5e23fbc8753a0725404d3b780bde0e48cee98c377b169dce851d4098f3f1074396002023-07-27 17:12:57208 days 8 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xf940b5e23fbc8753a0725404d3b780bde0e48cee98c377b169dce851d4098f3f1074396002023-07-27 17:12:57208 days 8 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xb4fffa4646d3a4c91bfeebdfe9644b95a57caed8bf3672ff126536fd15ce5e181074332872023-07-27 13:42:31208 days 12 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xb4fffa4646d3a4c91bfeebdfe9644b95a57caed8bf3672ff126536fd15ce5e181074332872023-07-27 13:42:31208 days 12 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xc346e7a7b047278952307ab6960e884ab39a2342e3ddef73f17012c791be65b61073497062023-07-25 15:16:29210 days 10 hrs ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH
0xc346e7a7b047278952307ab6960e884ab39a2342e3ddef73f17012c791be65b61073497062023-07-25 15:16:29210 days 10 hrs ago 0xd417c28af20884088f600e724441a3bab38b22cc 0x68847530e93789cc2e602130f6b53c55e1159bb90 ETH
0x5ad9f3f2e3ad8a3ac591fb4f2525ba4a97bcc27b0d0cbb613e15f09b020ed4c41066817322023-07-10 4:10:41225 days 21 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x5ad9f3f2e3ad8a3ac591fb4f2525ba4a97bcc27b0d0cbb613e15f09b020ed4c41066817322023-07-10 4:10:41225 days 21 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x05731f82cf2e7f4b98941c665346e866d945f80448e2eab5ada93ec7efb48cd51066791972023-07-10 2:46:11225 days 23 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x05731f82cf2e7f4b98941c665346e866d945f80448e2eab5ada93ec7efb48cd51066791972023-07-10 2:46:11225 days 23 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x0aa75485f55b814194c2a6a1068d72ce5de77254b447990250cc8d6c0ffa697c1063883322023-07-03 9:10:41232 days 16 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0x0aa75485f55b814194c2a6a1068d72ce5de77254b447990250cc8d6c0ffa697c1063883322023-07-03 9:10:41232 days 16 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 ETH
0xe7a53ca90e6711b2816aa8cd86ed3235e3caca4bb3bd807ac4c4fbc353963ed11063623382023-07-02 18:44:13233 days 7 hrs ago 0x68847530e93789cc2e602130f6b53c55e1159bb9 0xd417c28af20884088f600e724441a3bab38b22cc0 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"}]

6101206040523480156200001257600080fd5b5060405162002dfe38038062002dfe833981016040819052620000359162000504565b33836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000583565b83856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000583565b6001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001699190810190620005aa565b6040516020016200017c929190620005ea565b60405160208183030381529060405283866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000583565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200022f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002599190810190620005aa565b6040516020016200026c92919062000632565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000674565b6000620002f0848262000728565b506001620002ff838262000728565b5060ff81166080524660a0526200031562000382565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050506001600160a01b03166101005262000872565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620003b69190620007f4565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200043457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200046a57818101518382015260200162000450565b50506000910152565b600082601f8301126200048557600080fd5b81516001600160401b0380821115620004a257620004a262000437565b604051601f8301601f19908116603f01168101908282118183101715620004cd57620004cd62000437565b81604052838152866020858801011115620004e757600080fd5b620004fa8460208301602089016200044d565b9695505050505050565b6000806000606084860312156200051a57600080fd5b835162000527816200041e565b60208501519093506001600160401b03808211156200054557600080fd5b620005538783880162000473565b935060408601519150808211156200056a57600080fd5b50620005798682870162000473565b9150509250925092565b6000602082840312156200059657600080fd5b8151620005a3816200041e565b9392505050565b600060208284031215620005bd57600080fd5b81516001600160401b03811115620005d457600080fd5b620005e28482850162000473565b949350505050565b60008351620005fe8184602088016200044d565b6801020b931b0b234b0960bd1b9083019081528351620006268160098401602088016200044d565b01600901949350505050565b60008351620006468184602088016200044d565b6261726360e81b9083019081528351620006688160038401602088016200044d565b01600301949350505050565b6000602082840312156200068757600080fd5b815160ff81168114620005a357600080fd5b600181811c90821680620006ae57607f821691505b602082108103620006cf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200072357600081815260208120601f850160051c81016020861015620006fe5750805b601f850160051c820191505b818110156200071f578281556001016200070a565b5050505b505050565b81516001600160401b0381111562000744576200074462000437565b6200075c8162000755845462000699565b84620006d5565b602080601f8311600181146200079457600084156200077b5750858301515b600019600386901b1c1916600185901b1785556200071f565b600085815260208120601f198616915b82811015620007c557888601518255948401946001909101908401620007a4565b5085821015620007e45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620008048162000699565b600182811680156200081f5760018114620008355762000866565b60ff198416875282151583028701945062000866565b8760005260208060002060005b858110156200085d5781548a82015290840190820162000842565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516124ad62000951600039600081816104680152818161062c0152818161094e015281816109df01528181610a6e01528181610afd01528181610cdb01528181610e2d015281816110c6015281816112b801528181611313015281816113a401528181611433015281816114c2015281816115f70152818161169b015281816119e201528181611ab001528181611ca801528181611d6f0152611e61015260008181610349015281816116c60152611adf01526000610900015260006108d00152600061030801526124ad6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000000000000000000000000000000000000000000081565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146108fd5761069f611ef6565b507f000000000000000000000000000000000000000000000000000000000000000090565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000000000000000000000000000000000000000000016906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600091611b4a917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063a59a997311610151578063d505accf116100c3578063ed10e33c11610087578063ed10e33c146105c3578063ef8b30f7146105cb578063f2fde38b146105de578063f7485fdc146105f1578063f83d08ba14610604578063f97e21151461060c57600080fd5b8063d505accf14610549578063d905777e1461055e578063dd62ed3e14610571578063df3930751461059c578063e6b3b43d146105b057600080fd5b8063ba08765211610115578063ba087652146104d6578063c63d75b6146104e9578063c6e6f592146104fc578063cc6d205a1461050f578063ce96cb7714610522578063cf3090121461053557600080fd5b8063a59a997314610463578063a9059cbb1461048a578063ae6f13631461049d578063b3d7f6b9146104b0578063b460af94146104c357600080fd5b8063402d267d116101ea57806370a08231116101ae57806370a08231146103e25780637ecebe00146104025780638da5cb5b14610422578063923170641461043557806394bf804d1461044857806395d89b411461045b57600080fd5b8063402d267d146103835780634cdad50614610396578063589e65a6146103a95780635ae1dff6146103bc5780636e553f65146103cf57600080fd5b806318160ddd1161023157806318160ddd146102e757806323b872dd146102f0578063313ce567146103035780633644e5151461033c57806338d52e0f1461034457600080fd5b806301e1d1141461026e57806306fdde031461028957806307a2d13a1461029e578063095ea7b3146102b15780630a28a477146102d4575b600080fd5b610276610614565b6040519081526020015b60405180910390f35b6102916106a4565b604051610280919061204c565b6102766102ac36600461209a565b610732565b6102c46102bf3660046120cf565b61075f565b6040519015158152602001610280565b6102766102e236600461209a565b6107cc565b61027660025481565b6102c46102fe3660046120f9565b6107ec565b61032a7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610280565b6102766108cc565b61036b7f000000000000000000000000420000000000000000000000000000000000000681565b6040516001600160a01b039091168152602001610280565b610276610391366004612135565b610922565b6102766103a436600461209a565b610be4565b6102766103b736600461209a565b610bef565b6102766103ca36600461209a565b610c06565b6102766103dd366004612150565b610c11565b6102766103f0366004612135565b60036020526000908152604090205481565b610276610410366004612135565b60056020526000908152604090205481565b60065461036b906001600160a01b031681565b61027661044336600461209a565b610d96565b610276610456366004612150565b610dae565b610291610ede565b61036b7f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81565b6102c46104983660046120cf565b610eeb565b6102766104ab36600461209a565b610f51565b6102766104be36600461209a565b610f5c565b6102766104d136600461217c565b610f7b565b6102766104e436600461217c565b61112a565b6102766104f7366004612135565b6112e7565b61027661050a36600461209a565b611593565b61027661051d36600461209a565b6115b3565b610276610530366004612135565b6115cb565b6006546102c490600160a01b900460ff1681565b61055c6105573660046121b8565b611772565b005b61027661056c366004612135565b6119b6565b61027661057f36600461222b565b600460209081526000928352604080842090915290825290205481565b6006546102c490600160a81b900460ff1681565b6102766105be36600461209a565b611b59565b61055c611b70565b6102766105d936600461209a565b611bfd565b61055c6105ec366004612135565b611c08565b61055c6105ff366004612266565b611c9d565b61055c611d64565b610276611e49565b604051633c4750df60e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690633c4750df90602401602060405180830381865afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190612283565b905090565b600080546106b19061229c565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061229c565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b505050505081565b600254600090801561075657610751610749610614565b849083611eb2565b610758565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107ba9086815260200190565b60405180910390a35060015b92915050565b600254600090801561075657610751816107e4610614565b859190611ed0565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146108485761082383826122ec565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906108709084906122ec565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612458833981519152906108b99087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000a46146108fd5761069f611ef6565b507f0167a377f165e5159c00f1a326a40a2a25f2a48fcd6f77da8d48584a98fea04390565b600654600090600160a01b900460ff16806109465750600654600160a81b900460ff165b806109ce57507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906122ff565b156109db57506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190612283565b90508215610bbd5782610b908284612345565b1115610ba157506000949350505050565b80610bac83856122ec565b610bb691906122ec565b9350610bdc565b80610bcf836001600160801b036122ec565b610bd991906122ec565b93505b505050919050565b60006107c682610732565b600254600090801561075657610751610749611e49565b60006107c682610bef565b600654600090600160a01b900460ff1615610c475760405162461bcd60e51b8152600401610c3e90612358565b60405180910390fd5b600654600160a81b900460ff1615610c715760405162461bcd60e51b8152600401610c3e90612381565b610c7a83610f51565b905080600003610cbf5760405162461bcd60e51b815260206004820152601060248201526f545f443a205a45524f5f53484152455360801b6044820152606401610c3e565b6040516309b43f3560e31b8152600481018490523360248201527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b50505050610d498282611f90565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b600254600090801561075657610751816107e4611e49565b600654600090600160a01b900460ff1615610ddb5760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610e055760405162461bcd60e51b8152600401610c3e90612381565b610e0e83611b59565b6040516309b43f3560e31b8152600481018290523360248201529091507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031690634da1f9a890604401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050610e9b8284611f90565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610d88565b600180546106b19061229c565b33600090815260036020526040812080548391908390610f0c9084906122ec565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612458833981519152906107ba9086815260200190565b60006107c6826115b3565b600254600090801561075657610751610f73610614565b849083611ed0565b600654600090600160a01b900460ff1615610fa85760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff1615610fd25760405162461bcd60e51b8152600401610c3e90612381565b610fdb84610d96565b9050336001600160a01b0383161461104b576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146110495761102482826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6110558282611fea565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018590526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044015b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b505050509392505050565b600654600090600160a01b900460ff16156111575760405162461bcd60e51b8152600401610c3e90612358565b600654600160a81b900460ff16156111815760405162461bcd60e51b8152600401610c3e90612381565b336001600160a01b038316146111ef576001600160a01b038216600090815260046020908152604080832033845290915290205460001981146111ed576111c885826122ec565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b6111f884610c06565b90508060000361123d5760405162461bcd60e51b815260206004820152601060248201526f545f523a205a45524f5f41535345545360801b6044820152606401610c3e565b6112478285611fea565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a460405163062c9b0f60e41b8152600481018290526001600160a01b0384811660248301527f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc16906362c9b0f0906044016110f1565b600654600090600160a01b900460ff168061130b5750600654600160a81b900460ff165b8061139357507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03166302befd246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139391906122ff565b156113a057506000919050565b60007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638f770ad06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611424919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316638618d38d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b3919061231c565b6001600160801b0316905060007f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b031663e11a0b836040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190612283565b9050821561157e57826115558284612345565b111561156657506000949350505050565b610bb68161157484866122ec565b61050a91906122ec565b610bd981611574846001600160801b036122ec565b600254600090801561075657610751816115ab610614565b859190611eb2565b600254600090801561075657610751816115ab611e49565b600654600090600160a01b900460ff16806115ef5750600654600160a81b900460ff165b8061167757507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167791906122ff565b1561168457506000919050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc811660048301526000917f0000000000000000000000004200000000000000000000000000000000000006909116906370a0823190602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612283565b6001600160a01b0384166000908152600360205260408120549192509061175990610732565b9050808210611768578061176a565b815b949350505050565b428410156117c25760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610c3e565b600060016117ce6108cc565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156118da573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119105750876001600160a01b0316816001600160a01b0316145b61194d5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610c3e565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600654600090600160a01b900460ff16806119da5750600654600160a81b900460ff165b80611a6257507f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b0316632f3ffb9f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6291906122ff565b15611a6f57506000919050565b6001600160a01b03821660009081526003602052604081205490819003611a995750600092915050565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc81166004830152600091611b4a917f000000000000000000000000420000000000000000000000000000000000000616906370a0823190602401602060405180830381865afa158015611b26573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190612283565b9050818110610758578161176a565b600254600090801561075657610751610f73611e49565b6006546001600160a01b03163314611bb95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b6006805460ff60a01b19169055604051600081527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a2906020015b60405180910390a1565b60006107c682611593565b6006546001600160a01b03163314611c515760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610c3e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611d0c5760405162461bcd60e51b81526020600482015260146024820152731517d4d052540e8815539055551213d49256915160621b6044820152606401610c3e565b60068054821515600160a81b0260ff60a81b199091161790556040517f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990611d5990831515815260200190565b60405180910390a150565b336001600160a01b037f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc1614611dd05760405162461bcd60e51b81526020600482015260116024820152701517d30e8815539055551213d492569151607a1b6044820152606401610c3e565b6006805461ffff60a01b1916600160a01b179055604051600181527f504bad97b429ba8801a2ae8e780de5f2f9a21c088094829ab3054a0aa66c00a29060200160405180910390a1604051600081527f2f388b8e6fd242c819646c510b0238be0d5b20654533cf7467a4231a865d01e990602001611bf3565b60405163894bacc960e01b81523060048201526000907f000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc6001600160a01b03169063894bacc9906024016020604051808303816000875af115801561067b573d6000803e3d6000fd5b6000826000190484118302158202611ec957600080fd5b5091020490565b6000826000190484118302158202611ee757600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611f2891906123b8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254611fa29190612345565b90915550506001600160a01b03821660008181526003602090815260408083208054860190555184815260008051602061245883398151915291015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906120129084906122ec565b90915550506002805482900390556040518181526000906001600160a01b0384169060008051602061245883398151915290602001611fde565b600060208083528351808285015260005b818110156120795785810183015185820160400152820161205d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b60006020828403121561214757600080fd5b610758826120b3565b6000806040838503121561216357600080fd5b82359150612173602084016120b3565b90509250929050565b60008060006060848603121561219157600080fd5b833592506121a1602085016120b3565b91506121af604085016120b3565b90509250925092565b600080600080600080600060e0888a0312156121d357600080fd5b6121dc886120b3565b96506121ea602089016120b3565b95506040880135945060608801359350608088013560ff8116811461220e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561223e57600080fd5b612247836120b3565b9150612173602084016120b3565b801515811461226357600080fd5b50565b60006020828403121561227857600080fd5b813561075881612255565b60006020828403121561229557600080fd5b5051919050565b600181811c908216806122b057607f821691505b6020821081036122d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156107c6576107c66122d6565b60006020828403121561231157600080fd5b815161075881612255565b60006020828403121561232e57600080fd5b81516001600160801b038116811461075857600080fd5b808201808211156107c6576107c66122d6565b6020808252600f908201526e1514905390d2114e881313d0d2d151608a1b604082015260600190565b6020808252601c908201527f5452414e4348453a2041554354494f4e20494e2050524f475245535300000000604082015260600190565b600080835481600182811c9150808316806123d457607f831692505b602080841082036123f357634e487b7160e01b86526022600452602486fd5b818015612407576001811461241c57612449565b60ff1986168952841515850289019650612449565b60008a81526020902060005b868110156124415781548b820152908501908301612428565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207851b00168656f52f5e369321ee53ed911a4d89bddc8ea019486aa16702ce50b64736f6c63430008110033

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

000000000000000000000000d417c28af20884088f600e724441a3bab38b22cc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000653656e696f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027372000000000000000000000000000000000000000000000000000000000000

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

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


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