Contract 0x6be861aa87009331bf62e22d418ab666e88b1354

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x35132caff6b94b3691e63084d287bda48a4b0f03502d4cb97ef995794ab2cd35Claim Asset88322602022-03-29 13:58:10182 days 21 hrs ago0x6beb9286ac85d7cf638d86286a9ae098b33688e2 IN  Jones DAO: ETH Vault0 ETH0.000189895652 ETH
0x18212bd321ef4f85b2f7b5b74fa25c4c2447e7d75e11e19ba1d5068ced7a5c4aClaim Asset88308372022-03-29 13:34:13182 days 22 hrs ago0xebb6cc30eb759fa9bab9c76904a67509e98550f2 IN  Jones DAO: ETH Vault0 ETH0.000189902492 ETH
0xa85640b52902506dc1d04394286dc00c9b5875c53b47bba6f484a843072039ceClaim Asset88254112022-03-29 11:40:06183 days 14 mins ago0x67fbfa7501eac60dbfe86effb8ca14648b9c01d9 IN  Jones DAO: ETH Vault0 ETH0.00019258601 ETH
0x599066742bbf6f443c4f20a3e19c7ee72eef6de79c9bdd4e4ee622dda99866a3Deposit Asset88237342022-03-29 10:57:54183 days 56 mins ago0x1d5ff0ad19d3e766f0ccb11c85c20ba537412cd2 IN  Jones DAO: ETH Vault1.4 ETH0.000214770156 ETH
0xb33ee741cea1285884d5a26871d2649f427348146d66946f5c33fae912f513e6Deposit Asset88217882022-03-29 10:03:16183 days 1 hr ago0x27dd96a81f9828406cf69b64cf8bf05f3968d8b6 IN  Jones DAO: ETH Vault0.075 ETH0.000218912241 ETH
0x53bb6243b132be4a4a36c9894e6263166dcdd1508497585e402fc25f522935c9Claim Asset88167672022-03-29 8:13:12183 days 3 hrs ago0x4092696f322bcaa2dbe83423b793cdb8647d6722 IN  Jones DAO: ETH Vault0 ETH0.000198371398 ETH
0xf157795de6a225d697bd0b0612749b0639f608d7abd4e7711b8e43a8a9174ff5Deposit Asset88160672022-03-29 7:58:05183 days 3 hrs ago0x317ea3f40890987e177f82a7a9962247e2584ac5 IN  Jones DAO: ETH Vault5.052105 ETH0.000224385794 ETH
0x273f8ae52e16d42c4b5005a3486815bf56848d73429759e0e3e787387bc3b56fDeposit Asset88145132022-03-29 7:22:57183 days 4 hrs ago0xe5ef1857766e68119dfe9cf6429aa9b74631a418 IN  Jones DAO: ETH Vault0.032 ETH0.000224971256 ETH
0xc0319e380b0d1fbe7aba966ddbed73aebcc757ae67d59f9cd10d46043170eb8aClaim Asset88144592022-03-29 7:22:33183 days 4 hrs ago0x21b3ca06d377457b4002a73dfb2a530867dceef5 IN  Jones DAO: ETH Vault0 ETH0.000202297474 ETH
0x3ead8fada153bac8af995544b038a3894d0e084e383d11e3aefe9381b2caeaf7Claim Asset88144422022-03-29 7:20:58183 days 4 hrs ago0x20bbbe7873ef64d8cc84ff65dff9ae3aab72f7b7 IN  Jones DAO: ETH Vault0 ETH0.000202925157 ETH
0x55e8ed31751cb2481eb566d677b25be77ecd0270f9c9f1341fc71a7adce11b56Claim Asset88025612022-03-29 2:49:25183 days 9 hrs ago0x8d26c9dac7e16738752fa1446b956a97c63e2f39 IN  Jones DAO: ETH Vault0 ETH0.000214210522 ETH
0x6ebddf857262356229e145c3019d556f5d6de0c2b67d42ce1aa82fc7094e8880Deposit Asset88018552022-03-29 2:34:58183 days 9 hrs ago0xbb179f078bac0ff4f181f6e01606ccae883ef74d IN  Jones DAO: ETH Vault0.1 ETH0.000236193059 ETH
0xc5a50d6e931dcd6cf385d4b29c5f7911cbc555ca662540e9cac6731eb578999fClaim Asset87997422022-03-29 1:52:50183 days 10 hrs ago0x99291f064f7a75df11eeec0577fd097f9aafb8a0 IN  Jones DAO: ETH Vault0 ETH0.000212458156 ETH
0x9647af865e2d8c8a8243ed35331ef7c89da8adb9b55d7e4db080111c87e9bfabClaim Asset87996512022-03-29 1:51:33183 days 10 hrs ago0x5fb8b9512684d451d4e585a1a0aabfb48a253c67 IN  Jones DAO: ETH Vault0 ETH0.00021289003 ETH
0x3495fd09a9adfe7cda7e88943b2411a80a6effaab64c663626f1ab85bf44f55eClaim Asset87957692022-03-29 0:27:04183 days 11 hrs ago0x0ce2f37534583abe28d328f09bd0b938ccac976d IN  Jones DAO: ETH Vault0 ETH0.000208943493 ETH
0xb495563b1856240def3de990e96957a80d4e4cf3bd0dadd5c37926167b3f6e41Claim Asset87938652022-03-28 23:52:00183 days 12 hrs ago0xb991e91b565dfd8711299a8cf36c938a7c6c9d6e IN  Jones DAO: ETH Vault0 ETH0.00021002143 ETH
0xdee1a953d09d235a7a694f86a6fe216b862611df89fb6790c18cf67d5616da10Claim Asset87907632022-03-28 22:42:23183 days 13 hrs ago0x9e8c8e6af3d811ce281b0e6889c57e8b7a772786 IN  Jones DAO: ETH Vault0 ETH0.000208041191 ETH
0x2757c0bdc11bfd3d6fb25c8169ebdaa1a06876a158dc24850b49d7b211dd069dDeposit Asset87907512022-03-28 22:41:15183 days 13 hrs ago0x1c6dca06d4ab9cc3c76fa8d75e3e627f7c2a9c37 IN  Jones DAO: ETH Vault0.373607 ETH0.000232914753 ETH
0xf791211ef2a9c5df2d610f2ce6af94b060afbb9d93528feaf7b2ed7ff5087cafClaim Asset87839602022-03-28 20:36:03183 days 15 hrs ago0x9b0001fba5907a56f9c9d065c3d4e2bf96625c59 IN  Jones DAO: ETH Vault0 ETH0.000199485414 ETH
0x41099dbdd8c5b177664b852520253385b544c60845b700b9a0efcd344a4f1f15Claim Asset87816622022-03-28 19:47:02183 days 16 hrs ago0x59bd42009daae544431d58793177d32e4f81a1b1 IN  Jones DAO: ETH Vault0 ETH0.000192114593 ETH
0xa69df4449019130b88b090fe32d5b73ba3fb5ded2f41cd3d2512f004dfad7df7Claim Asset87779402022-03-28 18:34:02183 days 17 hrs ago0x9d548d5fc57e21642bb6fe9670794f2e49a13486 IN  Jones DAO: ETH Vault0 ETH0.000192111133 ETH
0x05a9ba78087df0990ba3fdab0c8ad4b47946dea8116c568fee0885578af7c5daDeposit Asset87760542022-03-28 17:50:34183 days 18 hrs ago0x22c6129b4bcc532a190017f3cbbc588bf9a7f92f IN  Jones DAO: ETH Vault29 ETH0.000201403541 ETH
0xc7286d74ec711ece87862dbac408b73621584c596552d73991737394ccce5f77Deposit Asset87760362022-03-28 17:50:34183 days 18 hrs ago0x7129bd2d2be5b1b33e146270747e2bb9b2e0ea26 IN  Jones DAO: ETH Vault7.63 ETH0.000202903947 ETH
0xd4b2fa9387a5ae8c757d8904dcde13c47c3fbbf2168c214b67ee503dc5c5ee74Deposit Asset87756732022-03-28 17:41:57183 days 18 hrs ago0x8a5038978cd9afa2fdc329a8ee8e81a8bb0f4e48 IN  Jones DAO: ETH Vault6.5 ETH0.0001817309 ETH
0x9231bd0809da2c270c98afd4064c3a7c1005fda44eae2df09ee17773864735e3Deposit Asset87702932022-03-28 15:52:35183 days 20 hrs ago0x0d0bc126cc9320a5e30bd8d57fcd2ffcadd6d340 IN  Jones DAO: ETH Vault8.8 ETH0.000179889917 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x3ab299eae7c0206b2b118518186b43fdeccf4c471f276be71f245939239687cd88364792022-03-29 15:28:17182 days 20 hrs ago Jones DAO: ETH Vault0xd126f379d998b8c32ccdc55c49260685867535f81,415.654126162102410687 ETH
0x3ab299eae7c0206b2b118518186b43fdeccf4c471f276be71f245939239687cd88364792022-03-29 15:28:17182 days 20 hrs ago Jones DAO: Asset Management Multisig Jones DAO: ETH Vault0 ETH
0x98f33790b0f567aafdb73d0ed9f4654bbf1ebb20e46af736346d9433e52ff12588340172022-03-29 14:34:30182 days 21 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x98f33790b0f567aafdb73d0ed9f4654bbf1ebb20e46af736346d9433e52ff12588340172022-03-29 14:34:30182 days 21 hrs ago Jones DAO: Asset Management Multisig Jones DAO: ETH Vault0 ETH
0x35132caff6b94b3691e63084d287bda48a4b0f03502d4cb97ef995794ab2cd3588322602022-03-29 13:58:10182 days 21 hrs ago Jones DAO: ETH Vault0x6beb9286ac85d7cf638d86286a9ae098b33688e21.008711292687464456 ETH
0x35132caff6b94b3691e63084d287bda48a4b0f03502d4cb97ef995794ab2cd3588322602022-03-29 13:58:10182 days 21 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x35132caff6b94b3691e63084d287bda48a4b0f03502d4cb97ef995794ab2cd3588322602022-03-29 13:58:10182 days 21 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x18212bd321ef4f85b2f7b5b74fa25c4c2447e7d75e11e19ba1d5068ced7a5c4a88308372022-03-29 13:34:13182 days 22 hrs ago Jones DAO: ETH Vault0xebb6cc30eb759fa9bab9c76904a67509e98550f20.308475009128046192 ETH
0x18212bd321ef4f85b2f7b5b74fa25c4c2447e7d75e11e19ba1d5068ced7a5c4a88308372022-03-29 13:34:13182 days 22 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x18212bd321ef4f85b2f7b5b74fa25c4c2447e7d75e11e19ba1d5068ced7a5c4a88308372022-03-29 13:34:13182 days 22 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xa85640b52902506dc1d04394286dc00c9b5875c53b47bba6f484a843072039ce88254112022-03-29 11:40:06183 days 14 mins ago Jones DAO: ETH Vault0x67fbfa7501eac60dbfe86effb8ca14648b9c01d90.020174225853749289 ETH
0xa85640b52902506dc1d04394286dc00c9b5875c53b47bba6f484a843072039ce88254112022-03-29 11:40:06183 days 14 mins ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xa85640b52902506dc1d04394286dc00c9b5875c53b47bba6f484a843072039ce88254112022-03-29 11:40:06183 days 14 mins ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x599066742bbf6f443c4f20a3e19c7ee72eef6de79c9bdd4e4ee622dda99866a388237342022-03-29 10:57:54183 days 56 mins ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xb33ee741cea1285884d5a26871d2649f427348146d66946f5c33fae912f513e688217882022-03-29 10:03:16183 days 1 hr ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x53bb6243b132be4a4a36c9894e6263166dcdd1508497585e402fc25f522935c988167672022-03-29 8:13:12183 days 3 hrs ago Jones DAO: ETH Vault0x4092696f322bcaa2dbe83423b793cdb8647d67220.010087112926874644 ETH
0x53bb6243b132be4a4a36c9894e6263166dcdd1508497585e402fc25f522935c988167672022-03-29 8:13:12183 days 3 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x53bb6243b132be4a4a36c9894e6263166dcdd1508497585e402fc25f522935c988167672022-03-29 8:13:12183 days 3 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xf157795de6a225d697bd0b0612749b0639f608d7abd4e7711b8e43a8a9174ff588160672022-03-29 7:58:05183 days 3 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x273f8ae52e16d42c4b5005a3486815bf56848d73429759e0e3e787387bc3b56f88145132022-03-29 7:22:57183 days 4 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xc0319e380b0d1fbe7aba966ddbed73aebcc757ae67d59f9cd10d46043170eb8a88144592022-03-29 7:22:33183 days 4 hrs ago Jones DAO: ETH Vault0x21b3ca06d377457b4002a73dfb2a530867dceef50.050058306610908111 ETH
0xc0319e380b0d1fbe7aba966ddbed73aebcc757ae67d59f9cd10d46043170eb8a88144592022-03-29 7:22:33183 days 4 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0xc0319e380b0d1fbe7aba966ddbed73aebcc757ae67d59f9cd10d46043170eb8a88144592022-03-29 7:22:33183 days 4 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
0x3ead8fada153bac8af995544b038a3894d0e084e383d11e3aefe9381b2caeaf788144422022-03-29 7:20:58183 days 4 hrs ago Jones DAO: ETH Vault0x20bbbe7873ef64d8cc84ff65dff9ae3aab72f7b70.800944001598749339 ETH
0x3ead8fada153bac8af995544b038a3894d0e084e383d11e3aefe9381b2caeaf788144422022-03-29 7:20:58183 days 4 hrs ago Jones DAO: ETH Vault Jones DAO: jETH Token0 ETH
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
JonesArbETHVaultV2

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : JonesArbETHVaultV2.sol
// SPDX-License-Identifier: GPL-3.0
/*                            ******@@@@@@@@@**@*                               
                        ***@@@@@@@@@@@@@@@@@@@@@@**                             
                     *@@@@@@**@@@@@@@@@@@@@@@@@*@@@*                            
                  *@@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@*@**                          
                 *@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@*                         
                **@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@**                       
                **@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@@@@*                      
                **@@@@@@@@@@@@@@@@*************************                    
                **@@@@@@@@***********************************                   
                 *@@@***********************&@@@@@@@@@@@@@@@****,    ******@@@@*
           *********************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@************* 
      ***@@@@@@@@@@@@@@@*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@*********      
   **@@@@@**********************@@@@*****************#@@@@**********            
  *@@******************************************************                     
 *@************************************                                         
 @*******************************                                               
 *@*************************                                                    
   ********************* 
   
    /$$$$$                                               /$$$$$$$   /$$$$$$   /$$$$$$ 
   |__  $$                                              | $$__  $$ /$$__  $$ /$$__  $$
      | $$  /$$$$$$  /$$$$$$$   /$$$$$$   /$$$$$$$      | $$  \ $$| $$  \ $$| $$  \ $$
      | $$ /$$__  $$| $$__  $$ /$$__  $$ /$$_____/      | $$  | $$| $$$$$$$$| $$  | $$
 /$$  | $$| $$  \ $$| $$  \ $$| $$$$$$$$|  $$$$$$       | $$  | $$| $$__  $$| $$  | $$
| $$  | $$| $$  | $$| $$  | $$| $$_____/ \____  $$      | $$  | $$| $$  | $$| $$  | $$
|  $$$$$$/|  $$$$$$/| $$  | $$|  $$$$$$$ /$$$$$$$/      | $$$$$$$/| $$  | $$|  $$$$$$/
 \______/  \______/ |__/  |__/ \_______/|_______/       |_______/ |__/  |__/ \______/                                      
*/

