ETH Price: $3,260.98 (-0.76%)

Contract

0xBDf32c838e1b5d927B9ecb099b1f01F81d677A30
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Batch163359112023-01-04 20:47:23745 days ago1672865243IN
0xBDf32c83...81d677A30
0 ETH0.0032901722.81645534
Batch163295512023-01-03 23:30:11746 days ago1672788611IN
0xBDf32c83...81d677A30
0 ETH0.0017867815.98280847
Harvest163294522023-01-03 23:10:23746 days ago1672787423IN
0xBDf32c83...81d677A30
0 ETH0.0016768217.2636774
Batch151286712022-07-12 15:33:15921 days ago1657639995IN
0xBDf32c83...81d677A30
0 ETH0.0035618236.30290677
Batch151286602022-07-12 15:31:37921 days ago1657639897IN
0xBDf32c83...81d677A30
0 ETH0.0058743445
Batch151166962022-07-10 19:12:35923 days ago1657480355IN
0xBDf32c83...81d677A30
0 ETH0.0094798469.26372025
Batch151166962022-07-10 19:12:35923 days ago1657480355IN
0xBDf32c83...81d677A30
0 ETH0.0099866569.26372025
Batch151150272022-07-10 13:00:35923 days ago1657458035IN
0xBDf32c83...81d677A30
0 ETH0.0014148112.65774479
Harvest151150212022-07-10 12:59:20923 days ago1657457960IN
0xBDf32c83...81d677A30
0 ETH0.0011235214.03878852
Batch150888472022-07-06 12:15:21927 days ago1657109721IN
0xBDf32c83...81d677A30
0 ETH0.0034908624.20499791
Harvest150353602022-06-27 17:01:02936 days ago1656349262IN
0xBDf32c83...81d677A30
0 ETH0.0121141139.7243692
Batch150352952022-06-27 16:39:08936 days ago1656347948IN
0xBDf32c83...81d677A30
0 ETH0.0069585276.09103972
Harvest149928452022-06-19 21:02:01944 days ago1655672521IN
0xBDf32c83...81d677A30
0 ETH0.0058030366.91386147
Batch149928182022-06-19 20:53:23944 days ago1655672003IN
0xBDf32c83...81d677A30
0 ETH0.0058240363.65204035
Batch149859352022-06-18 16:26:18945 days ago1655569578IN
0xBDf32c83...81d677A30
0 ETH0.0035342138.646468
Batch149650492022-06-15 2:06:14949 days ago1655258774IN
0xBDf32c83...81d677A30
0 ETH0.0031803834.75911031
Batch149650402022-06-15 2:03:51949 days ago1655258631IN
0xBDf32c83...81d677A30
0 ETH0.0038902642.5175266
Harvest149650372022-06-15 2:02:45949 days ago1655258565IN
0xBDf32c83...81d677A30
0 ETH0.0030733235.43798661
Batch149650362022-06-15 2:02:35949 days ago1655258555IN
0xBDf32c83...81d677A30
0 ETH0.0032944236.00543535
Batch148670702022-05-29 14:53:22965 days ago1653836002IN
0xBDf32c83...81d677A30
0 ETH0.0023087916.00969591
Harvest148464392022-05-26 6:20:20969 days ago1653546020IN
0xBDf32c83...81d677A30
0 ETH0.0028054932.34973721
Harvest148426332022-05-25 15:26:46969 days ago1653492406IN
0xBDf32c83...81d677A30
0 ETH0.0051477859.35820962
Batch148095992022-05-20 6:42:28975 days ago1653028948IN
0xBDf32c83...81d677A30
0 ETH0.0017855319.51449513
Batch147717952022-05-14 5:25:06981 days ago1652505906IN
0xBDf32c83...81d677A30
0 ETH0.0026885429.38364379
Batch147603352022-05-12 9:35:21982 days ago1652348121IN
0xBDf32c83...81d677A30
0 ETH0.03329123230.83483816
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:
genericFarmV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : genericFarmV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
import "./lib/SignedSafeMath.sol";

