ETH Price: $3,093.27 (-1.30%)

Contract

0x7D55C795359eB049FF482c8Bd5E0523F0fB40B6f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw135217882021-10-31 0:59:001116 days ago1635641940IN
0x7D55C795...F0fB40B6f
0 ETH0.09357698122.6226026
Harvest135216702021-10-31 0:32:201116 days ago1635640340IN
0x7D55C795...F0fB40B6f
0 ETH0.17878119157.20925382
Withdraw135025972021-10-28 0:42:081119 days ago1635381728IN
0x7D55C795...F0fB40B6f
0 ETH0.14999839195.84311708
Harvest135025572021-10-28 0:30:461119 days ago1635381046IN
0x7D55C795...F0fB40B6f
0 ETH0.17165944150.4786667
Withdraw134834702021-10-25 0:51:171122 days ago1635123077IN
0x7D55C795...F0fB40B6f
0 ETH0.0467491261.29006568
Harvest134833782021-10-25 0:30:111122 days ago1635121811IN
0x7D55C795...F0fB40B6f
0 ETH0.0646658156.38072476
Withdraw134643932021-10-22 0:56:261125 days ago1634864186IN
0x7D55C795...F0fB40B6f
0 ETH0.0595559378.08034008
Harvest134643342021-10-22 0:45:221125 days ago1634863522IN
0x7D55C795...F0fB40B6f
0 ETH0.16784865146.34360903
Withdraw134450902021-10-19 0:54:141128 days ago1634604854IN
0x7D55C795...F0fB40B6f
0 ETH0.0421788556.21763685
Skim134450252021-10-19 0:39:031128 days ago1634603943IN
0x7D55C795...F0fB40B6f
0 ETH0.0074696962.30401663
Harvest134449932021-10-19 0:31:021128 days ago1634603462IN
0x7D55C795...F0fB40B6f
0 ETH0.0756359167.29682873
Withdraw134258742021-10-16 0:40:111131 days ago1634344811IN
0x7D55C795...F0fB40B6f
0 ETH0.09444169125.87560015
Harvest134258392021-10-16 0:30:451131 days ago1634344245IN
0x7D55C795...F0fB40B6f
0 ETH0.14501506127.8257045
Withdraw134069162021-10-13 0:41:291134 days ago1634085689IN
0x7D55C795...F0fB40B6f
0 ETH0.0736461399.8180223
Harvest134068842021-10-13 0:32:011134 days ago1634085121IN
0x7D55C795...F0fB40B6f
0 ETH0.074221166.77916557
Harvest133878762021-10-10 0:58:141137 days ago1633827494IN
0x7D55C795...F0fB40B6f
0 ETH0.0549960248.6863227
Withdraw133878002021-10-10 0:40:221137 days ago1633826422IN
0x7D55C795...F0fB40B6f
0 ETH0.0415514656.31775583
Invest133877932021-10-10 0:39:081137 days ago1633826348IN
0x7D55C795...F0fB40B6f
0 ETH0.0487867960.46013939
Harvest133877552021-10-10 0:30:191137 days ago1633825819IN
0x7D55C795...F0fB40B6f
0 ETH0.0846030575.4037282
Withdraw133688532021-10-07 1:12:571140 days ago1633569177IN
0x7D55C795...F0fB40B6f
0 ETH0.10429033123.17635036
Withdraw133688102021-10-07 1:03:411140 days ago1633568621IN
0x7D55C795...F0fB40B6f
0 ETH0.10025254133.62961607
Harvest133687982021-10-07 1:01:111140 days ago1633568471IN
0x7D55C795...F0fB40B6f
0 ETH0.13945355118.14913991
Withdraw133687972021-10-07 1:01:051140 days ago1633568465IN
0x7D55C795...F0fB40B6f
0 ETH0.08849542119.49588995
Withdraw133687222021-10-07 0:43:381140 days ago1633567418IN
0x7D55C795...F0fB40B6f
0 ETH0.06400548128.44820659
Skim133686852021-10-07 0:35:261140 days ago1633566926IN
0x7D55C795...F0fB40B6f
0 ETH0.02127202147.00979573
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Controller

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2021-03-11
*/