pragma solidity ^0.8.2;

/// Libraries
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {SushiRouterWrapper} from "./library/SushiRouterWrapper.sol";
import {DopexArbEthSsovWrapper} from "./library/DopexArbEthSsovWrapper.sol";

/// Interfaces
import {IArbEthSSOVV2} from "../interfaces/IArbEthSSOVV2.sol";
import {IUniswapV2Router02} from "../interfaces/IUniswapV2Router02.sol";
import {IwETH} from "../interfaces/IwETH.sol";
import {IJonesAsset} from "../interfaces/IJonesAsset.sol";

/// @title Jones ETH V2 Vault
/// @author Jones DAO

contract JonesArbETHVaultV2 is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using SushiRouterWrapper for IUniswapV2Router02;
    using DopexArbEthSsovWrapper for IArbEthSSOVV2;

    // jETH contract
    IJonesAsset public jonesAssetToken;

    // ETH SSOV contract
    IArbEthSSOVV2 private SSOV;

    // Sushiswap router
    IUniswapV2Router02 private sushiRouter;

    // SushiRouterSellingtokens
    address[] private sellingTokens;

    // SushiRoutes
    address[][] private routes;

    // true if assets are under management
    // false if users can deposit and claim
    bool public MANAGEMENT_WINDOW_OPEN = true;

    // vault cap status
    bool public vaultCapSet = false;

    // wether we should charge fees
    bool public chargeFees = false;

    // vault cap value
    uint256 public vaultCap;

    // snapshot of the vault's ETH balance from previous epoch / before management starts
    uint256 public snapshotVaultBalance;

    // snapshot of jETH total supply from previous epoch / before management starts
    uint256 public snapshotJonesAssetSupply;

    // DAO whitelist mapping
    mapping(address => uint256) public daoWhitelist;

    // The list of addresses the contract uses
    mapping(bytes32 => address) public addresses;

    /// @param _jonesAsset jETH contract address.
    /// @param _SSOV SSOV contract address.
    /// @param _aumMultisigAddr AUM multisig address.
    /// @param _feeDistributor Address to which we send management and performance fees.
    /// @param _externalWhitelister Non multisig address which can add new addresses to the DAO whitelist.
    /// @param _snapshotVaultBalance Vault balance snapshot value.
    /// @param _snapshotJonesAssetSupply jETH supply snapshot value.
    constructor(
        IJonesAsset _jonesAsset,
        IArbEthSSOVV2 _SSOV,
        address _aumMultisigAddr,
        address _feeDistributor,
        address _externalWhitelister,
        uint256 _snapshotVaultBalance,
        uint256 _snapshotJonesAssetSupply
    ) {
        require(_aumMultisigAddr != address(0), "VE1");
        require(_snapshotVaultBalance > 0, "VE2");
        require(_snapshotJonesAssetSupply > 0, "VE2");

        jonesAssetToken = _jonesAsset;
        SSOV = _SSOV;
        snapshotVaultBalance = _snapshotVaultBalance;
        snapshotJonesAssetSupply = _snapshotJonesAssetSupply;

        // set addresses
        addresses["AUMMultisig"] = _aumMultisigAddr;
        addresses["FeeDistributor"] = _feeDistributor;
        addresses["Whitelistoor"] = _externalWhitelister;
        addresses["DPX"] = 0x6C2C06790b3E3E3c38e12Ee22F8183b37a13EE55;
        addresses["rDPX"] = 0x32Eb7902D4134bf98A28b963D26de779AF92A212;
        addresses["wETH"] = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;

        sushiRouter = IUniswapV2Router02(
            0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
        );

        // Token spending approvals for SushiSwap
        IERC20(getAddress("DPX")).safeApprove(
            address(sushiRouter),
            type(uint256).max
        );
        IERC20(getAddress("rDPX")).safeApprove(
            address(sushiRouter),
            type(uint256).max
        );

        sellingTokens = [getAddress("DPX"), getAddress("rDPX")];

        routes = [
            [getAddress("DPX"), getAddress("wETH")],
            [getAddress("rDPX"), getAddress("wETH")]
        ];

        transferOwnership(_aumMultisigAddr);
    }

    // ============================== Depositing ==============================

    /// Mint jETH by depositing ETH into the vault.
    /// @param _amount Amount of ETH to deposit.
    function depositAsset(uint256 _amount)
        public
        payable
        nonReentrant
        whenNotManagementWindow
    {
        require(msg.value >= _amount && _amount > 0, "VE2");

        if (vaultCapSet) {
            // if user is a whitelisted DAO
            if (isWhitelisted(msg.sender)) {
                require(_amount <= daoWhitelist[msg.sender], "VE2");

                // update whitelisted amount
                daoWhitelist[msg.sender] = daoWhitelist[msg.sender].sub(
                    _amount
                );

                emit WhitelistUpdate(msg.sender, daoWhitelist[msg.sender]);
            } else {
                require(
                    address(this).balance.add(msg.value) <= vaultCap,
                    "VE3"
                );
            }
        }

        uint256 mintableJAsset = convertToJAsset(_amount);

        // mint jETH
        jonesAssetToken.mint(msg.sender, mintableJAsset);

        emit Deposited(msg.sender, mintableJAsset, _amount);
    }

    /// Deposit fallback function - DO NOT USE THIS TO DEPOSIT YOUR ETH.
    receive() external payable {}

    // ============================== Claiming ==============================

    /// Burn jETH and redeem ETH from the vault.
    /// @dev Assumes both tokens have same decimal places.
    /// @param _amount Amount of jETH to burn.
    function claimAsset(uint256 _amount)
        public
        nonReentrant
        whenNotManagementWindow
    {
        require(_amount > 0, "VE2");
        require(jonesAssetToken.balanceOf(msg.sender) >= _amount, "VE4");
        uint256 redeemableAsset = convertToAsset(_amount);

        // burn jETH
        jonesAssetToken.burnFrom(msg.sender, _amount);

        // redeem ETH
        payable(msg.sender).transfer(redeemableAsset);

        emit Claimed(msg.sender, redeemableAsset, _amount);
    }

    // ============================== Setters ==============================

    /// Claims and deposits close, assets are under vault control.
    function openManagementWindow() public onlyOwner whenNotManagementWindow {
        _executeSnapshot();

        if (chargeFees) {
            // send management fee to fee distributor (2% annually)
            // 1 / 600 = 2 / (100 * 12)
            payable(getAddress("FeeDistributor")).transfer(
                address(this).balance.div(600)
            );
        }

        MANAGEMENT_WINDOW_OPEN = true;
        emit EpochStarted(
            block.timestamp,
            snapshotVaultBalance,
            snapshotJonesAssetSupply
        );
    }

    /// Initial setup of the vault.
    /// @dev run when vault should open for the first contract's epoch.
    /// @param _vaultCapSet True if vault cap is set.
    /// @param _vaultCap Vault cap (18 decimal).
    /// @param _snapshotVaultBalance Update vault balance (18 decimal).
    function initialRun(
        bool _vaultCapSet,
        uint256 _vaultCap,
        uint256 _snapshotVaultBalance
    ) public onlyOwner whenManagementWindow {
        // set vault cap if true
        if (_vaultCapSet) {
            require(_vaultCap > 0, "VE2");
            vaultCap = _vaultCap;
            vaultCapSet = true;
        }

        snapshotVaultBalance = _snapshotVaultBalance;

        MANAGEMENT_WINDOW_OPEN = false;
        emit EpochEnded(
            block.timestamp,
            snapshotVaultBalance,
            snapshotJonesAssetSupply
        );
    }

    /// @notice Open vault for deposits and claims.
    /// @dev claims rewards from Dopex, sells DPX and rDPX rewards, unwraps all wETH, sends performance fee to fee distributor.
    /// @param _vaultCapSet True if vault cap is set.
    /// @param _vaultCap Vault cap (18 decimal).
    /// @param _assetAmtFromDpx wETH output amount from selling DPX.
    /// @param _assetAmtFromrDpx wETH output amount from selling rDPX.
    function closeManagementWindow(
        bool _vaultCapSet,
        uint256 _vaultCap,
        uint256 _assetAmtFromDpx,
        uint256 _assetAmtFromrDpx
    ) public onlyOwner whenManagementWindow {
        // claim deposits and settle calls from SSOV
        SSOV.settleEpoch(address(this));

        uint256[] memory amounts = new uint256[](2);
        amounts[0] = _assetAmtFromDpx;
        amounts[1] = _assetAmtFromrDpx;

        // Sell DPX and rDPX for ETH
        sushiRouter.sellTokensForEth(
            amounts,
            sellingTokens,
            address(this),
            routes
        );

        uint256 balanceNow = address(this).balance;

        if ((balanceNow > snapshotVaultBalance) && chargeFees) {
            // send performance fee to fee distributor (20% on profit wrt benchmark)\
            // 1 / 5 = 20 / 100
            payable(getAddress("FeeDistributor")).transfer(
                balanceNow.sub(snapshotVaultBalance).div(5)
            );
        }

        // update snapshot
        _executeSnapshot();

        // set vault cap if true
        if (_vaultCapSet) {
            require(_vaultCap > 0, "VE2");
            vaultCap = _vaultCap;
            vaultCapSet = true;
        }

        MANAGEMENT_WINDOW_OPEN = false;
        emit EpochEnded(
            block.timestamp,
            snapshotVaultBalance,
            snapshotJonesAssetSupply
        );
    }

    /// Update SSOV contract address in case it changes.
    /// @dev This function is called by the AUM multisig.
    function updateSSOVAddress(IArbEthSSOVV2 _newSSOV) public onlyOwner {
        SSOV = _newSSOV;
    }

    /// Update vault value snapshot.
    function _executeSnapshot() private {
        snapshotJonesAssetSupply = jonesAssetToken.totalSupply();
        snapshotVaultBalance = address(this).balance;

        emit Snapshot(
            block.timestamp,
            snapshotVaultBalance,
            snapshotJonesAssetSupply
        );
    }

    // ============================== AUM multisig functions ==============================

    /// Migrate vault to new vault contract.
    /// @dev acts as emergency withdrawal if needed.
    /// @param _to New vault contract address.
    /// @param _tokens Addresses of tokens to be migrated.
    function migrateVault(address _to, address[] memory _tokens)
        public
        onlyOwner
        whenManagementWindow
    {
        // migrate other ERC20 Tokens
        for (uint256 i = 0; i < _tokens.length; i++) {
            IERC20 tkn = IERC20(_tokens[i]);
            uint256 assetBalance = tkn.balanceOf(address(this));
            if (assetBalance > 0) {
                tkn.transfer(_to, assetBalance);
            }
        }

        // migrate ETH balance
        uint256 balanceGwei = address(this).balance;
        if (balanceGwei > 0) {
            payable(_to).transfer(balanceGwei);
        }
    }

    /// Update whether we should be charging fees.
    function setChargeFees(bool _status) public onlyOwner {
        chargeFees = _status;
    }

    // ============================== Dopex interaction ==============================

    /// Deposits funds to SSOV at desired strike price.
    /// @param _strikeIndex Strike price index.
    /// @param _amount Amount of ETH to deposit.
    /// @return Whether deposit was successful.
    function depositSSOV(uint256 _strikeIndex, uint256 _amount)
        public
        onlyOwner
        whenManagementWindow
        returns (bool)
    {
        return SSOV.depositSSOV(_strikeIndex, _amount, address(this));
    }

    /// Deposits funds to SSOV at multiple desired strike prices.
    /// @param _strikeIndices Strike price indices.
    /// @param _amounts Amounts of ETH to deposit.
    /// @return Whether deposits went through successfully.
    function depositSSOVMultiple(
        uint256[] memory _strikeIndices,
        uint256[] memory _amounts
    ) public onlyOwner whenManagementWindow returns (bool) {
        return
            SSOV.depositSSOVMultiple(_strikeIndices, _amounts, address(this));
    }

    /// Buys calls from Dopex SSOV.
    /// @param _strikeIndex Strike index for current epoch.
    /// @param _amount Amount of calls to purchase.
    /// @param _price Amount of ETH we are willing to pay for these calls.
    /// @return Whether call purchase went through successfully.
    function purchaseCall(
        uint256 _strikeIndex,
        uint256 _amount,
        uint256 _price
    ) public onlyOwner whenManagementWindow returns (bool) {
        return SSOV.purchaseCall(_strikeIndex, _amount, _price, address(this));
    }

    // ============================== wETH interaction ==============================

    /// Wraps a given amount of ETH.
    /// @param _amount Amount of ETH to be wrapped.
    /// @return Whether wrapping was successful.
    function wrapETH(uint256 _amount)
        public
        onlyOwner
        whenManagementWindow
        returns (bool)
    {
        IwETH(getAddress("wETH")).deposit{value: _amount}();
        return true;
    }

    /// Unwraps a given amount of wETH.
    /// @param _amount Amount of wETH to be unwrapped.
    /// @return Whether unwrapping was successful.
    function unwrapwETH(uint256 _amount)
        public
        onlyOwner
        whenManagementWindow
        returns (bool)
    {
        IwETH(getAddress("wETH")).withdraw(_amount);
        return true;
    }

    // ============================== DAO Whitelist ==============================

    /// Adds a new DAO to the whitelist.
    /// @param _addr address to be added to the whitelist.
    /// @param _amount allowed amount for this address.
    function addToWhitelist(address _addr, uint256 _amount)
        public
        onlyWhitelistoors
    {
        require(!isWhitelisted(_addr), "VE5");
        daoWhitelist[_addr] = _amount;
        emit WhitelistUpdate(_addr, _amount);
    }

    /// Check if address is whitelisted.
    /// @param _addr address to be checked.
    /// @return Whether address is whitelisted.
    function isWhitelisted(address _addr) public view returns (bool) {
        return daoWhitelist[_addr] > 0;
    }

    /// Removes an address from the whitelist.
    /// @param _addr address to be removed.
    function removeFromWhitelist(address _addr) public onlyWhitelistoors {
        require(isWhitelisted(_addr), "VE6");
        daoWhitelist[_addr] = 0;
        emit WhitelistUpdate(_addr, 0);
    }

    // ============================== Views ==============================

    /// Calculates claimable ETH for a given user.
    /// @param _user user address.
    /// @return claimable ETH.
    function claimableAsset(address _user) public view returns (uint256) {
        uint256 usrBalance = jonesAssetToken.balanceOf(_user);
        if (usrBalance > 0) {
            return convertToAsset(usrBalance);
        }
        return 0;
    }

    /// Calculates claimable ETH amount for a given amount of jETH.
    /// @param _jAssetAmount Amount of jETH.
    /// @return claimable ETH amount.
    function convertToAsset(uint256 _jAssetAmount)
        public
        view
        returns (uint256)
    {
        return
            _jAssetAmount.mul(snapshotVaultBalance).div(
                snapshotJonesAssetSupply
            );
    }

    /// Calculates mintable jETH amount for a given amount of ETH
    /// @param _assetAmount Amount of ETH.
    /// @return mintable jETH amount.
    function convertToJAsset(uint256 _assetAmount)
        public
        view
        returns (uint256)
    {
        return
            _assetAmount.mul(snapshotJonesAssetSupply).div(
                snapshotVaultBalance
            );
    }

    /// Gets the address of a set contract
    /// @param _name Name of the contract
    /// @return The address of the contract
    function getAddress(bytes32 _name) public view returns (address) {
        return addresses[_name];
    }

    // ============================== Modifiers ==============================

    /// When both deposits and claiming are closed, vault can manage ETH.
    modifier whenManagementWindow() {
        require(MANAGEMENT_WINDOW_OPEN, "VE7");
        _;
    }

    /// When management window is closed, deposits and claiming are open.
    modifier whenNotManagementWindow() {
        require(!MANAGEMENT_WINDOW_OPEN, "VE8");
        _;
    }

    /// When message sender is either the multisig or the whitelist manager
    modifier onlyWhitelistoors() {
        require(
            msg.sender == owner() || msg.sender == getAddress("Whitelistoor"),
            "VE9"
        );
        _;
    }

    // ============================== Events ==============================

    /// emitted on user deposit
    /// @param _from depositor address (indexed)
    /// @param _assetAmount ETH deposit amount
    /// @param _jonesAssetAmount jETH mint amount
    event Deposited(
        address indexed _from,
        uint256 _assetAmount,
        uint256 _jonesAssetAmount
    );

    /// emitted on user claim
    /// @param _from claimer address (indexed)
    /// @param _assetAmount ETH claim amount
    /// @param _jonesAssetAmount jETH burn amount
    event Claimed(
        address indexed _from,
        uint256 _assetAmount,
        uint256 _jonesAssetAmount
    );

    /// emitted when vault balance snapshot is taken
    /// @param _timestamp snapshot timestamp (indexed)
    /// @param _vaultBalance vault balance value
    /// @param _jonesAssetSupply jETH total supply value
    event Snapshot(
        uint256 indexed _timestamp,
        uint256 _vaultBalance,
        uint256 _jonesAssetSupply
    );

    /// emitted when asset management window is opened
    /// @param _timestamp snapshot timestamp (indexed)
    /// @param _assetAmount new vault balance value
    /// @param _jonesAssetSupply jETH total supply at this time
    event EpochStarted(
        uint256 indexed _timestamp,
        uint256 _assetAmount,
        uint256 _jonesAssetSupply
    );

    /// emitted when claim and deposit windows are open
    /// @param _timestamp snapshot timestamp (indexed)
    /// @param _assetAmount new vault balance value
    /// @param _jonesAssetSupply jETH total supply at this time
    event EpochEnded(
        uint256 indexed _timestamp,
        uint256 _assetAmount,
        uint256 _jonesAssetSupply
    );

    /// emitted when whitelist is updated
    /// @param _address whitelisted address (indexed)
    /// @param _amount whitelisted new amount
    event WhitelistUpdate(address indexed _address, uint256 _amount);
}