contract genericFarmV2 is BoringOwnable, BoringBatchable {
    using BoringMath for uint256;
    using BoringMath128 for uint128;
    using BoringERC20 for IERC20;
    using SignedSafeMath for int256;

    /// @notice Info of each GFV2 user.
    /// `amount` LP token amount the user has provided.
    /// `rewardDebt` The amount of rewards tokens entitled to the user.
    struct UserInfo {
        uint256 amount;
        int256 rewardDebt;
    }

    /// @notice Info of each GFV2 pool.
    /// `allocPoint` The amount of allocation points assigned to the pool.
    /// Also known as the amount of reward tokens to distribute per block.
    struct PoolInfo {
        uint128 accRewardTokensPerShare;
        uint64 lastRewardBlock;
        uint64 allocPoint;
    }

    /// @dev Address of Reward Token contract.
    IERC20 public immutable REWARD_TOKEN;

    /// @notice Info of each GFV2 pool.
    PoolInfo[] public poolInfo;
    /// @notice Address of the LP token for each GFV2 pool.
    IERC20[] public lpToken;
    /// @dev List of all added LP tokens.
    mapping (address => bool) private addedLPs;

    /// @notice Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;
    /// @notice Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint;

    /// @notice rewards tokens created per block.
    uint256 public rewardTokensPerBlock;

    /// @dev Extra decimals for pool's accTokensPerShare attribute. Needed in order to accomodate different types of LPs.
    uint256 private constant ACC_TOKEN_PRECISION = 1e18;

    /// @dev nonReentrant flag used to secure functions with external calls.
    bool private nonReentrant;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
    event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken);
    event LogSetPool(uint256 indexed pid, uint256 allocPoint);
    event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accRewardTokensPerShare);
    event SetRewardTokensPerBlock(uint256 rewardTokensPerBlock, bool withUpdate);

    /// @param _rewardToken The reward token contract address.
    /// @param _rewardTokensPerBlock reward tokens created per block.
    constructor(IERC20 _rewardToken, uint256 _rewardTokensPerBlock) public {
        REWARD_TOKEN = _rewardToken;
        rewardTokensPerBlock = _rewardTokensPerBlock;
        totalAllocPoint = 0;
    }

    /// @notice Update number of reward tokens created per block. Can only be called by the owner.
    /// @param _rewardTokensPerBlock reward tokens created per block.
    /// @param _withUpdate true if massUpdatePools should be triggered as well.
    function setRewardTokensPerBlock(uint256 _rewardTokensPerBlock, bool _withUpdate) external onlyOwner {
        if (_withUpdate) {
            massUpdateAllPools();
        }
        rewardTokensPerBlock = _rewardTokensPerBlock;
        emit SetRewardTokensPerBlock(_rewardTokensPerBlock, _withUpdate);
    }

    /// @notice Set the nonReentrant flag. Could be used to pause/resume the farm operations. Can only be called by the owner.
    /// @param _val nonReentrant flag value to be set.
    function setNonReentrant(bool _val) external onlyOwner returns (bool) {
        nonReentrant = _val;
        return nonReentrant;
    }

    /// @notice Returns the number of GFV2 pools.
    function poolLength() external view returns (uint256 pools) {
        pools = poolInfo.length;
    }

    /// @notice Returns the reward value for a specific pool.
    function poolReward(uint256 _pid) external view returns (uint256) {
        if (totalAllocPoint == 0)
            return 0;
        return rewardTokensPerBlock.mul(poolInfo[_pid].allocPoint) / totalAllocPoint;
    }

    /// @notice Returns the total number of LPs staked in the farm.
    function getLPSupply(uint256 _pid) external view returns (uint256) {
        uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
        return lpSupply;
    }

    /// @notice Add a new LP to the pool. Can only be called by the owner.
    /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    /// @param allocPoint AP of the new pool.
    /// @param _lpToken Address of the LP ERC-20 token.
    function add(uint256 allocPoint, IERC20 _lpToken) external onlyOwner {
        require(!addedLPs[address(_lpToken)], "genericFarmV2::there is already a pool with this LP");
        uint256 lastRewardBlock = block.number;
        totalAllocPoint = totalAllocPoint.add(allocPoint);
        lpToken.push(_lpToken);
        addedLPs[address(_lpToken)] = true;

        poolInfo.push(PoolInfo({
            allocPoint: allocPoint.to64(),
            lastRewardBlock: lastRewardBlock.to64(),
            accRewardTokensPerShare: 0
        }));
        emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken);
    }

    /// @notice Update the given pool's reward tokens allocation point. Can only be called by the owner.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _allocPoint New AP of the pool.
    function set(uint256 _pid, uint256 _allocPoint) external onlyOwner {
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint.to64();
        emit LogSetPool(_pid, _allocPoint);
    }

    /// @notice View function to see pending rewards on frontend.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _user Address of user.
    /// @return pending reward for a given user.
    function pendingReward(uint256 _pid, address _user) external view returns (uint256 pending) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accRewardTokensPerShare = pool.accRewardTokensPerShare;
        uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
        if (block.number > pool.lastRewardBlock && lpSupply > 0 && totalAllocPoint > 0) {
            uint256 blocks = block.number.sub(pool.lastRewardBlock);
            accRewardTokensPerShare = accRewardTokensPerShare.add(
                (blocks.mul(rewardTokensPerBlock).mul(pool.allocPoint).mul(ACC_TOKEN_PRECISION) / totalAllocPoint) / lpSupply);
        }
        pending = int256(user.amount.mul(accRewardTokensPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt).toUInt256();
    }

    /// @notice Update reward variables for all pools. Be careful of gas spending!
    function massUpdateAllPools() public {
        uint256 len = poolInfo.length;
        for (uint256 pid = 0; pid < len; ++pid) {
            updatePool(pid);
        }
    }

    /// @notice Update reward variables for specified pools. Be careful of gas spending!
    /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
    function massUpdatePools(uint256[] calldata pids) external {
        uint256 len = pids.length;
        for (uint256 i = 0; i < len; ++i) {
            updatePool(pids[i]);
        }
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        if (block.number > pool.lastRewardBlock) {
            uint256 lpSupply = lpToken[pid].balanceOf(address(this));
            if (lpSupply > 0 && totalAllocPoint > 0) {
                uint256 blocks = block.number.sub(pool.lastRewardBlock);
                pool.accRewardTokensPerShare = pool.accRewardTokensPerShare.add(
                    ((blocks.mul(rewardTokensPerBlock).mul(pool.allocPoint).mul(ACC_TOKEN_PRECISION) / totalAllocPoint) / lpSupply).to128());
            }
            pool.lastRewardBlock = block.number.to64();
            poolInfo[pid] = pool;
            emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accRewardTokensPerShare);
        }
    }

    /// @notice Deposit LP tokens to GFV2 for rewards allocation.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to deposit.
    /// @param to The receiver of `amount` deposit benefit.
    function deposit(uint256 pid, uint256 amount, address to) external {
        require(!nonReentrant, "genericFarmV2::nonReentrant - try again");
        nonReentrant = true;

        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][to];

        // Effects
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accRewardTokensPerShare) / ACC_TOKEN_PRECISION));

        // Interactions
        lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);

        emit Deposit(msg.sender, pid, amount, to);
        nonReentrant = false;
    }

    /// @notice Withdraw LP tokens from GFV2.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens.
    function withdraw(uint256 pid, uint256 amount, address to) external {
        require(!nonReentrant, "genericFarmV2::nonReentrant - try again");
        nonReentrant = true;

        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];

        // Effects
        user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accRewardTokensPerShare) / ACC_TOKEN_PRECISION));
        user.amount = user.amount.sub(amount);

        // Interactions
        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
        nonReentrant = false;
    }

    /// @notice Harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the rewards.
    function harvest(uint256 pid, address to) external {
        require(!nonReentrant, "genericFarmV2::nonReentrant - try again");
        nonReentrant = true;

        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedRewardTokens = int256(user.amount.mul(pool.accRewardTokensPerShare) / ACC_TOKEN_PRECISION);
        uint256 _pendingRewardTokens = accumulatedRewardTokens.sub(user.rewardDebt).toUInt256();

        // Effects
        user.rewardDebt = accumulatedRewardTokens;

        // Interactions
        if (_pendingRewardTokens > 0) {
            REWARD_TOKEN.safeTransfer(to, _pendingRewardTokens);
        }

        emit Harvest(msg.sender, pid, _pendingRewardTokens);
        nonReentrant = false;
    }

    /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the LP tokens.
    function emergencyWithdraw(uint256 pid, address to) public {
        require(address(0) != to, "genericFarmV2::can't withdraw to address zero");
        UserInfo storage user = userInfo[pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        // Note: transfer can fail or succeed if `amount` is zero.
        lpToken[pid].safeTransfer(to, amount);
        emit EmergencyWithdraw(msg.sender, pid, amount, to);
    }
}