// File: @openzeppelin/contracts/math/SafeMath.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.6.11;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint a, uint b) internal pure returns (bool, uint) {
        uint 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(uint a, uint b) internal pure returns (bool, uint) {
        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(uint a, uint b) internal pure returns (bool, uint) {
        // 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);
        uint 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(uint a, uint b) internal pure returns (bool, uint) {
        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(uint a, uint b) internal pure returns (bool, uint) {
        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(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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(uint a, uint b) internal pure returns (uint) {
        require(b <= a, "SafeMath: subtraction overflow");
        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(uint a, uint b) internal pure returns (uint) {
        if (a == 0) return 0;
        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: division by zero");
        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(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: modulo by zero");
        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(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        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(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

/**
 * @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 (uint);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint 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 (uint);

    /**
     * @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, uint amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` 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 sender,
        address recipient,
        uint 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, uint 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, uint value);
}

// File: contracts/protocol/IController.sol

interface IController {
    function ADMIN_ROLE() external view returns (bytes32);

    function HARVESTER_ROLE() external view returns (bytes32);

    function admin() external view returns (address);

    function treasury() external view returns (address);

    function setAdmin(address _admin) external;

    function setTreasury(address _treasury) external;

    function grantRole(bytes32 _role, address _addr) external;

    function revokeRole(bytes32 _role, address _addr) external;

    /*
    @notice Set strategy for vault
    @param _vault Address of vault
    @param _strategy Address of strategy
    @param _min Minimum undelying token current strategy must return. Prevents slippage
    */
    function setStrategy(
        address _vault,
        address _strategy,
        uint _min
    ) external;

    // calls to strategy
    /*
    @notice Invest token in vault into strategy
    @param _vault Address of vault
    */
    function invest(address _vault) external;

    function harvest(address _strategy) external;

    function skim(address _strategy) external;

    /*
    @notice Withdraw from strategy to vault
    @param _strategy Address of strategy
    @param _amount Amount of underlying token to withdraw
    @param _min Minimum amount of underlying token to withdraw
    */
    function withdraw(
        address _strategy,
        uint _amount,
        uint _min
    ) external;

    /*
    @notice Withdraw all from strategy to vault
    @param _strategy Address of strategy
    @param _min Minimum amount of underlying token to withdraw
    */
    function withdrawAll(address _strategy, uint _min) external;

    /*
    @notice Exit from strategy
    @param _strategy Address of strategy
    @param _min Minimum amount of underlying token to withdraw
    */
    function exit(address _strategy, uint _min) external;
}

// File: contracts/protocol/IVault.sol

/*
version 1.2.0

Changes
- function deposit(uint) declared in IERC20Vault
*/

interface IVault {
    function admin() external view returns (address);

    function controller() external view returns (address);

    function timeLock() external view returns (address);

    /*
    @notice For EthVault, must return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
    */
    function token() external view returns (address);

    function strategy() external view returns (address);

    function strategies(address _strategy) external view returns (bool);

    function reserveMin() external view returns (uint);

    function withdrawFee() external view returns (uint);

    function paused() external view returns (bool);

    function whitelist(address _addr) external view returns (bool);

    function setWhitelist(address _addr, bool _approve) external;

    function setAdmin(address _admin) external;

    function setController(address _controller) external;

    function setTimeLock(address _timeLock) external;

    function setPause(bool _paused) external;

    function setReserveMin(uint _reserveMin) external;

    function setWithdrawFee(uint _fee) external;

    /*
    @notice Returns the amount of asset (ETH or ERC20) in the vault
    */
    function balanceInVault() external view returns (uint);

    /*
    @notice Returns the estimate amount of asset in strategy
    @dev Output may vary depending on price of liquidity provider token
         where the underlying asset is invested
    */
    function balanceInStrategy() external view returns (uint);

    /*
    @notice Returns amount of tokens invested strategy
    */
    function totalDebtInStrategy() external view returns (uint);

    /*
    @notice Returns the total amount of asset in vault + total debt
    */
    function totalAssets() external view returns (uint);

    /*
    @notice Returns minimum amount of tokens that should be kept in vault for
            cheap withdraw
    @return Reserve amount
    */
    function minReserve() external view returns (uint);

    /*
    @notice Returns the amount of tokens available to be invested
    */
    function availableToInvest() external view returns (uint);

    /*
    @notice Approve strategy
    @param _strategy Address of strategy
    */
    function approveStrategy(address _strategy) external;

    /*
    @notice Revoke strategy
    @param _strategy Address of strategy
    */
    function revokeStrategy(address _strategy) external;

    /*
    @notice Set strategy
    @param _min Minimum undelying asset current strategy must return. Prevents slippage
    */
    function setStrategy(address _strategy, uint _min) external;

    /*
    @notice Transfers asset in vault to strategy
    */
    function invest() external;

    /*
    @notice Calculate amount of asset that can be withdrawn
    @param _shares Amount of shares
    @return Amount of asset that can be withdrawn
    */
    function getExpectedReturn(uint _shares) external view returns (uint);

    /*
    @notice Withdraw asset
    @param _shares Amount of shares to burn
    @param _min Minimum amount of asset expected to return
    */
    function withdraw(uint _shares, uint _min) external;

    /*
    @notice Transfer asset in vault to admin
    @param _token Address of asset to transfer
    @dev _token must not be equal to vault asset
    */
    function sweep(address _token) external;
}

// File: contracts/protocol/IStrategy.sol

/*
version 1.2.0

Changes

Changes listed here do not affect interaction with other contracts (Vault and Controller)
- removed function assets(address _token) external view returns (bool);
- remove function deposit(uint), declared in IStrategyERC20
- add function setSlippage(uint _slippage);
- add function setDelta(uint _delta);
*/

interface IStrategy {
    function admin() external view returns (address);

    function controller() external view returns (address);

    function vault() external view returns (address);

    /*
    @notice Returns address of underlying asset (ETH or ERC20)
    @dev Must return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for ETH strategy
    */
    function underlying() external view returns (address);

    /*
    @notice Returns total amount of underlying transferred from vault
    */
    function totalDebt() external view returns (uint);

    function performanceFee() external view returns (uint);

    function slippage() external view returns (uint);

    /* 
    @notice Multiplier used to check total underlying <= total debt * delta / DELTA_MIN
    */
    function delta() external view returns (uint);

    /*
    @dev Flag to force exit in case normal exit fails
    */
    function forceExit() external view returns (bool);

    function setAdmin(address _admin) external;

    function setController(address _controller) external;

    function setPerformanceFee(uint _fee) external;

    function setSlippage(uint _slippage) external;

    function setDelta(uint _delta) external;

    function setForceExit(bool _forceExit) external;

    /*
    @notice Returns amount of underlying asset locked in this contract
    @dev Output may vary depending on price of liquidity provider token
         where the underlying asset is invested
    */
    function totalAssets() external view returns (uint);

    /*
    @notice Withdraw `_amount` underlying asset
    @param amount Amount of underlying asset to withdraw
    */
    function withdraw(uint _amount) external;

    /*
    @notice Withdraw all underlying asset from strategy
    */
    function withdrawAll() external;

    /*
    @notice Sell any staking rewards for underlying and then deposit undelying
    */
    function harvest() external;

    /*
    @notice Increase total debt if profit > 0 and total assets <= max,
            otherwise transfers profit to vault.
    @dev Guard against manipulation of external price feed by checking that
         total assets is below factor of total debt
    */
    function skim() external;

    /*
    @notice Exit from strategy
    @dev Must transfer all underlying tokens back to vault
    */
    function exit() external;

    /*
    @notice Transfer token accidentally sent here to admin
    @param _token Address of token to transfer
    @dev _token must not be equal to underlying token
    */
    function sweep(address _token) external;
}

// File: contracts/AccessControl.sol

contract AccessControl {
    event GrantRole(bytes32 indexed role, address indexed addr);
    event RevokeRole(bytes32 indexed role, address indexed addr);

    mapping(bytes32 => mapping(address => bool)) public hasRole;

    modifier onlyAuthorized(bytes32 _role) {
        require(hasRole[_role][msg.sender], "!authorized");
        _;
    }

    function _grantRole(bytes32 _role, address _addr) internal {
        require(_addr != address(0), "address = zero");

        hasRole[_role][_addr] = true;

        emit GrantRole(_role, _addr);
    }

    function _revokeRole(bytes32 _role, address _addr) internal {
        require(_addr != address(0), "address = zero");

        hasRole[_role][_addr] = false;

        emit RevokeRole(_role, _addr);
    }
}

// File: contracts/Controller.sol

/*
version 1.2.0

Changes from Controller 1.1.0
- Check vault and strategy are approved by admin.
  Protect from arbitrary contract to be passed into invest, harvest, skim, etc...
- compatible with ERC20 and ETH vault / strategy
  (checks withdraw min for ERC20 and ETH strategies)
- add setStrategyAndInvest
*/

contract Controller is IController, AccessControl {
    using SafeMath for uint;

    event ApproveVault(address vault, bool approved);
    event ApproveStrategy(address strategy, bool approved);

    // WARNING: not address of ETH, used as placeholder
    address private constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    // keccak256(abi.encodePacked("ADMIN"));
    bytes32 public constant override ADMIN_ROLE =
        0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42;
    // keccak256(abi.encodePacked("HARVESTER"));
    bytes32 public constant override HARVESTER_ROLE =
        0x27e3e4d29d60af3ae6456513164bb5db737d6fc8610aa36ad458736c9efb884c;

    address public override admin;
    // treasury must be able to receive ETH from ETH vault and strategy
    address public override treasury;

    // approved vaults
    mapping(address => bool) public vaults;
    // approved strategies
    mapping(address => bool) public strategies;

    constructor(address _treasury) public {
        require(_treasury != address(0), "treasury = zero address");

        admin = msg.sender;
        treasury = _treasury;

        _grantRole(ADMIN_ROLE, admin);
        _grantRole(HARVESTER_ROLE, admin);
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "!admin");
        _;
    }

    modifier onlyApprovedVault(address _vault) {
        require(vaults[_vault], "!approved vault");
        _;
    }

    modifier onlyApprovedStrategy(address _strategy) {
        require(strategies[_strategy], "!approved strategy");
        _;
    }

    modifier isCurrentStrategy(address _strategy) {
        address vault = IStrategy(_strategy).vault();
        /*
        Check that _strategy is the current strategy used by the vault.
        */
        require(IVault(vault).strategy() == _strategy, "!strategy");
        _;
    }

    function setAdmin(address _admin) external override onlyAdmin {
        require(_admin != address(0), "admin = zero address");

        _revokeRole(ADMIN_ROLE, admin);
        _revokeRole(HARVESTER_ROLE, admin);

        _grantRole(ADMIN_ROLE, _admin);
        _grantRole(HARVESTER_ROLE, _admin);

        admin = _admin;
    }

    function setTreasury(address _treasury) external override onlyAdmin {
        require(_treasury != address(0), "treasury = zero address");
        treasury = _treasury;
    }

    function grantRole(bytes32 _role, address _addr) external override onlyAdmin {
        require(_role == ADMIN_ROLE || _role == HARVESTER_ROLE, "invalid role");
        _grantRole(_role, _addr);
    }

    function revokeRole(bytes32 _role, address _addr) external override onlyAdmin {
        require(_role == ADMIN_ROLE || _role == HARVESTER_ROLE, "invalid role");
        _revokeRole(_role, _addr);
    }

    function approveVault(address _vault) external onlyAdmin {
        require(!vaults[_vault], "already approved vault");
        vaults[_vault] = true;
        emit ApproveVault(_vault, true);
    }

    function revokeVault(address _vault) external onlyAdmin {
        require(vaults[_vault], "!approved vault");
        vaults[_vault] = false;
        emit ApproveVault(_vault, false);
    }

    function approveStrategy(address _strategy) external onlyAdmin {
        require(!strategies[_strategy], "already approved strategy");
        strategies[_strategy] = true;
        emit ApproveStrategy(_strategy, true);
    }

    function revokeStrategy(address _strategy) external onlyAdmin {
        require(strategies[_strategy], "!approved strategy");
        strategies[_strategy] = false;
        emit ApproveStrategy(_strategy, false);
    }

    function setStrategy(
        address _vault,
        address _strategy,
        uint _min
    )
        external
        override
        onlyAuthorized(ADMIN_ROLE)
        onlyApprovedVault(_vault)
        onlyApprovedStrategy(_strategy)
    {
        IVault(_vault).setStrategy(_strategy, _min);
    }

    function invest(address _vault)
        external
        override
        onlyAuthorized(HARVESTER_ROLE)
        onlyApprovedVault(_vault)
    {
        IVault(_vault).invest();
    }

    /*
    @notice Set strategy for vault and invest
    @param _vault Address of vault
    @param _strategy Address of strategy
    @param _min Minimum undelying token current strategy must return. Prevents slippage
    @dev Set strategy and invest in single transaction to avoid front running
    */
    function setStrategyAndInvest(
        address _vault,
        address _strategy,
        uint _min
    )
        external
        onlyAuthorized(ADMIN_ROLE)
        onlyApprovedVault(_vault)
        onlyApprovedStrategy(_strategy)
    {
        IVault(_vault).setStrategy(_strategy, _min);
        IVault(_vault).invest();
    }

    function harvest(address _strategy)
        external
        override
        onlyAuthorized(HARVESTER_ROLE)
        onlyApprovedStrategy(_strategy)
        isCurrentStrategy(_strategy)
    {
        IStrategy(_strategy).harvest();
    }

    function skim(address _strategy)
        external
        override
        onlyAuthorized(HARVESTER_ROLE)
        onlyApprovedStrategy(_strategy)
        isCurrentStrategy(_strategy)
    {
        IStrategy(_strategy).skim();
    }

    modifier checkWithdraw(address _strategy, uint _min) {
        address vault = IStrategy(_strategy).vault();
        address token = IVault(vault).token();

        uint balBefore;
        uint balAfter;
        if (token == ETH) {
            balBefore = address(vault).balance;
            _;
            balAfter = address(vault).balance;
        } else {
            balBefore = IERC20(token).balanceOf(vault);
            _;
            balAfter = IERC20(token).balanceOf(vault);
        }

        require(balAfter.sub(balBefore) >= _min, "withdraw < min");
    }

    function withdraw(
        address _strategy,
        uint _amount,
        uint _min
    )
        external
        override
        onlyAuthorized(HARVESTER_ROLE)
        onlyApprovedStrategy(_strategy)
        isCurrentStrategy(_strategy)
        checkWithdraw(_strategy, _min)
    {
        IStrategy(_strategy).withdraw(_amount);
    }

    function withdrawAll(address _strategy, uint _min)
        external
        override
        onlyAuthorized(HARVESTER_ROLE)
        onlyApprovedStrategy(_strategy)
        isCurrentStrategy(_strategy)
        checkWithdraw(_strategy, _min)
    {
        IStrategy(_strategy).withdrawAll();
    }

    function exit(address _strategy, uint _min)
        external
        override
        onlyAuthorized(ADMIN_ROLE)
        onlyApprovedStrategy(_strategy)
        isCurrentStrategy(_strategy)
        checkWithdraw(_strategy, _min)
    {
        IStrategy(_strategy).exit();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApproveStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApproveVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"GrantRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"RevokeRole","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HARVESTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"approveStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"approveVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_addr","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_addr","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"revokeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"revokeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"setStrategyAndInvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaults","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200293638038062002936833981810160405260208110156200003757600080fd5b50516001600160a01b03811662000095576040805162461bcd60e51b815260206004820152601760248201527f7472656173757279203d207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319908116331791829055600280546001600160a01b0385811691909316179055620000f8917fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4291166001600160e01b036200014116565b6001546200013a907f27e3e4d29d60af3ae6456513164bb5db737d6fc8610aa36ad458736c9efb884c906001600160a01b03166001600160e01b036200014116565b50620001e7565b6001600160a01b0381166200018e576040805162461bcd60e51b815260206004820152600e60248201526d61646472657373203d207a65726f60901b604482015290519081900360640190fd5b6000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b61273f80620001f76000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806391d14854116100c3578063cc6dbc271161007c578063cc6dbc27146103fa578063d547741f14610426578063e0cc0d6814610452578063ef693bed14610478578063f0f44260146104a4578063f851a440146104ca5761014d565b806391d1485414610304578063a622ee7c14610330578063b5c5f67214610356578063bb994d4814610388578063bc25cf77146103ae578063c3fb16ca146103d45761014d565b80633b8ae397116101155780633b8ae3971461023c57806361d027b31461026257806363a560ec14610286578063704b6c02146102a057806375b238fc146102c657806390a83dc2146102ce5761014d565b806303f9c793146101525780630e5c011e1461017a5780632d1e11ae146101a05780632f2ff15d146101d657806339ebf82314610202575b600080fd5b6101786004803603602081101561016857600080fd5b50356001600160a01b03166104d2565b005b6101786004803603602081101561019057600080fd5b50356001600160a01b03166105fa565b610178600480360360608110156101b657600080fd5b506001600160a01b0381358116916020810135909116906040013561084a565b610178600480360360408110156101ec57600080fd5b50803590602001356001600160a01b0316610a63565b6102286004803603602081101561021857600080fd5b50356001600160a01b0316610b22565b604080519115158252519081900360200190f35b6101786004803603602081101561025257600080fd5b50356001600160a01b0316610b37565b61026a610c4f565b604080516001600160a01b039092168252519081900360200190f35b61028e610c5e565b60408051918252519081900360200190f35b610178600480360360208110156102b657600080fd5b50356001600160a01b0316610c70565b61028e610da6565b610178600480360360608110156102e457600080fd5b506001600160a01b03813581169160208101359091169060400135610db8565b6102286004803603604081101561031a57600080fd5b50803590602001356001600160a01b0316610f5e565b6102286004803603602081101561034657600080fd5b50356001600160a01b0316610f7b565b6101786004803603606081101561036c57600080fd5b506001600160a01b038135169060208101359060400135610f90565b6101786004803603602081101561039e57600080fd5b50356001600160a01b03166114d7565b610178600480360360208110156103c457600080fd5b50356001600160a01b03166115df565b610178600480360360208110156103ea57600080fd5b50356001600160a01b0316611810565b6101786004803603604081101561041057600080fd5b506001600160a01b038135169060200135611915565b6101786004803603604081101561043c57600080fd5b50803590602001356001600160a01b0316611e49565b6101786004803603602081101561046857600080fd5b50356001600160a01b0316611f04565b6101786004803603604081101561048e57600080fd5b506001600160a01b038135169060200135612015565b610178600480360360208110156104ba57600080fd5b50356001600160a01b0316612431565b61026a6124f6565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610541576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054829060ff166105a2576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b826001600160a01b031663e8b5e51f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105dd57600080fd5b505af11580156105f1573d6000803e3d6000fd5b50505050505050565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610669576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040902054829060ff166106cd576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b826000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561070957600080fd5b505afa15801561071d573d6000803e3d6000fd5b505050506040513d602081101561073357600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561077d57600080fd5b505afa158015610791573d6000803e3d6000fd5b505050506040513d60208110156107a757600080fd5b50516001600160a01b0316146107f0576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b846001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050505050505050565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff166108cb576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260036020526040902054849060ff1661092c576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16610990576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b856001600160a01b03166345d34def86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156109f057600080fd5b505af1158015610a04573d6000803e3d6000fd5b50505050856001600160a01b031663e8b5e51f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b50505050505050505050565b6001546001600160a01b03163314610aab576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6000805160206126ca833981519152821480610ad457506000805160206126ea83398151915282145b610b14576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b604482015290519081900360640190fd5b610b1e8282612505565b5050565b60046020526000908152604090205460ff1681565b6001546001600160a01b03163314610b7f576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1615610bed576040805162461bcd60e51b815260206004820152601960248201527f616c726561647920617070726f76656420737472617465677900000000000000604482015290519081900360640190fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916600190811790915582519384529083015280517f106ec9ccb660562f4476566fb44a45e446adb3da3fbedee93f6a3c47a81fd5b89281900390910190a150565b6002546001600160a01b031681565b6000805160206126ea83398151915281565b6001546001600160a01b03163314610cb8576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b038116610d0a576040805162461bcd60e51b815260206004820152601460248201527361646d696e203d207a65726f206164647265737360601b604482015290519081900360640190fd5b600154610d2f906000805160206126ca833981519152906001600160a01b03166125aa565b600154610d54906000805160206126ea833981519152906001600160a01b03166125aa565b610d6c6000805160206126ca83398151915282612505565b610d846000805160206126ea83398151915282612505565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206126ca83398151915281565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff16610e39576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260036020526040902054849060ff16610e9a576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16610efe576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b856001600160a01b03166345d34def86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a4357600080fd5b600060208181529281526040808220909352908152205460ff1681565b60036020526000908152604090205460ff1681565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610fff576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16611063576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b846000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561109f57600080fd5b505afa1580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561111357600080fd5b505afa158015611127573d6000803e3d6000fd5b505050506040513d602081101561113d57600080fd5b50516001600160a01b031614611186576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b86856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d60208110156111ed57600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561130857836001600160a01b03163191508c6001600160a01b0316632e1a7d4d8d6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112de57600080fd5b505af11580156112f2573d6000803e3d6000fd5b50505050836001600160a01b0316319050611473565b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561135e57600080fd5b505afa158015611372573d6000803e3d6000fd5b505050506040513d602081101561138857600080fd5b505160408051632e1a7d4d60e01b8152600481018f905290519193506001600160a01b038f1691632e1a7d4d9160248082019260009290919082900301818387803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b50505050826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505190505b84611484828463ffffffff61264c16565b10156114c8576040805162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb901e1036b4b760911b604482015290519081900360640190fd5b50505050505050505050505050565b6001546001600160a01b0316331461151f576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff16611581576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b6001600160a01b0381166000818152600460209081526040808320805460ff1916905580519384529083019190915280517f106ec9ccb660562f4476566fb44a45e446adb3da3fbedee93f6a3c47a81fd5b89281900390910190a150565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff1661164e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040902054829060ff166116b2576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b826000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ee57600080fd5b505afa158015611702573d6000803e3d6000fd5b505050506040513d602081101561171857600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561176257600080fd5b505afa158015611776573d6000803e3d6000fd5b505050506040513d602081101561178c57600080fd5b50516001600160a01b0316146117d5576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b846001600160a01b0316631dd19cb46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561082b57600080fd5b6001546001600160a01b03163314611858576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff166118b7576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b0381166000818152600360209081526040808320805460ff1916905580519384529083019190915280517f75bccdece1e4559ef4e257924836e1c4753d974091eea18c968691b5c68aebec9281900390910190a150565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16611984576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902054839060ff166119e8576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b836000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d6020811015611a4e57600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b158015611a9857600080fd5b505afa158015611aac573d6000803e3d6000fd5b505050506040513d6020811015611ac257600080fd5b50516001600160a01b031614611b0b576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b85856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b158015611bba57600080fd5b505afa158015611bce573d6000803e3d6000fd5b505050506040513d6020811015611be457600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c8257836001600160a01b03163191508b6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505050836001600160a01b0316319050611de6565b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611cd857600080fd5b505afa158015611cec573d6000803e3d6000fd5b505050506040513d6020811015611d0257600080fd5b50516040805163429c145b60e11b815290519193506001600160a01b038e169163853828b69160048082019260009290919082900301818387803b158015611d4957600080fd5b505af1158015611d5d573d6000803e3d6000fd5b50505050826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d6020811015611de157600080fd5b505190505b84611df7828463ffffffff61264c16565b1015611e3b576040805162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb901e1036b4b760911b604482015290519081900360640190fd5b505050505050505050505050565b6001546001600160a01b03163314611e91576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6000805160206126ca833981519152821480611eba57506000805160206126ea83398151915282145b611efa576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b604482015290519081900360640190fd5b610b1e82826125aa565b6001546001600160a01b03163314611f4c576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff1615611fb3576040805162461bcd60e51b8152602060048201526016602482015275185b1c9958591e48185c1c1c9bdd9959081d985d5b1d60521b604482015290519081900360640190fd5b6001600160a01b038116600081815260036020908152604091829020805460ff1916600190811790915582519384529083015280517f75bccdece1e4559ef4e257924836e1c4753d974091eea18c968691b5c68aebec9281900390910190a150565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff16612096576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902054839060ff166120fa576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b836000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561213657600080fd5b505afa15801561214a573d6000803e3d6000fd5b505050506040513d602081101561216057600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b1580156121aa57600080fd5b505afa1580156121be573d6000803e3d6000fd5b505050506040513d60208110156121d457600080fd5b50516001600160a01b03161461221d576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b85856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225a57600080fd5b505afa15801561226e573d6000803e3d6000fd5b505050506040513d602081101561228457600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b1580156122cc57600080fd5b505afa1580156122e0573d6000803e3d6000fd5b505050506040513d60208110156122f657600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561236a57836001600160a01b03163191508b6001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5857600080fd5b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123c057600080fd5b505afa1580156123d4573d6000803e3d6000fd5b505050506040513d60208110156123ea57600080fd5b5051604080516374fd6c7760e11b815290519193506001600160a01b038e169163e9fad8ee9160048082019260009290919082900301818387803b158015611d4957600080fd5b6001546001600160a01b03163314612479576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b0381166124d4576040805162461bcd60e51b815260206004820152601760248201527f7472656173757279203d207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6001600160a01b038116612551576040805162461bcd60e51b815260206004820152600e60248201526d61646472657373203d207a65726f60901b604482015290519081900360640190fd5b6000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b6001600160a01b0381166125f6576040805162461bcd60e51b815260206004820152600e60248201526d61646472657373203d207a65726f60901b604482015290519081900360640190fd5b6000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000828211156126a3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe77d27d6fbf5dcac17020138a1f5f0c8485268fce16ec3f3861b2f3f4d1aeb4dbdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4227e3e4d29d60af3ae6456513164bb5db737d6fc8610aa36ad458736c9efb884ca26469706673582212207ca4f8346842c430b5647b345bfac0d6d4bd89788e049404a25b98200313886664736f6c634300060b00330000000000000000000000001c064ea662365c09c8e87242791dacbb90002605

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806391d14854116100c3578063cc6dbc271161007c578063cc6dbc27146103fa578063d547741f14610426578063e0cc0d6814610452578063ef693bed14610478578063f0f44260146104a4578063f851a440146104ca5761014d565b806391d1485414610304578063a622ee7c14610330578063b5c5f67214610356578063bb994d4814610388578063bc25cf77146103ae578063c3fb16ca146103d45761014d565b80633b8ae397116101155780633b8ae3971461023c57806361d027b31461026257806363a560ec14610286578063704b6c02146102a057806375b238fc146102c657806390a83dc2146102ce5761014d565b806303f9c793146101525780630e5c011e1461017a5780632d1e11ae146101a05780632f2ff15d146101d657806339ebf82314610202575b600080fd5b6101786004803603602081101561016857600080fd5b50356001600160a01b03166104d2565b005b6101786004803603602081101561019057600080fd5b50356001600160a01b03166105fa565b610178600480360360608110156101b657600080fd5b506001600160a01b0381358116916020810135909116906040013561084a565b610178600480360360408110156101ec57600080fd5b50803590602001356001600160a01b0316610a63565b6102286004803603602081101561021857600080fd5b50356001600160a01b0316610b22565b604080519115158252519081900360200190f35b6101786004803603602081101561025257600080fd5b50356001600160a01b0316610b37565b61026a610c4f565b604080516001600160a01b039092168252519081900360200190f35b61028e610c5e565b60408051918252519081900360200190f35b610178600480360360208110156102b657600080fd5b50356001600160a01b0316610c70565b61028e610da6565b610178600480360360608110156102e457600080fd5b506001600160a01b03813581169160208101359091169060400135610db8565b6102286004803603604081101561031a57600080fd5b50803590602001356001600160a01b0316610f5e565b6102286004803603602081101561034657600080fd5b50356001600160a01b0316610f7b565b6101786004803603606081101561036c57600080fd5b506001600160a01b038135169060208101359060400135610f90565b6101786004803603602081101561039e57600080fd5b50356001600160a01b03166114d7565b610178600480360360208110156103c457600080fd5b50356001600160a01b03166115df565b610178600480360360208110156103ea57600080fd5b50356001600160a01b0316611810565b6101786004803603604081101561041057600080fd5b506001600160a01b038135169060200135611915565b6101786004803603604081101561043c57600080fd5b50803590602001356001600160a01b0316611e49565b6101786004803603602081101561046857600080fd5b50356001600160a01b0316611f04565b6101786004803603604081101561048e57600080fd5b506001600160a01b038135169060200135612015565b610178600480360360208110156104ba57600080fd5b50356001600160a01b0316612431565b61026a6124f6565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610541576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260036020526040902054829060ff166105a2576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b826001600160a01b031663e8b5e51f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105dd57600080fd5b505af11580156105f1573d6000803e3d6000fd5b50505050505050565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610669576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040902054829060ff166106cd576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b826000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561070957600080fd5b505afa15801561071d573d6000803e3d6000fd5b505050506040513d602081101561073357600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561077d57600080fd5b505afa158015610791573d6000803e3d6000fd5b505050506040513d60208110156107a757600080fd5b50516001600160a01b0316146107f0576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b846001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050505050505050565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff166108cb576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260036020526040902054849060ff1661092c576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16610990576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b856001600160a01b03166345d34def86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156109f057600080fd5b505af1158015610a04573d6000803e3d6000fd5b50505050856001600160a01b031663e8b5e51f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b50505050505050505050565b6001546001600160a01b03163314610aab576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6000805160206126ca833981519152821480610ad457506000805160206126ea83398151915282145b610b14576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b604482015290519081900360640190fd5b610b1e8282612505565b5050565b60046020526000908152604090205460ff1681565b6001546001600160a01b03163314610b7f576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1615610bed576040805162461bcd60e51b815260206004820152601960248201527f616c726561647920617070726f76656420737472617465677900000000000000604482015290519081900360640190fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916600190811790915582519384529083015280517f106ec9ccb660562f4476566fb44a45e446adb3da3fbedee93f6a3c47a81fd5b89281900390910190a150565b6002546001600160a01b031681565b6000805160206126ea83398151915281565b6001546001600160a01b03163314610cb8576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b038116610d0a576040805162461bcd60e51b815260206004820152601460248201527361646d696e203d207a65726f206164647265737360601b604482015290519081900360640190fd5b600154610d2f906000805160206126ca833981519152906001600160a01b03166125aa565b600154610d54906000805160206126ea833981519152906001600160a01b03166125aa565b610d6c6000805160206126ca83398151915282612505565b610d846000805160206126ea83398151915282612505565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206126ca83398151915281565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff16610e39576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260036020526040902054849060ff16610e9a576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16610efe576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b856001600160a01b03166345d34def86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a4357600080fd5b600060208181529281526040808220909352908152205460ff1681565b60036020526000908152604090205460ff1681565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16610fff576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054849060ff16611063576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b846000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561109f57600080fd5b505afa1580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561111357600080fd5b505afa158015611127573d6000803e3d6000fd5b505050506040513d602081101561113d57600080fd5b50516001600160a01b031614611186576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b86856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d60208110156111ed57600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561130857836001600160a01b03163191508c6001600160a01b0316632e1a7d4d8d6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112de57600080fd5b505af11580156112f2573d6000803e3d6000fd5b50505050836001600160a01b0316319050611473565b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561135e57600080fd5b505afa158015611372573d6000803e3d6000fd5b505050506040513d602081101561138857600080fd5b505160408051632e1a7d4d60e01b8152600481018f905290519193506001600160a01b038f1691632e1a7d4d9160248082019260009290919082900301818387803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b50505050826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505190505b84611484828463ffffffff61264c16565b10156114c8576040805162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb901e1036b4b760911b604482015290519081900360640190fd5b50505050505050505050505050565b6001546001600160a01b0316331461151f576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff16611581576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b6001600160a01b0381166000818152600460209081526040808320805460ff1916905580519384529083019190915280517f106ec9ccb660562f4476566fb44a45e446adb3da3fbedee93f6a3c47a81fd5b89281900390910190a150565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff1661164e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216600090815260046020526040902054829060ff166116b2576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b826000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ee57600080fd5b505afa158015611702573d6000803e3d6000fd5b505050506040513d602081101561171857600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b15801561176257600080fd5b505afa158015611776573d6000803e3d6000fd5b505050506040513d602081101561178c57600080fd5b50516001600160a01b0316146117d5576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b846001600160a01b0316631dd19cb46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561082b57600080fd5b6001546001600160a01b03163314611858576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff166118b7576040805162461bcd60e51b815260206004820152600f60248201526e08585c1c1c9bdd9959081d985d5b1d608a1b604482015290519081900360640190fd5b6001600160a01b0381166000818152600360209081526040808320805460ff1916905580519384529083019190915280517f75bccdece1e4559ef4e257924836e1c4753d974091eea18c968691b5c68aebec9281900390910190a150565b3360009081526000805160206126aa83398151915260205260409020546000805160206126ea8339815191529060ff16611984576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902054839060ff166119e8576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b836000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d6020811015611a4e57600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b158015611a9857600080fd5b505afa158015611aac573d6000803e3d6000fd5b505050506040513d6020811015611ac257600080fd5b50516001600160a01b031614611b0b576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b85856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b158015611bba57600080fd5b505afa158015611bce573d6000803e3d6000fd5b505050506040513d6020811015611be457600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c8257836001600160a01b03163191508b6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505050836001600160a01b0316319050611de6565b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611cd857600080fd5b505afa158015611cec573d6000803e3d6000fd5b505050506040513d6020811015611d0257600080fd5b50516040805163429c145b60e11b815290519193506001600160a01b038e169163853828b69160048082019260009290919082900301818387803b158015611d4957600080fd5b505af1158015611d5d573d6000803e3d6000fd5b50505050826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d6020811015611de157600080fd5b505190505b84611df7828463ffffffff61264c16565b1015611e3b576040805162461bcd60e51b815260206004820152600e60248201526d3bb4ba34323930bb901e1036b4b760911b604482015290519081900360640190fd5b505050505050505050505050565b6001546001600160a01b03163314611e91576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6000805160206126ca833981519152821480611eba57506000805160206126ea83398151915282145b611efa576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b604482015290519081900360640190fd5b610b1e82826125aa565b6001546001600160a01b03163314611f4c576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff1615611fb3576040805162461bcd60e51b8152602060048201526016602482015275185b1c9958591e48185c1c1c9bdd9959081d985d5b1d60521b604482015290519081900360640190fd5b6001600160a01b038116600081815260036020908152604091829020805460ff1916600190811790915582519384529083015280517f75bccdece1e4559ef4e257924836e1c4753d974091eea18c968691b5c68aebec9281900390910190a150565b3360009081527f5cbfc8ee58ca47855df7bcf648dd304ddb6b932f9b87878bdf6318d7ec7ee5b760205260409020546000805160206126ca8339815191529060ff16612096576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902054839060ff166120fa576040805162461bcd60e51b815260206004820152601260248201527121617070726f76656420737472617465677960701b604482015290519081900360640190fd5b836000816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561213657600080fd5b505afa15801561214a573d6000803e3d6000fd5b505050506040513d602081101561216057600080fd5b505160408051635463173b60e11b815290519192506001600160a01b03808516929084169163a8c62e76916004808301926020929190829003018186803b1580156121aa57600080fd5b505afa1580156121be573d6000803e3d6000fd5b505050506040513d60208110156121d457600080fd5b50516001600160a01b03161461221d576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b85856000826001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225a57600080fd5b505afa15801561226e573d6000803e3d6000fd5b505050506040513d602081101561228457600080fd5b505160408051637e062a3560e11b815290519192506000916001600160a01b0384169163fc0c546a916004808301926020929190829003018186803b1580156122cc57600080fd5b505afa1580156122e0573d6000803e3d6000fd5b505050506040513d60208110156122f657600080fd5b505190506000806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561236a57836001600160a01b03163191508b6001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5857600080fd5b826001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123c057600080fd5b505afa1580156123d4573d6000803e3d6000fd5b505050506040513d60208110156123ea57600080fd5b5051604080516374fd6c7760e11b815290519193506001600160a01b038e169163e9fad8ee9160048082019260009290919082900301818387803b158015611d4957600080fd5b6001546001600160a01b03163314612479576040805162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015290519081900360640190fd5b6001600160a01b0381166124d4576040805162461bcd60e51b815260206004820152601760248201527f7472656173757279203d207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6001600160a01b038116612551576040805162461bcd60e51b815260206004820152600e60248201526d61646472657373203d207a65726f60901b604482015290519081900360640190fd5b6000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b6001600160a01b0381166125f6576040805162461bcd60e51b815260206004820152600e60248201526d61646472657373203d207a65726f60901b604482015290519081900360640190fd5b6000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000828211156126a3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe77d27d6fbf5dcac17020138a1f5f0c8485268fce16ec3f3861b2f3f4d1aeb4dbdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4227e3e4d29d60af3ae6456513164bb5db737d6fc8610aa36ad458736c9efb884ca26469706673582212207ca4f8346842c430b5647b345bfac0d6d4bd89788e049404a25b98200313886664736f6c634300060b0033

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

0000000000000000000000001c064ea662365c09c8e87242791dacbb90002605

-----Decoded View---------------
Arg [0] : _treasury (address): 0x1C064EA662365c09c8E87242791dAcbb90002605

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001c064ea662365c09c8e87242791dacbb90002605


Deployed Bytecode Sourcemap

20044:6996:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24128:190;;;;;;;;;;;;;;;;-1:-1:-1;24128:190:0;-1:-1:-1;;;;;24128:190:0;;:::i;:::-;;24984:245;;;;;;;;;;;;;;;;-1:-1:-1;24984:245:0;-1:-1:-1;;;;;24984:245:0;;:::i;24635:341::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24635:341:0;;;;;;;;;;;;;;;;;:::i;22506:202::-;;;;;;;;;;;;;;;;-1:-1:-1;22506:202:0;;;;;;-1:-1:-1;;;;;22506:202:0;;:::i;20995:42::-;;;;;;;;;;;;;;;;-1:-1:-1;20995:42:0;-1:-1:-1;;;;;20995:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;23337:229;;;;;;;;;;;;;;;;-1:-1:-1;23337:229:0;-1:-1:-1;;;;;23337:229:0;;:::i;20857:32::-;;;:::i;:::-;;;;-1:-1:-1;;;;;20857:32:0;;;;;;;;;;;;;;20614:125;;;:::i;:::-;;;;;;;;;;;;;;;;21976:337;;;;;;;;;;;;;;;;-1:-1:-1;21976:337:0;-1:-1:-1;;;;;21976:337:0;;:::i;20436:121::-;;;:::i;23804:316::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23804:316:0;;;;;;;;;;;;;;;;;:::i;19057:59::-;;;;;;;;;;;;;;;;-1:-1:-1;19057:59:0;;;;;;-1:-1:-1;;;;;19057:59:0;;:::i;20922:38::-;;;;;;;;;;;;;;;;-1:-1:-1;20922:38:0;-1:-1:-1;;;;;20922:38:0;;:::i;26078:353::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26078:353:0;;;;;;;;;;;;;:::i;23574:222::-;;;;;;;;;;;;;;;;-1:-1:-1;23574:222:0;-1:-1:-1;;;;;23574:222:0;;:::i;25237:239::-;;;;;;;;;;;;;;;;-1:-1:-1;25237:239:0;-1:-1:-1;;;;;25237:239:0;;:::i;23136:193::-;;;;;;;;;;;;;;;;-1:-1:-1;23136:193:0;-1:-1:-1;;;;;23136:193:0;;:::i;26439:304::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26439:304:0;;;;;;;;:::i;22716:204::-;;;;;;;;;;;;;;;;-1:-1:-1;22716:204:0;;;;;;-1:-1:-1;;;;;22716:204:0;;:::i;22928:200::-;;;;;;;;;;;;;;;;-1:-1:-1;22928:200:0;-1:-1:-1;;;;;22928:200:0;;:::i;26751:286::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26751:286:0;;;;;;;;:::i;22321:177::-;;;;;;;;;;;;;;;;-1:-1:-1;22321:177:0;-1:-1:-1;;;;;22321:177:0;;:::i;20748:29::-;;;:::i;24128:190::-;19198:10;24220:14;19183:26;;;-1:-1:-1;;;;;;;;;;;19183:14:0;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20673:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21478:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;24263:6;;21478:14:::1;;21470:42;;;::::0;;-1:-1:-1;;;21470:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21470:42:0;;;;;;;;;;;;;::::1;;24294:6:::2;-1:-1:-1::0;;;;;24287:21:0::2;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;19236:1:::1;24128:190:::0;;:::o;24984:245::-;19198:10;25080:14;19183:26;;;-1:-1:-1;;;;;;;;;;;19183:14:0;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20673:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21608:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;25126:9;;21608:21:::1;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::1;;25164:9:::2;21737:13;21763:9;-1:-1:-1::0;;;;;21753:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21753:28:0;21897:24:::2;::::0;;-1:-1:-1;;;21897:24:0;;;;21753:28;;-1:-1:-1;;;;;;21897:37:0;;::::2;::::0;:22;;::::2;::::0;::::2;::::0;:24:::2;::::0;;::::2;::::0;21753:28:::2;::::0;21897:24;;;;;;;:22;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21897:24:0;-1:-1:-1;;;;;21897:37:0::2;;21889:59;;;::::0;;-1:-1:-1;;;21889:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21889:59:0;;;;;;;;;;;;;::::2;;25201:9:::3;-1:-1:-1::0;;;;;25191:28:0::3;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;21663:1:::2;;19236::::1;24984:245:::0;;:::o;24635:341::-;19198:10;24787;19183:26;;;:14;;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20491:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21478:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;24826:6;;21478:14:::1;;21470:42;;;::::0;;-1:-1:-1;;;21470:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21470:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21608:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;24864:9;;21608:21:::2;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::2;;24898:6:::3;-1:-1:-1::0;;;;;24891:26:0::3;;24918:9;24929:4;24891:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;24891:43:0::3;-1:-1:-1::0;;;;;24891:43:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;24952:6;-1:-1:-1::0;;;;;24945:21:0::3;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;21523:1:::2;19236::::1;24635:341:::0;;;;:::o;22506:202::-;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22602:19:0;::::1;::::0;:46:::1;;-1:-1:-1::0;;;;;;;;;;;;22625:23:0;::::1;22602:46;22594:71;;;::::0;;-1:-1:-1;;;22594:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22594:71:0;;;;;;;;;;;;;::::1;;22676:24;22687:5;22694;22676:10;:24::i;:::-;22506:202:::0;;:::o;20995:42::-;;;;;;;;;;;;;;;:::o;23337:229::-;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23420:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;::::1;;23419:22;23411:60;;;::::0;;-1:-1:-1;;;23411:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23482:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;;;;:28;;-1:-1:-1;;23482:28:0::1;23506:4;23482:28:::0;;::::1;::::0;;;23526:32;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;23337:229:::0;:::o;20857:32::-;;;-1:-1:-1;;;;;20857:32:0;;:::o;20614:125::-;-1:-1:-1;;;;;;;;;;;20614:125:0;:::o;21976:337::-;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22057:20:0;::::1;22049:53;;;::::0;;-1:-1:-1;;;22049:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22049:53:0;;;;;;;;;;;;;::::1;;22139:5;::::0;22115:30:::1;::::0;-1:-1:-1;;;;;;;;;;;20491:66:0;-1:-1:-1;;;;;22139:5:0::1;22115:11;:30::i;:::-;22184:5;::::0;22156:34:::1;::::0;-1:-1:-1;;;;;;;;;;;20673:66:0;-1:-1:-1;;;;;22184:5:0::1;22156:11;:34::i;:::-;22203:30;-1:-1:-1::0;;;;;;;;;;;22226:6:0;22203:10:::1;:30::i;:::-;22244:34;-1:-1:-1::0;;;;;;;;;;;22271:6:0;22244:10:::1;:34::i;:::-;22291:5;:14:::0;;-1:-1:-1;;;;;;22291:14:0::1;-1:-1:-1::0;;;;;22291:14:0;;;::::1;::::0;;;::::1;::::0;;21976:337::o;20436:121::-;-1:-1:-1;;;;;;;;;;;20436:121:0;:::o;23804:316::-;19198:10;23965;19183:26;;;:14;;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20491:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21478:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;24004:6;;21478:14:::1;;21470:42;;;::::0;;-1:-1:-1;;;21470:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21470:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21608:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;24042:9;;21608:21:::2;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::2;;24076:6:::3;-1:-1:-1::0;;;;;24069:26:0::3;;24096:9;24107:4;24069:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;24069:43:0::3;-1:-1:-1::0;;;;;24069:43:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;19057:59:::0;;;;;;;;;;;;;;;;;;;;;;;;:::o;20922:38::-;;;;;;;;;;;;;;;:::o;26078:353::-;19198:10;26234:14;19183:26;;;-1:-1:-1;;;;;;;;;;;19183:14:0;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20673:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21608:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;26280:9;;21608:21:::1;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::1;;26318:9:::2;21737:13;21763:9;-1:-1:-1::0;;;;;21753:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21753:28:0;21897:24:::2;::::0;;-1:-1:-1;;;21897:24:0;;;;21753:28;;-1:-1:-1;;;;;;21897:37:0;;::::2;::::0;:22;;::::2;::::0;::::2;::::0;:24:::2;::::0;;::::2;::::0;21753:28:::2;::::0;21897:24;;;;;;;:22;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21897:24:0;-1:-1:-1;;;;;21897:37:0::2;;21889:59;;;::::0;;-1:-1:-1;;;21889:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21889:59:0;;;;;;;;;;;;;::::2;;26352:9:::3;26363:4;25548:13;25574:9;-1:-1:-1::0;;;;;25564:26:0::3;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25564:28:0;25619:21:::3;::::0;;-1:-1:-1;;;25619:21:0;;;;25564:28;;-1:-1:-1;25603:13:0::3;::::0;-1:-1:-1;;;;;25619:19:0;::::3;::::0;::::3;::::0;:21:::3;::::0;;::::3;::::0;25564:28:::3;::::0;25619:21;;;;;;;:19;:21;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25619:21:0;;-1:-1:-1;25653:14:0::3;::::0;-1:-1:-1;;;;;25706:12:0;::::3;20339:42;25706:12;25702:290;;;25755:5;-1:-1:-1::0;;;;;25747:22:0::3;;25735:34;;26395:9:::4;-1:-1:-1::0;;;;;26385:29:0::4;;26415:7;26385:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;25819:5:::3;-1:-1:-1::0;;;;;25811:22:0::3;;25800:33;;25702:290;;;25885:5;-1:-1:-1::0;;;;;25878:23:0::3;;25902:5;25878:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;25878:30:0::3;-1:-1:-1::0;;;;;25878:30:0::3;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25878:30:0;26385:38:::4;::::0;;-1:-1:-1;;;26385:38:0;;::::4;::::0;::::4;::::0;;;;;25878:30;;-1:-1:-1;;;;;;26385:29:0;::::4;::::0;::::4;::::0;:38;;;;;-1:-1:-1;;26385:38:0;;;;;;;;-1:-1:-1;26385:29:0;:38;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;25957:5:::3;-1:-1:-1::0;;;;;25950:23:0::3;;25974:5;25950:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;25950:30:0::3;-1:-1:-1::0;;;;;25950:30:0::3;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25950:30:0;;-1:-1:-1;25702:290:0::3;26039:4:::0;26012:23:::3;:8:::0;26025:9;26012:23:::3;:12;:23;:::i;:::-;:31;;26004:58;;;::::0;;-1:-1:-1;;;26004:58:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;26004:58:0;;;;;;;;;;;;;::::3;;21959:1;;;;;;21663::::2;;19236::::1;26078:353:::0;;;;:::o;23574:222::-;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23655:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;::::1;;23647:52;;;::::0;;-1:-1:-1;;;23647:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23647:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23710:21:0;::::1;23734:5;23710:21:::0;;;:10:::1;:21;::::0;;;;;;;:29;;-1:-1:-1;;23710:29:0::1;::::0;;23755:33;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;23574:222:::0;:::o;25237:239::-;19198:10;25330:14;19183:26;;;-1:-1:-1;;;;;;;;;;;19183:14:0;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20673:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21608:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;25376:9;;21608:21:::1;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::1;;25414:9:::2;21737:13;21763:9;-1:-1:-1::0;;;;;21753:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21753:28:0;21897:24:::2;::::0;;-1:-1:-1;;;21897:24:0;;;;21753:28;;-1:-1:-1;;;;;;21897:37:0;;::::2;::::0;:22;;::::2;::::0;::::2;::::0;:24:::2;::::0;;::::2;::::0;21753:28:::2;::::0;21897:24;;;;;;;:22;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21897:24:0;-1:-1:-1;;;;;21897:37:0::2;;21889:59;;;::::0;;-1:-1:-1;;;21889:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21889:59:0;;;;;;;;;;;;;::::2;;25451:9:::3;-1:-1:-1::0;;;;;25441:25:0::3;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;23136:193:::0;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23211:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;::::1;;23203:42;;;::::0;;-1:-1:-1;;;23203:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23203:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23256:14:0;::::1;23273:5;23256:14:::0;;;:6:::1;:14;::::0;;;;;;;:22;;-1:-1:-1;;23256:22:0::1;::::0;;23294:27;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;23136:193:::0;:::o;26439:304::-;19198:10;26550:14;19183:26;;;-1:-1:-1;;;;;;;;;;;19183:14:0;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20673:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21608:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;26596:9;;21608:21:::1;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::1;;26634:9:::2;21737:13;21763:9;-1:-1:-1::0;;;;;21753:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21753:28:0;21897:24:::2;::::0;;-1:-1:-1;;;21897:24:0;;;;21753:28;;-1:-1:-1;;;;;;21897:37:0;;::::2;::::0;:22;;::::2;::::0;::::2;::::0;:24:::2;::::0;;::::2;::::0;21753:28:::2;::::0;21897:24;;;;;;;:22;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21897:24:0;-1:-1:-1;;;;;21897:37:0::2;;21889:59;;;::::0;;-1:-1:-1;;;21889:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21889:59:0;;;;;;;;;;;;;::::2;;26668:9:::3;26679:4;25548:13;25574:9;-1:-1:-1::0;;;;;25564:26:0::3;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25564:28:0;25619:21:::3;::::0;;-1:-1:-1;;;25619:21:0;;;;25564:28;;-1:-1:-1;25603:13:0::3;::::0;-1:-1:-1;;;;;25619:19:0;::::3;::::0;::::3;::::0;:21:::3;::::0;;::::3;::::0;25564:28:::3;::::0;25619:21;;;;;;;:19;:21;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25619:21:0;;-1:-1:-1;25653:14:0::3;::::0;-1:-1:-1;;;;;25706:12:0;::::3;20339:42;25706:12;25702:290;;;25755:5;-1:-1:-1::0;;;;;25747:22:0::3;;25735:34;;26711:9:::4;-1:-1:-1::0;;;;;26701:32:0::4;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;25819:5:::3;-1:-1:-1::0;;;;;25811:22:0::3;;25800:33;;25702:290;;;25885:5;-1:-1:-1::0;;;;;25878:23:0::3;;25902:5;25878:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;25878:30:0::3;-1:-1:-1::0;;;;;25878:30:0::3;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25878:30:0;26701:34:::4;::::0;;-1:-1:-1;;;26701:34:0;;;;25878:30;;-1:-1:-1;;;;;;26701:32:0;::::4;::::0;::::4;::::0;:34:::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;;;:32;:34;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;25957:5:::3;-1:-1:-1::0;;;;;25950:23:0::3;;25974:5;25950:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;25950:30:0::3;-1:-1:-1::0;;;;;25950:30:0::3;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25950:30:0;;-1:-1:-1;25702:290:0::3;26039:4:::0;26012:23:::3;:8:::0;26025:9;26012:23:::3;:12;:23;:::i;:::-;:31;;26004:58;;;::::0;;-1:-1:-1;;;26004:58:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;26004:58:0;;;;;;;;;;;;;::::3;;21959:1;;;;;;21663::::2;;19236::::1;26439:304:::0;;;:::o;22716:204::-;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22813:19:0;::::1;::::0;:46:::1;;-1:-1:-1::0;;;;;;;;;;;;22836:23:0;::::1;22813:46;22805:71;;;::::0;;-1:-1:-1;;;22805:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22805:71:0;;;;;;;;;;;;;::::1;;22887:25;22899:5;22906;22887:11;:25::i;22928:200::-:0;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23005:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;::::1;;23004:15;22996:50;;;::::0;;-1:-1:-1;;;22996:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22996:50:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23057:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;;;:21;;-1:-1:-1;;23057:21:0::1;23074:4;23057:21:::0;;::::1;::::0;;;23094:26;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;22928:200:::0;:::o;26751:286::-;19198:10;26855;19183:26;;;:14;;:26;:14;:26;;;-1:-1:-1;;;;;;;;;;;20491:66:0;19183:26;;19175:50;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;-1:-1:-1;;;19175:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21608:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;26897:9;;21608:21:::1;;21600:52;;;::::0;;-1:-1:-1;;;21600:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21600:52:0;;;;;;;;;;;;;::::1;;26935:9:::2;21737:13;21763:9;-1:-1:-1::0;;;;;21753:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21753:28:0;21897:24:::2;::::0;;-1:-1:-1;;;21897:24:0;;;;21753:28;;-1:-1:-1;;;;;;21897:37:0;;::::2;::::0;:22;;::::2;::::0;::::2;::::0;:24:::2;::::0;;::::2;::::0;21753:28:::2;::::0;21897:24;;;;;;;:22;:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21897:24:0;-1:-1:-1;;;;;21897:37:0::2;;21889:59;;;::::0;;-1:-1:-1;;;21889:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21889:59:0;;;;;;;;;;;;;::::2;;26969:9:::3;26980:4;25548:13;25574:9;-1:-1:-1::0;;;;;25564:26:0::3;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25564:28:0;25619:21:::3;::::0;;-1:-1:-1;;;25619:21:0;;;;25564:28;;-1:-1:-1;25603:13:0::3;::::0;-1:-1:-1;;;;;25619:19:0;::::3;::::0;::::3;::::0;:21:::3;::::0;;::::3;::::0;25564:28:::3;::::0;25619:21;;;;;;;:19;:21;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25619:21:0;;-1:-1:-1;25653:14:0::3;::::0;-1:-1:-1;;;;;25706:12:0;::::3;20339:42;25706:12;25702:290;;;25755:5;-1:-1:-1::0;;;;;25747:22:0::3;;25735:34;;27012:9:::4;-1:-1:-1::0;;;;;27002:25:0::4;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;25702:290:::3;25885:5;-1:-1:-1::0;;;;;25878:23:0::3;;25902:5;25878:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;25878:30:0::3;-1:-1:-1::0;;;;;25878:30:0::3;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;25878:30:0;27002:27:::4;::::0;;-1:-1:-1;;;27002:27:0;;;;25878:30;;-1:-1:-1;;;;;;27002:25:0;::::4;::::0;::::4;::::0;:27:::4;::::0;;::::4;::::0;::::4;::::0;;;;;;;;;;:25;:27;::::4;;::::0;::::4;;;;::::0;::::4;22321:177:::0;21372:5;;-1:-1:-1;;;;;21372:5:0;21358:10;:19;21350:38;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;-1:-1:-1;;;21350:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22408:23:0;::::1;22400:59;;;::::0;;-1:-1:-1;;;22400:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22470:8;:20:::0;;-1:-1:-1;;;;;;22470:20:0::1;-1:-1:-1::0;;;;;22470:20:0;;;::::1;::::0;;;::::1;::::0;;22321:177::o;20748:29::-;;;-1:-1:-1;;;;;20748:29:0;;:::o;19253:206::-;-1:-1:-1;;;;;19331:19:0;;19323:46;;;;;-1:-1:-1;;;19323:46:0;;;;;;;;;;;;-1:-1:-1;;;19323:46:0;;;;;;;;;;;;;;;19382:7;:14;;;;;;;;;;;-1:-1:-1;;;;;19382:21:0;;;;;;;;;;:28;;-1:-1:-1;;19382:28:0;19406:4;19382:28;;;19428:23;19382:21;;19390:5;;19428:23;;19382:7;19428:23;19253:206;;:::o;19467:209::-;-1:-1:-1;;;;;19546:19:0;;19538:46;;;;;-1:-1:-1;;;19538:46:0;;;;;;;;;;;;-1:-1:-1;;;19538:46:0;;;;;;;;;;;;;;;19621:5;19597:14;;;;;;;;;;;-1:-1:-1;;;;;19597:21:0;;;;;;;;;;:29;;-1:-1:-1;;19597:29:0;;;19644:24;19597:21;;19605:5;;19644:24;;19621:5;19644:24;19467:209;;:::o;3229:149::-;3281:4;3311:1;3306;:6;;3298:49;;;;;-1:-1:-1;;;3298:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3365:5:0;;;3229:149::o

Swarm Source

ipfs://7ca4f8346842c430b5647b345bfac0d6d4bd89788e049404a25b982003138866

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.