// ERROR MAPPING:
// {
//   "VE1": "Vault: Address cannot be a zero address",
//   "VE2": "Vault: Invalid amount",
//   "VE3": "Vault: Amount exceeds vault cap",
//   "VE4": "Vault: Insufficient balance",
//   "VE5": "Vault: Already whitelisted",
//   "VE6": "Vault: Address not in whitelist",
//   "VE7": "Vault: Management window is not open",
//   "VE8": "Vault: Management window is  open",
//   "VE9": "Vault: User does not have whitelisting permissions",
// }

File 2 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 15 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 15 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 5 of 15 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 15 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 7 of 15 : SushiRouterWrapper.sol
// SPDX-License-Identifier: GPL-3.0
/*                            ******@@@@@@@@@**@*                               
                        ***@@@@@@@@@@@@@@@@@@@@@@**                             
                     *@@@@@@**@@@@@@@@@@@@@@@@@*@@@*                            
                  *@@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@*@**                          
                 *@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@*                         
                **@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@**                       
                **@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@@@@*                      
                **@@@@@@@@@@@@@@@@*************************                    
                **@@@@@@@@***********************************                   
                 *@@@***********************&@@@@@@@@@@@@@@@****,    ******@@@@*
           *********************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@************* 
      ***@@@@@@@@@@@@@@@*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@*********      
   **@@@@@**********************@@@@*****************#@@@@**********            
  *@@******************************************************                     
 *@************************************                                         
 @*******************************                                               
 *@*************************                                                    
   ********************* 
   
    /$$$$$                                               /$$$$$$$   /$$$$$$   /$$$$$$ 
   |__  $$                                              | $$__  $$ /$$__  $$ /$$__  $$
      | $$  /$$$$$$  /$$$$$$$   /$$$$$$   /$$$$$$$      | $$  \ $$| $$  \ $$| $$  \ $$
      | $$ /$$__  $$| $$__  $$ /$$__  $$ /$$_____/      | $$  | $$| $$$$$$$$| $$  | $$
 /$$  | $$| $$  \ $$| $$  \ $$| $$$$$$$$|  $$$$$$       | $$  | $$| $$__  $$| $$  | $$
| $$  | $$| $$  | $$| $$  | $$| $$_____/ \____  $$      | $$  | $$| $$  | $$| $$  | $$
|  $$$$$$/|  $$$$$$/| $$  | $$|  $$$$$$$ /$$$$$$$/      | $$$$$$$/| $$  | $$|  $$$$$$/
 \______/  \______/ |__/  |__/ \_______/|_______/       |_______/ |__/  |__/ \______/                                      
*/