File 2 of 7 : BoringMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
library BoringMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");}
    function to128(uint256 a) internal pure returns (uint128 c) {
        require(a <= uint128(-1), "BoringMath: uint128 Overflow");
        c = uint128(a);
    }
    function to64(uint256 a) internal pure returns (uint64 c) {
        require(a <= uint64(-1), "BoringMath: uint64 Overflow");
        c = uint64(a);
    }
    function to32(uint256 a) internal pure returns (uint32 c) {
        require(a <= uint32(-1), "BoringMath: uint32 Overflow");
        c = uint32(a);
    }
}

library BoringMath128 {
    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}

library BoringMath64 {
    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}

library BoringMath32 {
    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}

File 3 of 7 : BoringBatchable.sol
// SPDX-License-Identifier: UNLICENSED
// Audit on 5-Jan-2021 by Keno and BoringCrypto

// P1 - P3: OK
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
// solhint-disable avoid-low-level-calls

import "./libraries/BoringERC20.sol";

// T1 - T4: OK
contract BaseBoringBatchable {
    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";

        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }    
    
    // F3 - F9: OK
    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
    // C1 - C21: OK
    // C3: The length of the loop is fully under user control, so can't be exploited
    // C7: Delegatecall is only used on the same contract, so it's safe
    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {
        // Interactions
        successes = new bool[](calls.length);
        results = new bytes[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            require(success || !revertOnFail, _getRevertMsg(result));
            successes[i] = success;
            results[i] = result;
        }
    }
}

// T1 - T4: OK
contract BoringBatchable is BaseBoringBatchable {
    // F1 - F9: OK
    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
    //     if part of a batch this could be used to grief once as the second call would not need the permit
    // C1 - C21: OK
    function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
        // Interactions
        // X1 - X5
        token.permit(from, to, amount, deadline, v, r, s);
    }
}

File 4 of 7 : BoringOwnable.sol
// SPDX-License-Identifier: MIT
// Audit on 5-Jan-2021 by Keno and BoringCrypto

// P1 - P3: OK
pragma solidity 0.6.12;

// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

// T1 - T4: OK
contract BoringOwnableData {
    // V1 - V5: OK
    address public owner;
    // V1 - V5: OK
    address public pendingOwner;
}