pragma solidity ^0.8.2;

import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IUniswapV2Router02} from "../../interfaces/IUniswapV2Router02.sol";

library SushiRouterWrapper {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /// Sells the received tokens for the provided amounts for the last token in the route
    /// Temporary solution until we implement accumulation policy.
    /// @param self the sushi router used to perform the sale.
    /// @param _assetAmounts output amount from selling the tokens.
    /// @param _tokens tokens to sell.
    /// @param _recepient recepient address.
    /// @param _routes routes to sell each token
    function sellTokens(
        IUniswapV2Router02 self,
        uint256[] memory _assetAmounts,
        address[] memory _tokens,
        address _recepient,
        address[][] memory _routes
    ) public {
        uint256 amountsLength = _assetAmounts.length;
        uint256 tokensLength = _tokens.length;
        uint256 routesLength = _routes.length;

        require(amountsLength == tokensLength, "SRE1");
        require(routesLength == tokensLength, "SRE1");

        uint256 deadline = block.timestamp.add(120);
        for (uint256 i = 0; i < tokensLength; i++) {
            _sellTokens(
                self,
                IERC20(_tokens[i]),
                _assetAmounts[i],
                _recepient,
                deadline,
                _routes[i]
            );
        }
    }

    /// Sells the received tokens for the provided amounts for ETH
    /// Temporary solution until we implement accumulation policy.
    /// @param self the sushi router used to perform the sale.
    /// @param _assetAmounts output amount from selling the tokens.
    /// @param _tokens tokens to sell.
    /// @param _recepient recepient address.
    /// @param _routes routes to sell each token.
    function sellTokensForEth(
        IUniswapV2Router02 self,
        uint256[] memory _assetAmounts,
        address[] memory _tokens,
        address _recepient,
        address[][] memory _routes
    ) public {
        uint256 amountsLength = _assetAmounts.length;
        uint256 tokensLength = _tokens.length;
        uint256 routesLength = _routes.length;

        require(amountsLength == tokensLength, "SRE1");
        require(routesLength == tokensLength, "SRE1");

        uint256 deadline = block.timestamp.add(120);
        for (uint256 i = 0; i < tokensLength; i++) {
            _sellTokensForEth(
                self,
                IERC20(_tokens[i]),
                _assetAmounts[i],
                _recepient,
                deadline,
                _routes[i]
            );
        }
    }

    function _sellTokensForEth(
        IUniswapV2Router02 _sushiRouter,
        IERC20 _token,
        uint256 _assetAmount,
        address _recepient,
        uint256 _deadline,
        address[] memory _route
    ) private {
        uint256 balance = _token.balanceOf(_recepient);
        if (balance > 0) {
            _sushiRouter.swapExactTokensForETH(
                balance,
                _assetAmount,
                _route,
                _recepient,
                _deadline
            );
        }
    }

    function _sellTokens(
        IUniswapV2Router02 _sushiRouter,
        IERC20 _token,
        uint256 _assetAmount,
        address _recepient,
        uint256 _deadline,
        address[] memory _route
    ) private {
        uint256 balance = _token.balanceOf(_recepient);
        if (balance > 0) {
            _sushiRouter.swapExactTokensForTokens(
                balance,
                _assetAmount,
                _route,
                _recepient,
                _deadline
            );
        }
    }

    // ERROR MAPPING:
    // {
    //   "SRE1": "Rewards: token, amount and routes lenght must match",
    // }
}

File 8 of 15 : DopexArbEthSsovWrapper.sol
// SPDX-License-Identifier: GPL-3.0
/*                            ******@@@@@@@@@**@*                               
                        ***@@@@@@@@@@@@@@@@@@@@@@**                             
                     *@@@@@@**@@@@@@@@@@@@@@@@@*@@@*                            
                  *@@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@*@**                          
                 *@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@*                         
                **@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@**                       
                **@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@@@@*                      
                **@@@@@@@@@@@@@@@@*************************                    
                **@@@@@@@@***********************************                   
                 *@@@***********************&@@@@@@@@@@@@@@@****,    ******@@@@*
           *********************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@************* 
      ***@@@@@@@@@@@@@@@*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@*********      
   **@@@@@**********************@@@@*****************#@@@@**********            
  *@@******************************************************                     
 *@************************************                                         
 @*******************************                                               
 *@*************************                                                    
   *********************  
   
    /$$$$$                                               /$$$$$$$   /$$$$$$   /$$$$$$ 
   |__  $$                                              | $$__  $$ /$$__  $$ /$$__  $$
      | $$  /$$$$$$  /$$$$$$$   /$$$$$$   /$$$$$$$      | $$  \ $$| $$  \ $$| $$  \ $$
      | $$ /$$__  $$| $$__  $$ /$$__  $$ /$$_____/      | $$  | $$| $$$$$$$$| $$  | $$
 /$$  | $$| $$  \ $$| $$  \ $$| $$$$$$$$|  $$$$$$       | $$  | $$| $$__  $$| $$  | $$
| $$  | $$| $$  | $$| $$  | $$| $$_____/ \____  $$      | $$  | $$| $$  | $$| $$  | $$
|  $$$$$$/|  $$$$$$/| $$  | $$|  $$$$$$$ /$$$$$$$/      | $$$$$$$/| $$  | $$|  $$$$$$/
 \______/  \______/ |__/  |__/ \_______/|_______/       |_______/ |__/  |__/ \______/                                      
*/

pragma solidity ^0.8.2;

import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IArbEthSSOVV2} from "../../interfaces/IArbEthSSOVV2.sol";

library DopexArbEthSsovWrapper {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // ============================== Dopex Arb Ssov wrapper interaction ==============================

    /**
     * Deposits funds to SSOV at desired strike price.
     * @param _strikeIndex Strike price index.
     * @param _amount Amount of ETH to deposit.
     * @return Whether deposit was successful.
     */
    function depositSSOV(
        IArbEthSSOVV2 self,
        uint256 _strikeIndex,
        uint256 _amount,
        address _caller
    ) public returns (bool) {
        self.deposit{value: _amount}(_strikeIndex, _caller);
        emit SSOVDeposit(self.currentEpoch(), _strikeIndex, _amount);
        return true;
    }

    /**
     * Deposits funds to SSOV at multiple desired strike prices.
     * @param _strikeIndices Strike price indices.
     * @param _amounts Amounts of ETH to deposit.
     * @return Whether deposits went through successfully.
     */
    function depositSSOVMultiple(
        IArbEthSSOVV2 self,
        uint256[] memory _strikeIndices,
        uint256[] memory _amounts,
        address _caller
    ) public returns (bool) {
        uint256 totalAmount;
        require(
            _strikeIndices.length == _amounts.length,
            "Arguments Lenght do not match"
        );
        for (uint256 i = 0; i < _amounts.length; i++) {
            totalAmount = totalAmount.add(_amounts[i]);
        }

        self.depositMultiple{value: totalAmount}(
            _strikeIndices,
            _amounts,
            _caller
        );

        for (uint256 i = 0; i < _amounts.length; i++) {
            emit SSOVDeposit(
                self.currentEpoch(),
                _strikeIndices[i],
                _amounts[i]
            );
        }

        return true;
    }

    /**
     * Buys calls from Dopex SSOV.
     * @param _strikeIndex Strike index for current epoch.
     * @param _amount Amount of calls to purchase.
     * @param _price Amount of ETH we are willing to pay for these calls.
     * @return Whether call purchase went through successfully.
     */
    function purchaseCall(
        IArbEthSSOVV2 self,
        uint256 _strikeIndex,
        uint256 _amount,
        uint256 _price,
        address _caller
    ) public returns (bool) {
        (uint256 premium, uint256 totalFee) = self.purchase{value: _price}(
            _strikeIndex,
            _amount,
            _caller
        );
        emit SSOVCallPurchase(
            self.currentEpoch(),
            _strikeIndex,
            _amount,
            premium,
            totalFee
        );
        return true;
    }

    /**
     * Claims deposits and settle calls from Dopex SSOV at the end of an epoch.
     * @param _caller the address seleting the epoch
     * @return Whether settling was successful.
     */
    function settleEpoch(IArbEthSSOVV2 self, address _caller)
        public
        returns (bool)
    {
        uint256 epoch = self.currentEpoch();

        // calls
        address[] memory strikeTokens = self.getEpochStrikeTokens(epoch);
        for (uint256 i = 0; i < strikeTokens.length; i++) {
            IERC20 strikeToken = IERC20(strikeTokens[i]);
            uint256 strikeTokenBalance = strikeToken.balanceOf(_caller);
            if (strikeTokenBalance > 0) {
                strikeToken.safeApprove(address(self), strikeTokenBalance);
                self.settle(i, strikeTokenBalance, epoch);
            }
        }

        // deposits
        uint256[] memory vaultDeposits = self.getUserEpochDeposits(
            epoch,
            _caller
        );
        for (uint256 i = 0; i < vaultDeposits.length; i++) {
            if (vaultDeposits[i] > 0) {
                self.withdraw(epoch, i);
            }
        }

        return true;
    }

    // ============================== Events ==============================

    /**
     * emitted when new Deposit to SSOV is made
     * @param _epoch SSOV epoch (indexed)
     * @param _strikeIndex SSOV strike index
     * @param _amount deposit amount
     */
    event SSOVDeposit(
        uint256 indexed _epoch,
        uint256 _strikeIndex,
        uint256 _amount
    );

    /**
     * emitted when new call from SSOV is purchased
     * @param _epoch SSOV epoch (indexed)
     * @param _strikeIndex SSOV strike index
     * @param _amount call amount
     * @param _premium call premium
     * @param _totalFee call total fee
     */
    event SSOVCallPurchase(
        uint256 indexed _epoch,
        uint256 _strikeIndex,
        uint256 _amount,
        uint256 _premium,
        uint256 _totalFee
    );
}

File 9 of 15 : IArbEthSSOVV2.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.2;

interface IArbEthSSOVV2 {
    function currentEpoch() external view returns (uint256);

    function deposit(uint256 strikeIndex, address user)
        external
        payable
        returns (bool);

    function depositMultiple(
        uint256[] calldata strikeIndices,
        uint256[] calldata amounts,
        address user
    ) external payable returns (bool);

    function purchase(
        uint256 strikeIndex,
        uint256 amount,
        address user
    ) external payable returns (uint256, uint256);

    function settle(
        uint256 strikeIndex,
        uint256 amount,
        uint256 epoch
    ) external returns (uint256 pnl);

    function withdraw(uint256 withdrawEpoch, uint256 strikeIndex)
        external
        returns (uint256[3] memory);

    function getEpochStrikeTokens(uint256 epoch)
        external
        view
        returns (address[] memory);

    function getUserEpochDeposits(uint256 epoch, address user)
        external
        view
        returns (uint256[] memory);
}

File 10 of 15 : IUniswapV2Router02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

import "./IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

File 11 of 15 : IwETH.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.2;

interface IwETH {
    function deposit() external payable;

    function withdraw(uint256 amount) external;

    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function balanceOf(address owner) external view returns (uint256);
}

File 12 of 15 : IJonesAsset.sol
// SPDX-License-Identifier: GPL-3.0
/*                            ******@@@@@@@@@**@*                               
                        ***@@@@@@@@@@@@@@@@@@@@@@**                             
                     *@@@@@@**@@@@@@@@@@@@@@@@@*@@@*                            
                  *@@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@*@**                          
                 *@@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@*                         
                **@@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@**                       
                **@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@@@@*                      
                **@@@@@@@@@@@@@@@@*************************                    
                **@@@@@@@@***********************************                   
                 *@@@***********************&@@@@@@@@@@@@@@@****,    ******@@@@*
           *********************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@************* 
      ***@@@@@@@@@@@@@@@*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@*********      
   **@@@@@**********************@@@@*****************#@@@@**********            
  *@@******************************************************                     
 *@************************************                                         
 @*******************************                                               
 *@*************************                                                    
   ********************* 
   
    /$$$$$                                               /$$$$$$$   /$$$$$$   /$$$$$$ 
   |__  $$                                              | $$__  $$ /$$__  $$ /$$__  $$
      | $$  /$$$$$$  /$$$$$$$   /$$$$$$   /$$$$$$$      | $$  \ $$| $$  \ $$| $$  \ $$
      | $$ /$$__  $$| $$__  $$ /$$__  $$ /$$_____/      | $$  | $$| $$$$$$$$| $$  | $$
 /$$  | $$| $$  \ $$| $$  \ $$| $$$$$$$$|  $$$$$$       | $$  | $$| $$__  $$| $$  | $$
| $$  | $$| $$  | $$| $$  | $$| $$_____/ \____  $$      | $$  | $$| $$  | $$| $$  | $$
|  $$$$$$/|  $$$$$$/| $$  | $$|  $$$$$$$ /$$$$$$$/      | $$$$$$$/| $$  | $$|  $$$$$$/
 \______/  \______/ |__/  |__/ \_______/|_______/       |_______/ |__/  |__/ \______/                                      
*/

pragma solidity ^0.8.2;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IJonesAsset is IERC20 {
    /// @dev JonesAsset interface
    function mint(address recipient, uint256 amount) external;

    function giveMinterRole(address account) external;

    function revokeMinterRole(address account) external;

    /// @dev IERC20Burnable interface
    function burnFrom(address account, uint256 amount) external;
}