// T1 - T4: OK
contract BoringOwnable is BoringOwnableData {
    // E1: OK
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () public {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;
        
        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    // M1 - M5: OK
    // C1 - C21: OK
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

File 5 of 7 : SignedSafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // 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 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts 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(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }

    function toUInt256(int256 a) internal pure returns (uint256) {
        require(a >= 0, "Integer < 0");
        return uint256(a);
    }
}

File 6 of 7 : BoringERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;

import "../interfaces/IERC20.sol";

library BoringERC20 {
    function safeSymbol(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeName(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}

File 7 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // EIP 2612
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardTokensPerBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardTokensPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardTokensPerBlock","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"SetRewardTokensPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"batch","outputs":[{"internalType":"bool[]","name":"successes","type":"bool[]"},{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getLPSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdateAllPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accRewardTokensPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokensPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setNonReentrant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardTokensPerBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setRewardTokensPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accRewardTokensPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct genericFarmV2.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040516200265138038062002651833981016040819052620000349162000094565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360609190911b6001600160601b0319166080526007556000600655620000ce565b60008060408385031215620000a7578182fd5b82516001600160a01b0381168114620000be578283fd5b6020939093015192949293505050565b60805160601c612560620000f16000398061084452806113e952506125606000f3fe60806040526004361061019c5760003560e01c806378ed5d1f116100ec57806399248ea71161008a578063d2423b5111610064578063d2423b5114610490578063e30c3978146104b1578063ed7abd01146104c6578063efd1a444146104e65761019c565b806399248ea7146104465780639e010fdc1461045b578063c1bcb4931461047b5761019c565b80638dbdbe6d116100c65780638dbdbe6d146103ab57806393abfaf1146103cb57806393f1a40b146103f857806398969e82146104265761019c565b806378ed5d1f146103495780637c516e94146103765780638da5cb5b146103965761019c565b80631ab06ee5116101595780632f940c70116101335780632f940c70146102c75780634e71e0c8146102e757806351eb05a6146102fc57806357a5b58c146103295761019c565b80631ab06ee51461027257806329d0fa3e146102925780632b8bbbe8146102a75761019c565b8063078dfbe7146101a1578063081e3eda146101c35780630ad58d2f146101ee5780631526fe271461020e57806317caf6f11461023d57806318fccc7614610252575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004611ba1565b610506565b005b3480156101cf57600080fd5b506101d86105f5565b6040516101e59190612443565b60405180910390f35b3480156101fa57600080fd5b506101c1610209366004611e70565b6105fb565b34801561021a57600080fd5b5061022e610229366004611dcc565b610735565b6040516101e593929190612419565b34801561024957600080fd5b506101d8610777565b34801561025e57600080fd5b506101c161026d366004611dfc565b61077d565b34801561027e57600080fd5b506101c161028d366004611e4f565b6108bf565b34801561029e57600080fd5b506101d86109ae565b3480156102b357600080fd5b506101c16102c2366004611dfc565b6109b4565b3480156102d357600080fd5b506101c16102e2366004611dfc565b610b99565b3480156102f357600080fd5b506101c1610c51565b34801561030857600080fd5b5061031c610317366004611dcc565b610cde565b6040516101e591906123e0565b34801561033557600080fd5b506101c1610344366004611c34565b610f71565b34801561035557600080fd5b50610369610364366004611dcc565b610fa7565b6040516101e59190611ef5565b34801561038257600080fd5b506101c1610391366004611cab565b610fce565b3480156103a257600080fd5b50610369611042565b3480156103b757600080fd5b506101c16103c6366004611e70565b611051565b3480156103d757600080fd5b506103eb6103e6366004611c73565b61117a565b6040516101e59190612021565b34801561040457600080fd5b50610418610413366004611dfc565b6111bf565b6040516101e592919061245c565b34801561043257600080fd5b506101d8610441366004611dfc565b6111e3565b34801561045257600080fd5b506103696113e7565b34801561046757600080fd5b506101c1610476366004611e2b565b61140b565b34801561048757600080fd5b506101c1611486565b6104a361049e366004611beb565b6114aa565b6040516101e5929190611f87565b3480156104bd57600080fd5b5061036961163a565b3480156104d257600080fd5b506101d86104e1366004611dcc565b611649565b3480156104f257600080fd5b506101d8610501366004611dcc565b6116a4565b6000546001600160a01b031633146105395760405162461bcd60e51b81526004016105309061228f565b60405180910390fd5b81156105d4576001600160a01b0383161515806105535750805b61056f5760405162461bcd60e51b81526004016105309061219f565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b0319918216179091556001805490911690556105f0565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60025490565b60085460ff161561061e5760405162461bcd60e51b8152600401610530906120ca565b6008805460ff19166001179055610633611b39565b61063c84610cde565b6000858152600560209081526040808320338452909152902081519192509061069190670de0b6b3a76400009061067d9087906001600160801b0316611744565b8161068457fe5b6001840154919004611781565b600182015580546106a290856117c7565b81600001819055506106d88385600388815481106106bc57fe5b6000918252602090912001546001600160a01b031691906117ea565b826001600160a01b031685336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328760405161071c9190612443565b60405180910390a450506008805460ff19169055505050565b6002818154811061074257fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60065481565b60085460ff16156107a05760405162461bcd60e51b8152600401610530906120ca565b6008805460ff191660011790556107b5611b39565b6107be83610cde565b60008481526005602090815260408083203384529091528120825181549394509092670de0b6b3a7640000916107fd91906001600160801b0316611744565b8161080457fe5b049050600061082861082384600101548461178190919063ffffffff16565b6118d8565b600184018390559050801561086b5761086b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686836117ea565b85336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954836040516108a59190612443565b60405180910390a350506008805460ff1916905550505050565b6000546001600160a01b031633146108e95760405162461bcd60e51b81526004016105309061228f565b61092881610922600285815481106108fd57fe5b60009182526020909120015460065490600160c01b90046001600160401b03166117c7565b906118fe565b60065561093481611921565b6002838154811061094157fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b03160217905550817f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c826040516109a29190612443565b60405180910390a25050565b60075481565b6000546001600160a01b031633146109de5760405162461bcd60e51b81526004016105309061228f565b6001600160a01b03811660009081526004602052604090205460ff1615610a175760405162461bcd60e51b81526004016105309061223c565b6006544390610a2690846118fe565b6006556003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556000908152600460209081526040808320805460ff1916909417909355825160608101909352908252600291908101610aab84611921565b6001600160401b03168152602001610ac286611921565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556003546001600160a01b03841691610b5d91906117c7565b7f4710feb78e3bce8d2e3ca2989a8eb2f8bcd32a6a55b4535942c180fc4d2e295285604051610b8c9190612443565b60405180910390a3505050565b6001600160a01b038116610bbf5760405162461bcd60e51b815260040161053090612152565b600082815260056020908152604080832033845290915281208054828255600182019290925560038054919291610bff918591849190889081106106bc57fe5b826001600160a01b031684336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610c439190612443565b60405180910390a450505050565b6001546001600160a01b0316338114610c7c5760405162461bcd60e51b8152600401610530906122c4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b610ce6611b39565b60028281548110610cf357fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b90910416908201529150431115610f6c57600060038381548110610d5557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610d8e903090600401611ef5565b60206040518083038186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190611de4565b9050600081118015610df257506000600654115b15610e90576000610e1983602001516001600160401b0316436117c790919063ffffffff16565b9050610e83610e7283600654610e5d670de0b6b3a7640000610e5789604001516001600160401b0316610e576007548a61174490919063ffffffff16565b90611744565b81610e6457fe5b0481610e6c57fe5b0461194a565b84516001600160801b031690611973565b6001600160801b03168352505b610e9943611921565b6001600160401b031660208301526002805483919085908110610eb857fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610f62929091869161246a565b60405180910390a2505b919050565b8060005b81811015610fa157610f98848483818110610f8c57fe5b90506020020135610cde565b50600101610f75565b50505050565b60038181548110610fb457fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611006908a908a908a908a908a908a908a90600401611f2d565b600060405180830381600087803b15801561102057600080fd5b505af1158015611034573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b031681565b60085460ff16156110745760405162461bcd60e51b8152600401610530906120ca565b6008805460ff19166001179055611089611b39565b61109284610cde565b60008581526005602090815260408083206001600160a01b038716845290915290208054919250906110c490856118fe565b815581516110fe90670de0b6b3a7640000906110ea9087906001600160801b0316611744565b816110f157fe5b60018401549190046119a2565b81600101819055506111363330866003898154811061111957fe5b6000918252602090912001546001600160a01b03169291906119e8565b826001600160a01b031685336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161071c9190612443565b600080546001600160a01b031633146111a55760405162461bcd60e51b81526004016105309061228f565b506008805460ff1916911515919091179081905560ff1690565b60056020908152600092835260408084209091529082529020805460019091015482565b60006111ed611b39565b600284815481106111fa57fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b038916865290925291832082516003805494965091949216928890811061127857fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906112b1903090600401611ef5565b60206040518083038186803b1580156112c957600080fd5b505afa1580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113019190611de4565b905083602001516001600160401b03164311801561131f5750600081115b801561132d57506000600654115b156113ab57600061135485602001516001600160401b0316436117c790919063ffffffff16565b90506113a78260065461138f670de0b6b3a7640000610e578a604001516001600160401b0316610e576007548961174490919063ffffffff16565b8161139657fe5b048161139e57fe5b859190046118fe565b9250505b600183015483546113dc9161082391670de0b6b3a7640000906113ce9087611744565b816113d557fe5b0490611781565b979650505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031633146114355760405162461bcd60e51b81526004016105309061228f565b801561144357611443611486565b60078290556040517fcc069b8c9af94925359e6af7d93ca7b796d7808e214ac9a0ab912688f06c22f29061147a908490849061244c565b60405180910390a15050565b60025460005b818110156114a65761149d81610cde565b5060010161148c565b5050565b606080836001600160401b03811180156114c357600080fd5b506040519080825280602002602001820160405280156114ed578160200160208202803683370190505b509150836001600160401b038111801561150657600080fd5b5060405190808252806020026020018201604052801561153a57816020015b60608152602001906001900390816115255790505b50905060005b8481101561163157600060603088888581811061155957fe5b905060200281019061156b9190612494565b604051611579929190611ec9565b600060405180830381855af49150503d80600081146115b4576040519150601f19603f3d011682016040523d82523d6000602084013e6115b9565b606091505b509150915081806115c8575085155b6115d182611ad9565b906115ef5760405162461bcd60e51b8152600401610530919061202c565b50818584815181106115fd57fe5b6020026020010190151590811515815250508084848151811061161c57fe5b60209081029190910101525050600101611540565b50935093915050565b6001546001600160a01b031681565b60006006546000141561165e57506000610f6c565b6006546116966002848154811061167157fe5b60009182526020909120015460075490600160c01b90046001600160401b0316611744565b8161169d57fe5b0492915050565b600080600383815481106116b457fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906116ed903090600401611ef5565b60206040518083038186803b15801561170557600080fd5b505afa158015611719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173d9190611de4565b9392505050565b600081158061175f5750508082028282828161175c57fe5b04145b61177b5760405162461bcd60e51b8152600401610530906123a9565b92915050565b60008183038183128015906117965750838113155b806117ab57506000831280156117ab57508381135b61173d5760405162461bcd60e51b815260040161053090612330565b8082038281111561177b5760405162461bcd60e51b81526004016105309061203f565b60006060846001600160a01b031663a9059cbb8585604051602401611810929190611f6e565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516118499190611ed9565b6000604051808303816000865af19150503d8060008114611886576040519150601f19603f3d011682016040523d82523d6000602084013e61188b565b606091505b50915091508180156118b55750805115806118b55750808060200190518101906118b59190611c8f565b6118d15760405162461bcd60e51b815260040161053090612093565b5050505050565b6000808212156118fa5760405162461bcd60e51b81526004016105309061206e565b5090565b8181018181101561177b5760405162461bcd60e51b815260040161053090612205565b60006001600160401b038211156118fa5760405162461bcd60e51b8152600401610530906122f9565b60006001600160801b038211156118fa5760405162461bcd60e51b8152600401610530906121ce565b8181016001600160801b03808316908216101561177b5760405162461bcd60e51b815260040161053090612205565b60008282018183128015906119b75750838112155b806119cc57506000831280156119cc57508381125b61173d5760405162461bcd60e51b815260040161053090612111565b60006060856001600160a01b03166323b872dd868686604051602401611a1093929190611f09565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611a499190611ed9565b6000604051808303816000865af19150503d8060008114611a86576040519150601f19603f3d011682016040523d82523d6000602084013e611a8b565b606091505b5091509150818015611ab5575080511580611ab5575080806020019051810190611ab59190611c8f565b611ad15760405162461bcd60e51b815260040161053090612374565b505050505050565b6060604482511015611b1f575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610f6c565b6004820191508180602001905181019061177b9190611d32565b604080516060810182526000808252602082018190529181019190915290565b60008083601f840112611b6a578182fd5b5081356001600160401b03811115611b80578182fd5b6020830191508360208083028501011115611b9a57600080fd5b9250929050565b600080600060608486031215611bb5578283fd5b8335611bc081612504565b92506020840135611bd08161251c565b91506040840135611be08161251c565b809150509250925092565b600080600060408486031215611bff578283fd5b83356001600160401b03811115611c14578384fd5b611c2086828701611b59565b9094509250506020840135611be08161251c565b60008060208385031215611c46578182fd5b82356001600160401b03811115611c5b578283fd5b611c6785828601611b59565b90969095509350505050565b600060208284031215611c84578081fd5b813561173d8161251c565b600060208284031215611ca0578081fd5b815161173d8161251c565b600080600080600080600080610100898b031215611cc7578384fd5b8835611cd281612504565b97506020890135611ce281612504565b96506040890135611cf281612504565b9550606089013594506080890135935060a089013560ff81168114611d15578384fd5b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215611d43578081fd5b81516001600160401b0380821115611d59578283fd5b818401915084601f830112611d6c578283fd5b815181811115611d7a578384fd5b604051601f8201601f191681016020018381118282101715611d9a578586fd5b604052818152838201602001871015611db1578485fd5b611dc28260208301602087016124d8565b9695505050505050565b600060208284031215611ddd578081fd5b5035919050565b600060208284031215611df5578081fd5b5051919050565b60008060408385031215611e0e578182fd5b823591506020830135611e2081612504565b809150509250929050565b60008060408385031215611e3d578182fd5b823591506020830135611e208161251c565b60008060408385031215611e61578081fd5b50508035926020909101359150565b600080600060608486031215611e84578081fd5b83359250602084013591506040840135611be081612504565b60008151808452611eb58160208601602086016124d8565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251611eeb8184602087016124d8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611fc2578151151584529284019290840190600101611fa4565b50505083810382850152808551611fd98184612443565b91508192508381028201848801865b83811015612012578583038552612000838351611e9d565b94870194925090860190600101611fe8565b50909998505050505050505050565b901515815260200190565b60006020825261173d6020830184611e9d565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526027908201527f67656e657269634661726d56323a3a6e6f6e5265656e7472616e74202d2074726040820152663c9030b3b0b4b760c91b606082015260800190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602d908201527f67656e657269634661726d56323a3a63616e277420776974686472617720746f60408201526c2061646472657373207a65726f60981b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526033908201527f67656e657269634661726d56323a3a746865726520697320616c72656164792060408201527206120706f6f6c20776974682074686973204c5606c1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e198436030181126124aa578283fd5b8301803591506001600160401b038211156124c3578283fd5b602001915036819003821315611b9a57600080fd5b60005b838110156124f35781810151838201526020016124db565b83811115610fa15750506000910152565b6001600160a01b038116811461251957600080fd5b50565b801515811461251957600080fdfea264697066735822122062fdf41212b4b6cd2581c897e822e6c629abbbe123b2b204f1147696f7e90e9d64736f6c634300060c0033000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061019c5760003560e01c806378ed5d1f116100ec57806399248ea71161008a578063d2423b5111610064578063d2423b5114610490578063e30c3978146104b1578063ed7abd01146104c6578063efd1a444146104e65761019c565b806399248ea7146104465780639e010fdc1461045b578063c1bcb4931461047b5761019c565b80638dbdbe6d116100c65780638dbdbe6d146103ab57806393abfaf1146103cb57806393f1a40b146103f857806398969e82146104265761019c565b806378ed5d1f146103495780637c516e94146103765780638da5cb5b146103965761019c565b80631ab06ee5116101595780632f940c70116101335780632f940c70146102c75780634e71e0c8146102e757806351eb05a6146102fc57806357a5b58c146103295761019c565b80631ab06ee51461027257806329d0fa3e146102925780632b8bbbe8146102a75761019c565b8063078dfbe7146101a1578063081e3eda146101c35780630ad58d2f146101ee5780631526fe271461020e57806317caf6f11461023d57806318fccc7614610252575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004611ba1565b610506565b005b3480156101cf57600080fd5b506101d86105f5565b6040516101e59190612443565b60405180910390f35b3480156101fa57600080fd5b506101c1610209366004611e70565b6105fb565b34801561021a57600080fd5b5061022e610229366004611dcc565b610735565b6040516101e593929190612419565b34801561024957600080fd5b506101d8610777565b34801561025e57600080fd5b506101c161026d366004611dfc565b61077d565b34801561027e57600080fd5b506101c161028d366004611e4f565b6108bf565b34801561029e57600080fd5b506101d86109ae565b3480156102b357600080fd5b506101c16102c2366004611dfc565b6109b4565b3480156102d357600080fd5b506101c16102e2366004611dfc565b610b99565b3480156102f357600080fd5b506101c1610c51565b34801561030857600080fd5b5061031c610317366004611dcc565b610cde565b6040516101e591906123e0565b34801561033557600080fd5b506101c1610344366004611c34565b610f71565b34801561035557600080fd5b50610369610364366004611dcc565b610fa7565b6040516101e59190611ef5565b34801561038257600080fd5b506101c1610391366004611cab565b610fce565b3480156103a257600080fd5b50610369611042565b3480156103b757600080fd5b506101c16103c6366004611e70565b611051565b3480156103d757600080fd5b506103eb6103e6366004611c73565b61117a565b6040516101e59190612021565b34801561040457600080fd5b50610418610413366004611dfc565b6111bf565b6040516101e592919061245c565b34801561043257600080fd5b506101d8610441366004611dfc565b6111e3565b34801561045257600080fd5b506103696113e7565b34801561046757600080fd5b506101c1610476366004611e2b565b61140b565b34801561048757600080fd5b506101c1611486565b6104a361049e366004611beb565b6114aa565b6040516101e5929190611f87565b3480156104bd57600080fd5b5061036961163a565b3480156104d257600080fd5b506101d86104e1366004611dcc565b611649565b3480156104f257600080fd5b506101d8610501366004611dcc565b6116a4565b6000546001600160a01b031633146105395760405162461bcd60e51b81526004016105309061228f565b60405180910390fd5b81156105d4576001600160a01b0383161515806105535750805b61056f5760405162461bcd60e51b81526004016105309061219f565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b0319918216179091556001805490911690556105f0565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60025490565b60085460ff161561061e5760405162461bcd60e51b8152600401610530906120ca565b6008805460ff19166001179055610633611b39565b61063c84610cde565b6000858152600560209081526040808320338452909152902081519192509061069190670de0b6b3a76400009061067d9087906001600160801b0316611744565b8161068457fe5b6001840154919004611781565b600182015580546106a290856117c7565b81600001819055506106d88385600388815481106106bc57fe5b6000918252602090912001546001600160a01b031691906117ea565b826001600160a01b031685336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328760405161071c9190612443565b60405180910390a450506008805460ff19169055505050565b6002818154811061074257fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60065481565b60085460ff16156107a05760405162461bcd60e51b8152600401610530906120ca565b6008805460ff191660011790556107b5611b39565b6107be83610cde565b60008481526005602090815260408083203384529091528120825181549394509092670de0b6b3a7640000916107fd91906001600160801b0316611744565b8161080457fe5b049050600061082861082384600101548461178190919063ffffffff16565b6118d8565b600184018390559050801561086b5761086b6001600160a01b037f000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d1686836117ea565b85336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954836040516108a59190612443565b60405180910390a350506008805460ff1916905550505050565b6000546001600160a01b031633146108e95760405162461bcd60e51b81526004016105309061228f565b61092881610922600285815481106108fd57fe5b60009182526020909120015460065490600160c01b90046001600160401b03166117c7565b906118fe565b60065561093481611921565b6002838154811061094157fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b03160217905550817f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c826040516109a29190612443565b60405180910390a25050565b60075481565b6000546001600160a01b031633146109de5760405162461bcd60e51b81526004016105309061228f565b6001600160a01b03811660009081526004602052604090205460ff1615610a175760405162461bcd60e51b81526004016105309061223c565b6006544390610a2690846118fe565b6006556003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556000908152600460209081526040808320805460ff1916909417909355825160608101909352908252600291908101610aab84611921565b6001600160401b03168152602001610ac286611921565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556003546001600160a01b03841691610b5d91906117c7565b7f4710feb78e3bce8d2e3ca2989a8eb2f8bcd32a6a55b4535942c180fc4d2e295285604051610b8c9190612443565b60405180910390a3505050565b6001600160a01b038116610bbf5760405162461bcd60e51b815260040161053090612152565b600082815260056020908152604080832033845290915281208054828255600182019290925560038054919291610bff918591849190889081106106bc57fe5b826001600160a01b031684336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610c439190612443565b60405180910390a450505050565b6001546001600160a01b0316338114610c7c5760405162461bcd60e51b8152600401610530906122c4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b610ce6611b39565b60028281548110610cf357fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b90910416908201529150431115610f6c57600060038381548110610d5557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610d8e903090600401611ef5565b60206040518083038186803b158015610da657600080fd5b505afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190611de4565b9050600081118015610df257506000600654115b15610e90576000610e1983602001516001600160401b0316436117c790919063ffffffff16565b9050610e83610e7283600654610e5d670de0b6b3a7640000610e5789604001516001600160401b0316610e576007548a61174490919063ffffffff16565b90611744565b81610e6457fe5b0481610e6c57fe5b0461194a565b84516001600160801b031690611973565b6001600160801b03168352505b610e9943611921565b6001600160401b031660208301526002805483919085908110610eb857fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610f62929091869161246a565b60405180910390a2505b919050565b8060005b81811015610fa157610f98848483818110610f8c57fe5b90506020020135610cde565b50600101610f75565b50505050565b60038181548110610fb457fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611006908a908a908a908a908a908a908a90600401611f2d565b600060405180830381600087803b15801561102057600080fd5b505af1158015611034573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b031681565b60085460ff16156110745760405162461bcd60e51b8152600401610530906120ca565b6008805460ff19166001179055611089611b39565b61109284610cde565b60008581526005602090815260408083206001600160a01b038716845290915290208054919250906110c490856118fe565b815581516110fe90670de0b6b3a7640000906110ea9087906001600160801b0316611744565b816110f157fe5b60018401549190046119a2565b81600101819055506111363330866003898154811061111957fe5b6000918252602090912001546001600160a01b03169291906119e8565b826001600160a01b031685336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161071c9190612443565b600080546001600160a01b031633146111a55760405162461bcd60e51b81526004016105309061228f565b506008805460ff1916911515919091179081905560ff1690565b60056020908152600092835260408084209091529082529020805460019091015482565b60006111ed611b39565b600284815481106111fa57fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b038916865290925291832082516003805494965091949216928890811061127857fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906112b1903090600401611ef5565b60206040518083038186803b1580156112c957600080fd5b505afa1580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113019190611de4565b905083602001516001600160401b03164311801561131f5750600081115b801561132d57506000600654115b156113ab57600061135485602001516001600160401b0316436117c790919063ffffffff16565b90506113a78260065461138f670de0b6b3a7640000610e578a604001516001600160401b0316610e576007548961174490919063ffffffff16565b8161139657fe5b048161139e57fe5b859190046118fe565b9250505b600183015483546113dc9161082391670de0b6b3a7640000906113ce9087611744565b816113d557fe5b0490611781565b979650505050505050565b7f000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d81565b6000546001600160a01b031633146114355760405162461bcd60e51b81526004016105309061228f565b801561144357611443611486565b60078290556040517fcc069b8c9af94925359e6af7d93ca7b796d7808e214ac9a0ab912688f06c22f29061147a908490849061244c565b60405180910390a15050565b60025460005b818110156114a65761149d81610cde565b5060010161148c565b5050565b606080836001600160401b03811180156114c357600080fd5b506040519080825280602002602001820160405280156114ed578160200160208202803683370190505b509150836001600160401b038111801561150657600080fd5b5060405190808252806020026020018201604052801561153a57816020015b60608152602001906001900390816115255790505b50905060005b8481101561163157600060603088888581811061155957fe5b905060200281019061156b9190612494565b604051611579929190611ec9565b600060405180830381855af49150503d80600081146115b4576040519150601f19603f3d011682016040523d82523d6000602084013e6115b9565b606091505b509150915081806115c8575085155b6115d182611ad9565b906115ef5760405162461bcd60e51b8152600401610530919061202c565b50818584815181106115fd57fe5b6020026020010190151590811515815250508084848151811061161c57fe5b60209081029190910101525050600101611540565b50935093915050565b6001546001600160a01b031681565b60006006546000141561165e57506000610f6c565b6006546116966002848154811061167157fe5b60009182526020909120015460075490600160c01b90046001600160401b0316611744565b8161169d57fe5b0492915050565b600080600383815481106116b457fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906116ed903090600401611ef5565b60206040518083038186803b15801561170557600080fd5b505afa158015611719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173d9190611de4565b9392505050565b600081158061175f5750508082028282828161175c57fe5b04145b61177b5760405162461bcd60e51b8152600401610530906123a9565b92915050565b60008183038183128015906117965750838113155b806117ab57506000831280156117ab57508381135b61173d5760405162461bcd60e51b815260040161053090612330565b8082038281111561177b5760405162461bcd60e51b81526004016105309061203f565b60006060846001600160a01b031663a9059cbb8585604051602401611810929190611f6e565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516118499190611ed9565b6000604051808303816000865af19150503d8060008114611886576040519150601f19603f3d011682016040523d82523d6000602084013e61188b565b606091505b50915091508180156118b55750805115806118b55750808060200190518101906118b59190611c8f565b6118d15760405162461bcd60e51b815260040161053090612093565b5050505050565b6000808212156118fa5760405162461bcd60e51b81526004016105309061206e565b5090565b8181018181101561177b5760405162461bcd60e51b815260040161053090612205565b60006001600160401b038211156118fa5760405162461bcd60e51b8152600401610530906122f9565b60006001600160801b038211156118fa5760405162461bcd60e51b8152600401610530906121ce565b8181016001600160801b03808316908216101561177b5760405162461bcd60e51b815260040161053090612205565b60008282018183128015906119b75750838112155b806119cc57506000831280156119cc57508381125b61173d5760405162461bcd60e51b815260040161053090612111565b60006060856001600160a01b03166323b872dd868686604051602401611a1093929190611f09565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611a499190611ed9565b6000604051808303816000865af19150503d8060008114611a86576040519150601f19603f3d011682016040523d82523d6000602084013e611a8b565b606091505b5091509150818015611ab5575080511580611ab5575080806020019051810190611ab59190611c8f565b611ad15760405162461bcd60e51b815260040161053090612374565b505050505050565b6060604482511015611b1f575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610f6c565b6004820191508180602001905181019061177b9190611d32565b604080516060810182526000808252602082018190529181019190915290565b60008083601f840112611b6a578182fd5b5081356001600160401b03811115611b80578182fd5b6020830191508360208083028501011115611b9a57600080fd5b9250929050565b600080600060608486031215611bb5578283fd5b8335611bc081612504565b92506020840135611bd08161251c565b91506040840135611be08161251c565b809150509250925092565b600080600060408486031215611bff578283fd5b83356001600160401b03811115611c14578384fd5b611c2086828701611b59565b9094509250506020840135611be08161251c565b60008060208385031215611c46578182fd5b82356001600160401b03811115611c5b578283fd5b611c6785828601611b59565b90969095509350505050565b600060208284031215611c84578081fd5b813561173d8161251c565b600060208284031215611ca0578081fd5b815161173d8161251c565b600080600080600080600080610100898b031215611cc7578384fd5b8835611cd281612504565b97506020890135611ce281612504565b96506040890135611cf281612504565b9550606089013594506080890135935060a089013560ff81168114611d15578384fd5b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215611d43578081fd5b81516001600160401b0380821115611d59578283fd5b818401915084601f830112611d6c578283fd5b815181811115611d7a578384fd5b604051601f8201601f191681016020018381118282101715611d9a578586fd5b604052818152838201602001871015611db1578485fd5b611dc28260208301602087016124d8565b9695505050505050565b600060208284031215611ddd578081fd5b5035919050565b600060208284031215611df5578081fd5b5051919050565b60008060408385031215611e0e578182fd5b823591506020830135611e2081612504565b809150509250929050565b60008060408385031215611e3d578182fd5b823591506020830135611e208161251c565b60008060408385031215611e61578081fd5b50508035926020909101359150565b600080600060608486031215611e84578081fd5b83359250602084013591506040840135611be081612504565b60008151808452611eb58160208601602086016124d8565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251611eeb8184602087016124d8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611fc2578151151584529284019290840190600101611fa4565b50505083810382850152808551611fd98184612443565b91508192508381028201848801865b83811015612012578583038552612000838351611e9d565b94870194925090860190600101611fe8565b50909998505050505050505050565b901515815260200190565b60006020825261173d6020830184611e9d565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526027908201527f67656e657269634661726d56323a3a6e6f6e5265656e7472616e74202d2074726040820152663c9030b3b0b4b760c91b606082015260800190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602d908201527f67656e657269634661726d56323a3a63616e277420776974686472617720746f60408201526c2061646472657373207a65726f60981b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526033908201527f67656e657269634661726d56323a3a746865726520697320616c72656164792060408201527206120706f6f6c20776974682074686973204c5606c1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e198436030181126124aa578283fd5b8301803591506001600160401b038211156124c3578283fd5b602001915036819003821315611b9a57600080fd5b60005b838110156124f35781810151838201526020016124db565b83811115610fa15750506000910152565b6001600160a01b038116811461251957600080fd5b50565b801515811461251957600080fdfea264697066735822122062fdf41212b4b6cd2581c897e822e6c629abbbe123b2b204f1147696f7e90e9d64736f6c634300060c0033

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

000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x970B9bB2C0444F5E81e9d0eFb84C8ccdcdcAf84d
Arg [1] : _rewardTokensPerBlock (uint256): 0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


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.