File 13 of 15 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 14 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 15 of 15 : IUniswapV2Router01.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/VaultsV2/library/DopexArbEthSsovWrapper.sol": {
      "DopexArbEthSsovWrapper": "0xa91322497ff23cda7ac18d596d30d6f00ad66a20"
    },
    "contracts/VaultsV2/library/SushiRouterWrapper.sol": {
      "SushiRouterWrapper": "0xcdde6d08d775950a18c1a1f0b1c64a44c32db4f7"
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"contract IJonesAsset","name":"_jonesAsset","type":"address"},{"internalType":"contract IArbEthSSOVV2","name":"_SSOV","type":"address"},{"internalType":"address","name":"_aumMultisigAddr","type":"address"},{"internalType":"address","name":"_feeDistributor","type":"address"},{"internalType":"address","name":"_externalWhitelister","type":"address"},{"internalType":"uint256","name":"_snapshotVaultBalance","type":"uint256"},{"internalType":"uint256","name":"_snapshotJonesAssetSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jonesAssetAmount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jonesAssetAmount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jonesAssetSupply","type":"uint256"}],"name":"EpochEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jonesAssetSupply","type":"uint256"}],"name":"EpochStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_vaultBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_jonesAssetSupply","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WhitelistUpdate","type":"event"},{"inputs":[],"name":"MANAGEMENT_WINDOW_OPEN","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"addresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargeFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"claimableAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_vaultCapSet","type":"bool"},{"internalType":"uint256","name":"_vaultCap","type":"uint256"},{"internalType":"uint256","name":"_assetAmtFromDpx","type":"uint256"},{"internalType":"uint256","name":"_assetAmtFromrDpx","type":"uint256"}],"name":"closeManagementWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jAssetAmount","type":"uint256"}],"name":"convertToAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetAmount","type":"uint256"}],"name":"convertToJAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"daoWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strikeIndex","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositSSOV","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_strikeIndices","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"depositSSOVMultiple","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_vaultCapSet","type":"bool"},{"internalType":"uint256","name":"_vaultCap","type":"uint256"},{"internalType":"uint256","name":"_snapshotVaultBalance","type":"uint256"}],"name":"initialRun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jonesAssetToken","outputs":[{"internalType":"contract IJonesAsset","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"migrateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openManagementWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strikeIndex","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"purchaseCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setChargeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshotJonesAssetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snapshotVaultBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unwrapwETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IArbEthSSOVV2","name":"_newSSOV","type":"address"}],"name":"updateSSOVAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCapSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"wrapETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600760006101000a81548160ff0219169083151502179055506000600760016101000a81548160ff0219169083151502179055506000600760026101000a81548160ff0219169083151502179055503480156200006257600080fd5b50604051620060c6380380620060c6833981810160405281019062000088919062001266565b620000a86200009c6200098160201b60201c565b6200098960201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000119906200137a565b60405180910390fd5b6000821162000168576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200015f90620013ec565b60405180910390fd5b60008111620001ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a590620013ec565b60405180910390fd5b86600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160098190555080600a8190555084600c60007f41554d4d756c7469736967000000000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600c60007f4665654469737472696275746f72000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c60007f57686974656c6973746f6f720000000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736c2c06790b3e3e3c38e12ee22f8183b37a13ee55600c60007f4450580000000000000000000000000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507332eb7902d4134bf98a28b963d26de779af92a212600c60007f7244505800000000000000000000000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507382af49447d8a07e3bd95bd0d56f35241523fbab1600c60007f7745544800000000000000000000000000000000000000000000000000000000815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731b02da8cb0d097eb8d57a175b88c7d8b47997506600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200061f600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620005f47f445058000000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a8a60201b6200294e179092919060201c565b620006c3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620006987f724450580000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a8a60201b6200294e179092919060201c565b6040518060400160405280620006ff7f445058000000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001620007617f724450580000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506005906002620007a292919062000fdc565b5060405180604001604052806040518060400160405280620007ea7f445058000000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016200084c7f774554480000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525081526020016040518060400160405280620008bc7f724450580000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016200091e7f774554480000000000000000000000000000000000000000000000000000000062000a4d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508152506006906002620009629291906200106b565b50620009748562000bec60201b60201c565b505050505050506200198c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081148062000b1a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040162000ad49291906200141f565b602060405180830381865afa15801562000af2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b1891906200144c565b145b62000b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b5390620014f4565b60405180910390fd5b62000be78363095ea7b360e01b848460405160240162000b7e92919062001527565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505062000d0260201b60201c565b505050565b62000bfc6200098160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000c2262000dd660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000c7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7290620015a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ce5906200163c565b60405180910390fd5b62000cff816200098960201b60201c565b50565b600062000d6b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1662000dff60201b62002a9d179092919060201c565b905060008151111562000dd1578080602001905181019062000d8e91906200169b565b62000dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dc79062001743565b60405180910390fd5b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606062000e16848460008562000e1f60201b60201c565b90509392505050565b60608247101562000e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e5e90620017db565b60405180910390fd5b62000e788562000f4d60201b60201c565b62000eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000eb1906200184d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405162000ee59190620018f2565b60006040518083038185875af1925050503d806000811462000f24576040519150601f19603f3d011682016040523d82523d6000602084013e62000f29565b606091505b509150915062000f4182828662000f7060201b60201c565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831562000f825782905062000fd5565b60008351111562000f965782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fcc919062001968565b60405180910390fd5b9392505050565b82805482825590600052602060002090810192821562001058579160200282015b82811115620010575782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000ffd565b5b509050620010679190620010cd565b5090565b828054828255906000526020600020908101928215620010ba579160200282015b82811115620010b957825182906002620010a892919062000fdc565b50916020019190600101906200108c565b5b509050620010c99190620010ec565b5090565b5b80821115620010e8576000816000905550600101620010ce565b5090565b5b8082111562001110576000818162001106919062001114565b50600101620010ed565b5090565b5080546000825590600052602060002090810190620011349190620010cd565b50565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001169826200113c565b9050919050565b60006200117d826200115c565b9050919050565b6200118f8162001170565b81146200119b57600080fd5b50565b600081519050620011af8162001184565b92915050565b6000620011c2826200115c565b9050919050565b620011d481620011b5565b8114620011e057600080fd5b50565b600081519050620011f481620011c9565b92915050565b62001205816200115c565b81146200121157600080fd5b50565b6000815190506200122581620011fa565b92915050565b6000819050919050565b62001240816200122b565b81146200124c57600080fd5b50565b600081519050620012608162001235565b92915050565b600080600080600080600060e0888a03121562001288576200128762001137565b5b6000620012988a828b016200119e565b9750506020620012ab8a828b01620011e3565b9650506040620012be8a828b0162001214565b9550506060620012d18a828b0162001214565b9450506080620012e48a828b0162001214565b93505060a0620012f78a828b016200124f565b92505060c06200130a8a828b016200124f565b91505092959891949750929550565b600082825260208201905092915050565b7f5645310000000000000000000000000000000000000000000000000000000000600082015250565b60006200136260038362001319565b91506200136f826200132a565b602082019050919050565b60006020820190508181036000830152620013958162001353565b9050919050565b7f5645320000000000000000000000000000000000000000000000000000000000600082015250565b6000620013d460038362001319565b9150620013e1826200139c565b602082019050919050565b600060208201905081810360008301526200140781620013c5565b9050919050565b62001419816200115c565b82525050565b60006040820190506200143660008301856200140e565b6200144560208301846200140e565b9392505050565b60006020828403121562001465576200146462001137565b5b600062001475848285016200124f565b91505092915050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b6000620014dc60368362001319565b9150620014e9826200147e565b604082019050919050565b600060208201905081810360008301526200150f81620014cd565b9050919050565b62001521816200122b565b82525050565b60006040820190506200153e60008301856200140e565b6200154d602083018462001516565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200158c60208362001319565b9150620015998262001554565b602082019050919050565b60006020820190508181036000830152620015bf816200157d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200162460268362001319565b91506200163182620015c6565b604082019050919050565b60006020820190508181036000830152620016578162001615565b9050919050565b60008115159050919050565b62001675816200165e565b81146200168157600080fd5b50565b60008151905062001695816200166a565b92915050565b600060208284031215620016b457620016b362001137565b5b6000620016c48482850162001684565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006200172b602a8362001319565b91506200173882620016cd565b604082019050919050565b600060208201905081810360008301526200175e816200171c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000620017c360268362001319565b9150620017d08262001765565b604082019050919050565b60006020820190508181036000830152620017f681620017b4565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600062001835601d8362001319565b91506200184282620017fd565b602082019050919050565b60006020820190508181036000830152620018688162001826565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015620018a557808201518184015260208101905062001888565b83811115620018b5576000848401525b50505050565b6000620018c8826200186f565b620018d481856200187a565b9350620018e681856020860162001885565b80840191505092915050565b6000620019008284620018bb565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600062001934826200190b565b62001940818562001319565b93506200195281856020860162001885565b6200195d8162001916565b840191505092915050565b6000602082019050818103600083015262001984818462001927565b905092915050565b61472a806200199c6000396000f3fe6080604052600436106101e75760003560e01c80638ab1d68111610102578063ca9cb97b11610095578063f2fde38b11610064578063f2fde38b14610747578063f446b84414610770578063f9391f8e1461079b578063fa2df414146107c6576101ee565b8063ca9cb97b1461068d578063cbf66677146106b6578063d3c2a592146106e1578063f176edfb1461070a576101ee565b8063ab5d26e7116100d1578063ab5d26e7146105e7578063b34e837814610610578063c15fc68814610639578063c8676fed14610664576101ee565b80638ab1d681146105195780638da5cb5b146105425780639e7bd8cd1461056d578063a3a97778146105aa576101ee565b80633c1bda091161017a578063699f200f11610149578063699f200f1461044b578063715018a6146104885780637b1ae4361461049f57806384876bad146104dc576101ee565b80633c1bda09146103a357806346b49dec146103ce5780634b5a2465146103e55780635346ff8214610422576101ee565b806321f8a721116101b657806321f8a721146102c157806331882c91146102fe5780633824c59c146103295780633af32abf14610366576101ee565b806316322c87146101f35780631c58db4f14610230578063213ee1b71461026d578063214405fc14610298576101ee565b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612f8e565b6107e2565b6040516102279190612fd4565b60405180910390f35b34801561023c57600080fd5b506102576004803603810190610252919061301b565b6107fa565b6040516102649190613063565b60405180910390f35b34801561027957600080fd5b50610282610959565b60405161028f9190612fd4565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061307e565b61095f565b005b3480156102cd57600080fd5b506102e860048036038101906102e391906130f4565b610b11565b6040516102f59190613130565b60405180910390f35b34801561030a57600080fd5b50610313610b4e565b6040516103209190613063565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906132a4565b610b61565b60405161035d9190613063565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190612f8e565b610cee565b60405161039a9190613063565b60405180910390f35b3480156103af57600080fd5b506103b8610d39565b6040516103c59190612fd4565b60405180910390f35b3480156103da57600080fd5b506103e3610d3f565b005b3480156103f157600080fd5b5061040c6004803603810190610407919061301b565b610f07565b6040516104199190612fd4565b60405180910390f35b34801561042e57600080fd5b50610449600480360381019061044491906133df565b610f39565b005b34801561045757600080fd5b50610472600480360381019061046d91906130f4565b6111a7565b60405161047f9190613130565b60405180910390f35b34801561049457600080fd5b5061049d6111da565b005b3480156104ab57600080fd5b506104c660048036038101906104c1919061343b565b611262565b6040516104d39190613063565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe919061301b565b6113ef565b6040516105109190613063565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612f8e565b611558565b005b34801561054e57600080fd5b5061055761170a565b6040516105649190613130565b60405180910390f35b34801561057957600080fd5b50610594600480360381019061058f919061347b565b611733565b6040516105a19190613063565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc919061301b565b6118c3565b6040516105de9190612fd4565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906134fa565b6118f5565b005b34801561061c57600080fd5b5061063760048036038101906106329190613565565b61198e565b005b34801561064557600080fd5b5061064e611a4e565b60405161065b9190613063565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613592565b611a61565b005b34801561069957600080fd5b506106b460048036038101906106af91906135f9565b611eaf565b005b3480156106c257600080fd5b506106cb61204b565b6040516106d89190612fd4565b60405180910390f35b3480156106ed57600080fd5b506107086004803603810190610703919061301b565b612051565b005b34801561071657600080fd5b50610731600480360381019061072c9190612f8e565b61234e565b60405161073e9190612fd4565b60405180910390f35b34801561075357600080fd5b5061076e60048036038101906107699190612f8e565b612414565b005b34801561077c57600080fd5b5061078561250c565b60405161079291906136ab565b60405180910390f35b3480156107a757600080fd5b506107b0612532565b6040516107bd9190613063565b60405180910390f35b6107e060048036038101906107db919061301b565b612545565b005b600b6020528060005260406000206000915090505481565b6000610804612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661082261170a565b73ffffffffffffffffffffffffffffffffffffffff1614610878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086f90613723565b60405180910390fd5b600760009054906101000a900460ff166108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be9061378f565b60405180910390fd5b6108f07f7745544800000000000000000000000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561093757600080fd5b505af115801561094b573d6000803e3d6000fd5b505050505060019050919050565b60095481565b61096761170a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109f357506109c47f57686974656c6973746f6f720000000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a29906137fb565b60405180910390fd5b610a3b82610cee565b15610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7290613867565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167fb736c435d5dfd124d84806df2cec66a698f35b05432b1640f016ef2c12abc44182604051610b059190612fd4565b60405180910390a25050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600760009054906101000a900460ff1681565b6000610b6b612ab5565b73ffffffffffffffffffffffffffffffffffffffff16610b8961170a565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690613723565b60405180910390fd5b600760009054906101000a900460ff16610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c259061378f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673a91322497ff23cda7ac18d596d30d6f00ad66a20634cdfa50790918585306040518563ffffffff1660e01b8152600401610ca59493929190613975565b602060405180830381865af4158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce691906139dd565b905092915050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b60085481565b610d47612ab5565b73ffffffffffffffffffffffffffffffffffffffff16610d6561170a565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613723565b60405180910390fd5b600760009054906101000a900460ff1615610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0290613a56565b60405180910390fd5b610e13612abd565b600760029054906101000a900460ff1615610eac57610e517f4665654469737472696275746f72000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff166108fc610e7f61025847612b9b90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610eaa573d6000803e3d6000fd5b505b6001600760006101000a81548160ff021916908315150217905550427f29db3deb62ef2036e5eb93aad68d2362aec0711af592cb365566603bd88651d4600954600a54604051610efd929190613a76565b60405180910390a2565b6000610f32600a54610f2460095485612bb190919063ffffffff16565b612b9b90919063ffffffff16565b9050919050565b610f41612ab5565b73ffffffffffffffffffffffffffffffffffffffff16610f5f61170a565b73ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613723565b60405180910390fd5b600760009054906101000a900460ff16611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061378f565b60405180910390fd5b60005b815181101561114b57600082828151811061102557611024613a9f565b5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161106a9190613130565b602060405180830381865afa158015611087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ab9190613ae3565b90506000811115611136578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b81526004016110f1929190613b10565b6020604051808303816000875af1158015611110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113491906139dd565b505b5050808061114390613b68565b915050611007565b50600047905060008111156111a2578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a0573d6000803e3d6000fd5b505b505050565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111e2612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661120061170a565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90613723565b60405180910390fd5b6112606000612bc7565b565b600061126c612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661128a61170a565b73ffffffffffffffffffffffffffffffffffffffff16146112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d790613723565b60405180910390fd5b600760009054906101000a900460ff1661132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061378f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673a91322497ff23cda7ac18d596d30d6f00ad66a2063cedcddd190918585306040518563ffffffff1660e01b81526004016113a69493929190613bc0565b602060405180830381865af41580156113c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e791906139dd565b905092915050565b60006113f9612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661141761170a565b73ffffffffffffffffffffffffffffffffffffffff161461146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146490613723565b60405180910390fd5b600760009054906101000a900460ff166114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061378f565b60405180910390fd5b6114e57f7745544800000000000000000000000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040161151d9190612fd4565b600060405180830381600087803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b5050505060019050919050565b61156061170a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115ec57506115bd7f57686974656c6973746f6f720000000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61162b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611622906137fb565b60405180910390fd5b61163481610cee565b611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90613c51565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fb736c435d5dfd124d84806df2cec66a698f35b05432b1640f016ef2c12abc44160006040516116ff9190613cac565b60405180910390a250565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061173d612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661175b61170a565b73ffffffffffffffffffffffffffffffffffffffff16146117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890613723565b60405180910390fd5b600760009054906101000a900460ff16611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f79061378f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673a91322497ff23cda7ac18d596d30d6f00ad66a2063331d2ffa9091868686306040518663ffffffff1660e01b8152600401611879959493929190613cc7565b602060405180830381865af4158015611896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ba91906139dd565b90509392505050565b60006118ee6009546118e0600a5485612bb190919063ffffffff16565b612b9b90919063ffffffff16565b9050919050565b6118fd612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661191b61170a565b73ffffffffffffffffffffffffffffffffffffffff1614611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613723565b60405180910390fd5b80600760026101000a81548160ff02191690831515021790555050565b611996612ab5565b73ffffffffffffffffffffffffffffffffffffffff166119b461170a565b73ffffffffffffffffffffffffffffffffffffffff1614611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613723565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760029054906101000a900460ff1681565b611a69612ab5565b73ffffffffffffffffffffffffffffffffffffffff16611a8761170a565b73ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613723565b60405180910390fd5b600760009054906101000a900460ff16611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b239061378f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673a91322497ff23cda7ac18d596d30d6f00ad66a2063a2375f149091306040518363ffffffff1660e01b8152600401611b9f929190613d1a565b602060405180830381865af4158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be091906139dd565b506000600267ffffffffffffffff811115611bfe57611bfd613161565b5b604051908082528060200260200182016040528015611c2c5781602001602082028036833780820191505090505b5090508281600081518110611c4457611c43613a9f565b5b6020026020010181815250508181600181518110611c6557611c64613a9f565b5b602002602001018181525050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673cdde6d08d775950a18c1a1f0b1c64a44c32db4f763901633e390918360053060066040518663ffffffff1660e01b8152600401611cec959493929190613fc4565b60006040518083038186803b158015611d0457600080fd5b505af4158015611d18573d6000803e3d6000fd5b50505050600047905060095481118015611d3e5750600760029054906101000a900460ff165b15611dda57611d6c7f4665654469737472696275746f72000000000000000000000000000000000000610b11565b73ffffffffffffffffffffffffffffffffffffffff166108fc611dad6005611d9f60095486612c8b90919063ffffffff16565b612b9b90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611dd8573d6000803e3d6000fd5b505b611de2612abd565b8515611e4e5760008511611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290614078565b60405180910390fd5b846008819055506001600760016101000a81548160ff0219169083151502179055505b6000600760006101000a81548160ff021916908315150217905550427f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2600954600a54604051611e9f929190613a76565b60405180910390a2505050505050565b611eb7612ab5565b73ffffffffffffffffffffffffffffffffffffffff16611ed561170a565b73ffffffffffffffffffffffffffffffffffffffff1614611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2290613723565b60405180910390fd5b600760009054906101000a900460ff16611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f719061378f565b60405180910390fd5b8215611fe65760008211611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba90614078565b60405180910390fd5b816008819055506001600760016101000a81548160ff0219169083151502179055505b806009819055506000600760006101000a81548160ff021916908315150217905550427f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2600954600a5460405161203e929190613a76565b60405180910390a2505050565b600a5481565b60026001541415612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e906140e4565b60405180910390fd5b6002600181905550600760009054906101000a900460ff16156120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690613a56565b60405180910390fd5b60008111612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990614078565b60405180910390fd5b80600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161218e9190613130565b602060405180830381865afa1580156121ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cf9190613ae3565b1015612210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220790614150565b60405180910390fd5b600061221b82610f07565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161227a929190613b10565b600060405180830381600087803b15801561229457600080fd5b505af11580156122a8573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156122f2573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a828460405161233b929190613a76565b60405180910390a2506001808190555050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016123ac9190613130565b602060405180830381865afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190613ae3565b905060008111156124095761240181610f07565b91505061240f565b60009150505b919050565b61241c612ab5565b73ffffffffffffffffffffffffffffffffffffffff1661243a61170a565b73ffffffffffffffffffffffffffffffffffffffff1614612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790613723565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f7906141e2565b60405180910390fd5b61250981612bc7565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760019054906101000a900460ff1681565b6002600154141561258b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612582906140e4565b60405180910390fd5b6002600181905550600760009054906101000a900460ff16156125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90613a56565b60405180910390fd5b8034101580156125f35750600081115b612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614078565b60405180910390fd5b600760019054906101000a900460ff16156128575761265033610cee565b156127fe57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90614078565b60405180910390fd5b61272981600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c8b90919063ffffffff16565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fb736c435d5dfd124d84806df2cec66a698f35b05432b1640f016ef2c12abc441600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516127f19190612fd4565b60405180910390a2612856565b6008546128143447612ca190919063ffffffff16565b1115612855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284c9061424e565b60405180910390fd5b5b5b6000612862826118c3565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b81526004016128c1929190613b10565b600060405180830381600087803b1580156128db57600080fd5b505af11580156128ef573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca828460405161293b929190613a76565b60405180910390a2506001808190555050565b60008114806129d8575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161299592919061426e565b602060405180830381865afa1580156129b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d69190613ae3565b145b612a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0e90614309565b60405180910390fd5b612a988363095ea7b360e01b8484604051602401612a36929190613b10565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612cb7565b505050565b6060612aac8484600085612d7e565b90509392505050565b600033905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4e9190613ae3565b600a8190555047600981905550427f4721c31db00d4c86f3effcb9b553c869ce768e138eaf7a09cea387ffb5d9da33600954600a54604051612b91929190613a76565b60405180910390a2565b60008183612ba99190614358565b905092915050565b60008183612bbf9190614389565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612c9991906143e3565b905092915050565b60008183612caf9190614417565b905092915050565b6000612d19826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a9d9092919063ffffffff16565b9050600081511115612d795780806020019051810190612d3991906139dd565b612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f906144df565b60405180910390fd5b5b505050565b606082471015612dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dba90614571565b60405180910390fd5b612dcc85612e92565b612e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e02906145dd565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e349190614677565b60006040518083038185875af1925050503d8060008114612e71576040519150601f19603f3d011682016040523d82523d6000602084013e612e76565b606091505b5091509150612e86828286612eb5565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612ec557829050612f15565b600083511115612ed85782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0c91906146d2565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f5b82612f30565b9050919050565b612f6b81612f50565b8114612f7657600080fd5b50565b600081359050612f8881612f62565b92915050565b600060208284031215612fa457612fa3612f26565b5b6000612fb284828501612f79565b91505092915050565b6000819050919050565b612fce81612fbb565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b612ff881612fbb565b811461300357600080fd5b50565b60008135905061301581612fef565b92915050565b60006020828403121561303157613030612f26565b5b600061303f84828501613006565b91505092915050565b60008115159050919050565b61305d81613048565b82525050565b60006020820190506130786000830184613054565b92915050565b6000806040838503121561309557613094612f26565b5b60006130a385828601612f79565b92505060206130b485828601613006565b9150509250929050565b6000819050919050565b6130d1816130be565b81146130dc57600080fd5b50565b6000813590506130ee816130c8565b92915050565b60006020828403121561310a57613109612f26565b5b6000613118848285016130df565b91505092915050565b61312a81612f50565b82525050565b60006020820190506131456000830184613121565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61319982613150565b810181811067ffffffffffffffff821117156131b8576131b7613161565b5b80604052505050565b60006131cb612f1c565b90506131d78282613190565b919050565b600067ffffffffffffffff8211156131f7576131f6613161565b5b602082029050602081019050919050565b600080fd5b600061322061321b846131dc565b6131c1565b9050808382526020820190506020840283018581111561324357613242613208565b5b835b8181101561326c57806132588882613006565b845260208401935050602081019050613245565b5050509392505050565b600082601f83011261328b5761328a61314b565b5b813561329b84826020860161320d565b91505092915050565b600080604083850312156132bb576132ba612f26565b5b600083013567ffffffffffffffff8111156132d9576132d8612f2b565b5b6132e585828601613276565b925050602083013567ffffffffffffffff81111561330657613305612f2b565b5b61331285828601613276565b9150509250929050565b600067ffffffffffffffff82111561333757613336613161565b5b602082029050602081019050919050565b600061335b6133568461331c565b6131c1565b9050808382526020820190506020840283018581111561337e5761337d613208565b5b835b818110156133a757806133938882612f79565b845260208401935050602081019050613380565b5050509392505050565b600082601f8301126133c6576133c561314b565b5b81356133d6848260208601613348565b91505092915050565b600080604083850312156133f6576133f5612f26565b5b600061340485828601612f79565b925050602083013567ffffffffffffffff81111561342557613424612f2b565b5b613431858286016133b1565b9150509250929050565b6000806040838503121561345257613451612f26565b5b600061346085828601613006565b925050602061347185828601613006565b9150509250929050565b60008060006060848603121561349457613493612f26565b5b60006134a286828701613006565b93505060206134b386828701613006565b92505060406134c486828701613006565b9150509250925092565b6134d781613048565b81146134e257600080fd5b50565b6000813590506134f4816134ce565b92915050565b6000602082840312156135105761350f612f26565b5b600061351e848285016134e5565b91505092915050565b600061353282612f50565b9050919050565b61354281613527565b811461354d57600080fd5b50565b60008135905061355f81613539565b92915050565b60006020828403121561357b5761357a612f26565b5b600061358984828501613550565b91505092915050565b600080600080608085870312156135ac576135ab612f26565b5b60006135ba878288016134e5565b94505060206135cb87828801613006565b93505060406135dc87828801613006565b92505060606135ed87828801613006565b91505092959194509250565b60008060006060848603121561361257613611612f26565b5b6000613620868287016134e5565b935050602061363186828701613006565b925050604061364286828701613006565b9150509250925092565b6000819050919050565b600061367161366c61366784612f30565b61364c565b612f30565b9050919050565b600061368382613656565b9050919050565b600061369582613678565b9050919050565b6136a58161368a565b82525050565b60006020820190506136c0600083018461369c565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061370d6020836136c6565b9150613718826136d7565b602082019050919050565b6000602082019050818103600083015261373c81613700565b9050919050565b7f5645370000000000000000000000000000000000000000000000000000000000600082015250565b60006137796003836136c6565b915061378482613743565b602082019050919050565b600060208201905081810360008301526137a88161376c565b9050919050565b7f5645390000000000000000000000000000000000000000000000000000000000600082015250565b60006137e56003836136c6565b91506137f0826137af565b602082019050919050565b60006020820190508181036000830152613814816137d8565b9050919050565b7f5645350000000000000000000000000000000000000000000000000000000000600082015250565b60006138516003836136c6565b915061385c8261381b565b602082019050919050565b6000602082019050818103600083015261388081613844565b9050919050565b600061389282613678565b9050919050565b6138a281613887565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138dd81612fbb565b82525050565b60006138ef83836138d4565b60208301905092915050565b6000602082019050919050565b6000613913826138a8565b61391d81856138b3565b9350613928836138c4565b8060005b8381101561395957815161394088826138e3565b975061394b836138fb565b92505060018101905061392c565b5085935050505092915050565b61396f81612f50565b82525050565b600060808201905061398a6000830187613899565b818103602083015261399c8186613908565b905081810360408301526139b08185613908565b90506139bf6060830184613966565b95945050505050565b6000815190506139d7816134ce565b92915050565b6000602082840312156139f3576139f2612f26565b5b6000613a01848285016139c8565b91505092915050565b7f5645380000000000000000000000000000000000000000000000000000000000600082015250565b6000613a406003836136c6565b9150613a4b82613a0a565b602082019050919050565b60006020820190508181036000830152613a6f81613a33565b9050919050565b6000604082019050613a8b6000830185612fc5565b613a986020830184612fc5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613add81612fef565b92915050565b600060208284031215613af957613af8612f26565b5b6000613b0784828501613ace565b91505092915050565b6000604082019050613b256000830185613121565b613b326020830184612fc5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b7382612fbb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ba657613ba5613b39565b5b600182019050919050565b613bba81612fbb565b82525050565b6000608082019050613bd56000830187613899565b613be26020830186613bb1565b613bef6040830185613bb1565b613bfc6060830184613966565b95945050505050565b7f5645360000000000000000000000000000000000000000000000000000000000600082015250565b6000613c3b6003836136c6565b9150613c4682613c05565b602082019050919050565b60006020820190508181036000830152613c6a81613c2e565b9050919050565b6000819050919050565b6000613c96613c91613c8c84613c71565b61364c565b612fbb565b9050919050565b613ca681613c7b565b82525050565b6000602082019050613cc16000830184613c9d565b92915050565b600060a082019050613cdc6000830188613899565b613ce96020830187613bb1565b613cf66040830186613bb1565b613d036060830185613bb1565b613d106080830184613966565b9695505050505050565b6000604082019050613d2f6000830185613899565b613d3c6020830184613966565b9392505050565b6000613d4e82613678565b9050919050565b613d5e81613d43565b82525050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b613d9e81612f50565b82525050565b6000613db08383613d95565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dfc613df783613dbc565b613dc9565b9050919050565b6000613e0f8254613de9565b9050919050565b6000600182019050919050565b6000613e2e82613d64565b613e388185613d6f565b9350613e4383613d80565b8060005b83811015613e7b57613e5882613e03565b613e628882613da4565b9750613e6d83613e16565b925050600181019050613e47565b5085935050505092915050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b600082825260208201905092915050565b6000613ed582613d64565b613edf8185613eb9565b9350613eea83613d80565b8060005b83811015613f2257613eff82613e03565b613f098882613da4565b9750613f1483613e16565b925050600181019050613eee565b5085935050505092915050565b6000613f3b8383613eca565b905092915050565b6000600182019050919050565b6000613f5b82613e88565b613f658185613e93565b935083602082028501613f7785613ea4565b8060005b85811015613fb257848403895281613f938582613f2f565b9450613f9e83613f43565b925060208a01995050600181019050613f7b565b50829750879550505050505092915050565b600060a082019050613fd96000830188613d55565b8181036020830152613feb8187613908565b90508181036040830152613fff8186613e23565b905061400e6060830185613966565b81810360808301526140208184613f50565b90509695505050505050565b7f5645320000000000000000000000000000000000000000000000000000000000600082015250565b60006140626003836136c6565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140ce601f836136c6565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f5645340000000000000000000000000000000000000000000000000000000000600082015250565b600061413a6003836136c6565b915061414582614104565b602082019050919050565b600060208201905081810360008301526141698161412d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141cc6026836136c6565b91506141d782614170565b604082019050919050565b600060208201905081810360008301526141fb816141bf565b9050919050565b7f5645330000000000000000000000000000000000000000000000000000000000600082015250565b60006142386003836136c6565b915061424382614202565b602082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b60006040820190506142836000830185613121565b6142906020830184613121565b9392505050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b60006142f36036836136c6565b91506142fe82614297565b604082019050919050565b60006020820190508181036000830152614322816142e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061436382612fbb565b915061436e83612fbb565b92508261437e5761437d614329565b5b828204905092915050565b600061439482612fbb565b915061439f83612fbb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143d8576143d7613b39565b5b828202905092915050565b60006143ee82612fbb565b91506143f983612fbb565b92508282101561440c5761440b613b39565b5b828203905092915050565b600061442282612fbb565b915061442d83612fbb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561446257614461613b39565b5b828201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006144c9602a836136c6565b91506144d48261446d565b604082019050919050565b600060208201905081810360008301526144f8816144bc565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061455b6026836136c6565b9150614566826144ff565b604082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006145c7601d836136c6565b91506145d282614591565b602082019050919050565b600060208201905081810360008301526145f6816145ba565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015614631578082015181840152602081019050614616565b83811115614640576000848401525b50505050565b6000614651826145fd565b61465b8185614608565b935061466b818560208601614613565b80840191505092915050565b60006146838284614646565b915081905092915050565b600081519050919050565b60006146a48261468e565b6146ae81856136c6565b93506146be818560208601614613565b6146c781613150565b840191505092915050565b600060208201905081810360008301526146ec8184614699565b90509291505056fea26469706673582212202a4647de18b6ab5f58ffdad0606119d40f98c68c821365b6027a489ea800ed0564736f6c634300080a0033000000000000000000000000662d0f9ff837a51cf89a1fe7e0882a906dac08a30000000000000000000000002c9c1e9b4bdf6bf9cb59c77e0e8c0892ce3a9d5f000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d90774000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d907740000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee100000000000000000000000000000000000000000000003bb4dde06cc6cc5b0000000000000000000000000000000000000000000000003bb4dde06cc6cc5b00

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

000000000000000000000000662d0f9ff837a51cf89a1fe7e0882a906dac08a30000000000000000000000002c9c1e9b4bdf6bf9cb59c77e0e8c0892ce3a9d5f000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d90774000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d907740000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee100000000000000000000000000000000000000000000003bb4dde06cc6cc5b0000000000000000000000000000000000000000000000003bb4dde06cc6cc5b00

-----Decoded View---------------
Arg [0] : _jonesAsset (address): 0x662d0f9ff837a51cf89a1fe7e0882a906dac08a3
Arg [1] : _SSOV (address): 0x2c9c1e9b4bdf6bf9cb59c77e0e8c0892ce3a9d5f
Arg [2] : _aumMultisigAddr (address): 0xdd0556ddcfe7cdab3540e7f09cb366f498d90774
Arg [3] : _feeDistributor (address): 0xdd0556ddcfe7cdab3540e7f09cb366f498d90774
Arg [4] : _externalWhitelister (address): 0x4817ca4df701d554d78aa3d142b62c162c682ee1
Arg [5] : _snapshotVaultBalance (uint256): 1101390720003340000000
Arg [6] : _snapshotJonesAssetSupply (uint256): 1101390720003340000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000662d0f9ff837a51cf89a1fe7e0882a906dac08a3
Arg [1] : 0000000000000000000000002c9c1e9b4bdf6bf9cb59c77e0e8c0892ce3a9d5f
Arg [2] : 000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d90774
Arg [3] : 000000000000000000000000dd0556ddcfe7cdab3540e7f09cb366f498d90774
Arg [4] : 0000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee1
Arg [5] : 00000000000000000000000000000000000000000000003bb4dde06cc6cc5b00
Arg [6] : 00000000000000000000000000000000000000000000003bb4dde06cc6cc5b00


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.