MATIC Price: $0.506355 (+1.65%)
Gas: 30.1 GWei
 

Sponsored

Transaction Hash
Method
Block
From
To
Value
Stake590800702024-07-07 19:25:215 days ago1720380321IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0027017433.00000002
Stake590403962024-07-06 19:42:176 days ago1720294937IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0027840234
Stake589161812024-07-03 17:31:299 days ago1720027889IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0108715731
Stake588792352024-07-02 19:07:4310 days ago1719947263IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0028654835.00000056
Stake588786472024-07-02 18:45:4910 days ago1719945949IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0080466837
Stake588062292024-06-30 22:55:3912 days ago1719788139IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0040429749.38219998
Stake587838522024-06-30 9:40:4712 days ago1719740447IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0077001531
Stake587584602024-06-29 18:22:3213 days ago1719685352IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0142993740.78450904
Stake586493992024-06-27 0:42:5915 days ago1719448979IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0047986532
Withdraw585112012024-06-23 13:30:3119 days ago1719149431IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0160068840
Withdraw584859462024-06-22 22:17:0820 days ago1719094628IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0069306633
Stake584362762024-06-21 16:40:1721 days ago1718988017IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0129960932
Stake584094832024-06-21 0:35:2721 days ago1718930127IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0065718840
Transfer583911332024-06-20 13:28:4222 days ago1718890122IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0017849557
Withdraw583910572024-06-20 13:26:0222 days ago1718889962IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0182727887
Stake583176712024-06-18 16:52:5124 days ago1718729571IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0124154330.38107736
Stake581865882024-06-15 10:29:4027 days ago1718447380IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0097617431
Stake581658032024-06-14 21:45:0928 days ago1718401509IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0029463135.9872819
Stake581210632024-06-13 18:44:4429 days ago1718304284IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0125845731
Transfer581137702024-06-13 14:24:3529 days ago1718288675IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0237401767
Stake580988412024-06-13 5:34:0729 days ago1718256847IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0130137932.05044186
Stake580807602024-06-12 18:44:2730 days ago1718217867IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0029477836
Stake580787192024-06-12 17:32:0130 days ago1718213521IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0024561930.00084644
Stake580786562024-06-12 17:29:4930 days ago1718213389IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0032748139.99965696
Stake579234192024-06-08 19:01:0034 days ago1717873260IN
0xA63738dE...BFE9Dfd55
0 MATIC0.0126230330.00004771
View all transactions

Parent Transaction Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BlocEthFarm

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
File 1 of 4 : BlocEthFarm.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import "./Ownable.sol";
import "./IUniswapV2Router02.sol";
import "./IERC20.sol";

interface ICustomizedRewards {
    function trigger(address user, uint256 amount, address yieldToken) external;
}

contract BlocEthFarm is Ownable, IERC20 {
    // name and symbol for tokenized contract
    string private _name;
    string private _symbol;
    uint8 private immutable _decimals;

    // Farming Token
    address public immutable token;

    // Reward Token
    address public immutable reward;

    // User Info
    struct UserInfo {
        uint256 amount; // amount of LP tokens staked
        uint256 totalExcluded; // tracked reward debt
        uint256 index; // index in holders list
    }
    // Address => UserInfo

    mapping(address => UserInfo) public userInfo;

    // List of all holders
    address[] public allHolders;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;

    // Tracks Dividends
    uint256 public totalRewards;
    uint256 private totalShares;
    uint256 private dividendsPerShare;
    uint256 private constant precision = 10 ** 18;

    // Index of current holder in multi claim
    uint256 public currentMultiClaimHolderIndex;

    // Minimum token holding amount to have rewards claimed via bounty
    uint256 public minHoldingsForAutoClaim = 1;

    // minimum pending rewards needed to be auto claimed
    uint256 public minPendingRewardsForAutoClaim = 1;

    // Deposit And Withdraw Fee
    uint256 public depositFee = 30;
    uint256 public withdrawFee = 30;
    uint256 private constant FEE_DENOM = 1000;
    uint256 public slippageTolerance = 500; // 5% of 10000

    // Deposit And Withdraw Fee Recipient
    address public feeRecipient;

    // Lets this many users pass in `iterations` when mass claiming if they do not meet the criteria
    uint256 public inelligibleClaimsCheck = 50;

    // Customizable Rewards Contract
    ICustomizedRewards public customizedRewards;

    // Contract to go in and out of farms tax free
    address public taxlessWithdrawContract;

    // Events
    event Deposit(address indexed user, uint256 amount);
    event ClaimReward(address indexed user, uint256 reward);
    event FeeUpdated(uint256 depositFee, uint256 withdrawFee);
    event RewardsDeposited(uint256 amount);
    event CustomizedRewardsSet(address newCustomizedRewards);
    event FeeRecipientSet(address newRecipient);
    event TaxlessWithdrawContractSet(address taxlessWithdrawContract);
    event MinHoldingsForAutoClaimSet(uint256 newMin);
    event MinPendingRewardsForAutoClaimSet(uint256 newMin);
    event InelligibleClaimsCheckSet(uint256 newCheck);
    event MulticlaimIndexReset();

    bool private lock = false;

    modifier noReentrant() {
        require(!lock, "No Re-Entrancy");
        lock = true;
        _;
        lock = false;
    }

    constructor(address token_, address reward_, string memory name_, string memory symbol_, address feeRecipient_) {
        require(token_ != address(0) && reward_ != address(0), "Zero Address");
        token = token_;
        reward = reward_;
        _name = name_;
        _symbol = symbol_;
        _decimals = IERC20(token_).decimals();
        feeRecipient = feeRecipient_;
        emit Transfer(address(0), msg.sender, 0);
    }

    /**
     * Returns the total number of tokens in existence
     */
    function totalSupply() external view override returns (uint256) {
        return totalShares;
    }

    /**
     * Returns the number of tokens owned by `account`
     */
    function balanceOf(address account) public view override returns (uint256) {
        return userInfo[account].amount;
    }

    /**
     * Returns the number of tokens `spender` can transfer from `holder`
     */
    function allowance(address, address) external pure override returns (uint256) {
        return 0;
    }

    /**
     * Token Name
     */
    function name() public view override returns (string memory) {
        return _name;
    }

    /**
     * Token Ticker Symbol
     */
    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    /**
     * Tokens decimals
     */
    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    /**
     * Approves `spender` to transfer `amount` tokens from caller
     */
    function approve(address spender, uint256) public override returns (bool) {
        emit Approval(msg.sender, spender, 0);
        return true;
    }

    function setSlippageTolerance(uint256 slippageTolerance_) external onlyOwner {
        require(slippageTolerance_ <= 10000, "Slippage Tolerance Check");
        slippageTolerance = slippageTolerance_;
    }

    /**
     * Transfer Function
     */
    function transfer(address recipient, uint256) external override returns (bool) {
        _claimReward(msg.sender);
        emit Transfer(msg.sender, recipient, 0);
        return true;
    }

    /**
     * Transfer Function
     */
    function transferFrom(address, address recipient, uint256) external override returns (bool) {
        _claimReward(msg.sender);
        emit Transfer(msg.sender, recipient, 0);
        return true;
    }

    function setCustomizedRewards(address newCustomizedRewards) external onlyOwner {
        require(goodAddress(newCustomizedRewards) == true, "Invalid Address!");
        customizedRewards = ICustomizedRewards(newCustomizedRewards);

        emit CustomizedRewardsSet(newCustomizedRewards);
    }

    function setFees(uint256 depositFee_, uint256 withdrawFee_) external onlyOwner {
        require(depositFee_ <= FEE_DENOM / 2, "Deposit Fee Too High");
        require(withdrawFee_ <= FEE_DENOM / 2, "Withdraw Fee Too High");
        depositFee = depositFee_;
        withdrawFee = withdrawFee_;

        emit FeeUpdated(depositFee, withdrawFee);
    }

    function setTaxlessWithdrawContract(address taxlessWithdrawContract_) external onlyOwner {
        // require its not the zero
        require(taxlessWithdrawContract_ != address(0), "Zero Address");
        // require its not the dead address
        require(taxlessWithdrawContract_ != address(0x000000000000000000000000000000000000dEaD), "Dead Address");

        taxlessWithdrawContract = taxlessWithdrawContract_;
        emit TaxlessWithdrawContractSet(taxlessWithdrawContract);
    }

    function setFeeRecipient(address newRecipient) external onlyOwner {
        require(newRecipient != address(0), "Zero Address");
        feeRecipient = newRecipient;

        emit FeeRecipientSet(newRecipient);
    }

    function withdrawForeignToken(address token_, uint256 amount) external onlyOwner {
        require(token != token_, "Cannot Withdraw Farm Token");
        require(IERC20(token_).transfer(msg.sender, amount), "Failure On Token Withdraw");
    }

    function withdrawNative() external onlyOwner {
        (bool s,) = payable(msg.sender).call{value: address(this).balance}("");
        require(s);
    }

    function resetMulticlaimIndex() external onlyOwner {
        currentMultiClaimHolderIndex = 0;
        emit MulticlaimIndexReset();
    }

    function setMinHoldingsForAutoClaim(uint256 newMin) external onlyOwner {
        require(newMin > 0, "Must be at least 1 wei of tokens");
        minHoldingsForAutoClaim = newMin;
        emit MinHoldingsForAutoClaimSet(newMin);
    }

    function setMinPendingRewardsForAutoClaim(uint256 newMin) external onlyOwner {
        require(newMin > 0, "Cannot Claim Zero Rewards");
        minPendingRewardsForAutoClaim = newMin;
        emit MinPendingRewardsForAutoClaimSet(newMin);
    }

    function setInelligibleClaimsCheck(uint256 newCheck) external onlyOwner {
        inelligibleClaimsCheck = newCheck;
        emit InelligibleClaimsCheckSet(newCheck);
    }

    function rollOverDustIntoRewards(address router_, address wrappedEth) external onlyOwner {
        // instantiate router
        IUniswapV2Router02 router = IUniswapV2Router02(router_);

        // amount of WETH to convert
        uint256 amount = IERC20(wrappedEth).balanceOf(address(this));
        require(amount > 0, "Zero Amount");

        // define swap path
        address[] memory path = new address[](2);
        path[0] = wrappedEth;
        path[1] = reward;

        // note BLOC balance before swap
        uint256 before = IERC20(reward).balanceOf(address(this));

        // swap Eth into BLOC
        IERC20(wrappedEth).approve(address(router), amount);
        router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            amount, amount * (10000 - slippageTolerance) / 10000, path, address(this), block.timestamp + 100
        );

        // note amount received from swap
        uint256 After = IERC20(reward).balanceOf(address(this));
        require(After > before, "Zero Received");

        // add to everyone's pending rewards
        _processDividendPerShareIncrease(After - before);
    }

    function claimRewards() external noReentrant {
        _claimReward(msg.sender);
    }

    function multiClaim(uint256 iterations) external noReentrant {
        uint256 inelligibleClaims = 0;
        for (uint256 i = 0; i < iterations;) {
            // reset index if applicable
            if (currentMultiClaimHolderIndex >= allHolders.length) {
                currentMultiClaimHolderIndex = 0;
            }

            // gas efficiency
            address user = allHolders[currentMultiClaimHolderIndex];

            // claim reward for holder if they pass all checks
            if (
                userInfo[user].amount >= minHoldingsForAutoClaim
                    && pendingRewards(user) >= minPendingRewardsForAutoClaim
            ) {
                _claimReward(user);
            } else {
                if (inelligibleClaims < inelligibleClaimsCheck) {
                    unchecked {
                        ++inelligibleClaims;
                        ++currentMultiClaimHolderIndex;
                    }
                    continue;
                }
            }

            // increment loop index and current multi claim holder index
            unchecked {
                ++i;
                ++currentMultiClaimHolderIndex;
            }
        }
    }

    function withdraw(uint256 amount) external noReentrant {
        _withdraw(msg.sender, amount);
    }

    function taxlessWithdraw(address user, uint256 amount) external {
        require(msg.sender == taxlessWithdrawContract, "Only Taxless Withdraw Contract");
        _withdraw(user, amount);
    }

    function stake(address user, uint256 amount) external noReentrant {
        require(amount > 0, "Must Stake Greater Than 0");
        require(user != address(0), "Zero Address");

        if (userInfo[user].amount > 0) {
            _claimReward(user);
        } else {
            userInfo[user].index = allHolders.length;
            allHolders.push(user);
        }

        // transfer in tokens
        uint256 received = _transferIn(token, amount);

        // take deposit fee
        uint256 fee = msg.sender == taxlessWithdrawContract ? 0 : (received * depositFee) / FEE_DENOM;
        uint256 credit = received - fee;

        // update data
        totalShares += credit;
        userInfo[user].amount += credit;
        userInfo[user].totalExcluded = getCumulativeDividends(userInfo[user].amount);
        emit Transfer(address(0), user, credit);

        // send fee to fee recipient
        if (fee > 0) {
            IERC20(token).transfer(feeRecipient, fee);
        }

        emit Deposit(user, credit);
    }

    function depositRewards(uint256 amount) external noReentrant {
        uint256 received = _transferIn(reward, amount);
        _processDividendPerShareIncrease(received);
        emit RewardsDeposited(received);
    }

    function _processDividendPerShareIncrease(uint256 amount) internal {
        unchecked {
            totalRewards += amount;
        }

        if (totalShares > 0) {
            unchecked {
                dividendsPerShare += (amount * precision) / totalShares;
            }
        }
    }

    function _withdraw(address user, uint256 amount) internal {
        require(user != address(0), "Zero User");
        require(amount <= userInfo[user].amount, "Insufficient Amount");
        require(amount > 0, "Zero Amount");
        if (userInfo[user].amount > 0) {
            _claimReward(user);
        }

        totalShares -= amount;
        userInfo[user].amount -= amount;
        userInfo[user].totalExcluded = getCumulativeDividends(userInfo[user].amount);

        if (userInfo[user].amount == 0) {
            // copy the last element of the array into their index
            allHolders[userInfo[user].index] = allHolders[allHolders.length - 1];

            // set the index of the last holder to be the removed index
            userInfo[allHolders[allHolders.length - 1]].index = userInfo[user].index;

            // pop the last element off the array
            allHolders.pop();

            // save storage space
            delete userInfo[user].index;
        }

        // determine withdraw fee
        uint256 fee = msg.sender == taxlessWithdrawContract ? 0 : (amount * withdrawFee) / FEE_DENOM;

        // send tokens to user less fee
        require(IERC20(token).transfer(user, amount - fee), "Failure On Token Transfer To Sender");

        // send fee to fee recipient
        if (fee > 0) {
            require(IERC20(token).transfer(feeRecipient, fee), "Failure On Fee Payment");
        }
        emit Transfer(user, address(0), amount);
    }

    function _claimReward(address user) internal {
        UserInfo storage uInfo = userInfo[user];

        // exit if zero value locked
        if (uInfo.amount == 0) {
            return;
        }

        // fetch pending rewards
        uint256 amount = pendingRewards(user);

        // exit if zero rewards
        if (amount == 0) {
            return;
        }

        // update total excluded
        uInfo.totalExcluded = getCumulativeDividends(uInfo.amount);

        // send tokens to customized rewards
        IERC20(reward).transfer(address(customizedRewards), amount);
        customizedRewards.trigger(user, amount, token);

        emit ClaimReward(user, amount);
    }

    function _transferIn(address _token, uint256 amount) internal returns (uint256) {
        require(IERC20(_token).balanceOf(msg.sender) >= amount, "Insufficient Balance");
        require(IERC20(_token).allowance(msg.sender, address(this)) >= amount, "Insufficient Allowance");
        uint256 before = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transferFrom(msg.sender, address(this), amount);
        uint256 After = IERC20(_token).balanceOf(address(this));
        require(After > before, "Error On Transfer From");
        return After - before;
    }

    function pendingRewards(address shareholder) public view returns (uint256) {
        if (userInfo[shareholder].amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeDividends(userInfo[shareholder].amount);
        uint256 shareholderTotalExcluded = userInfo[shareholder].totalExcluded;

        if (shareholderTotalDividends <= shareholderTotalExcluded) {
            return 0;
        }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return (share * dividendsPerShare) / precision;
    }

    function viewAllHolders() external view returns (address[] memory) {
        return allHolders;
    }

    function numHolders() external view returns (uint256) {
        return allHolders.length;
    }

    receive() external payable {}

    function goodAddress(address _target) internal view returns (bool) {
        if (_target == DEAD || _target == ZERO) {
            return false;
        } else {
            return true;
        }
    }
}

File 2 of 4 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.14;

/**
 * @title Owner
 * @dev Set & change owner
 */
contract Ownable {
    address private owner;

    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);

    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

File 3 of 4 : IUniswapV2Router02.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

File 4 of 4 : IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

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

    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

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

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

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

    /**
     * @dev Moves `amount` tokens from `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, uint256 amount) external returns (bool);

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

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

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"reward_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"feeRecipient_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomizedRewards","type":"address"}],"name":"CustomizedRewardsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"FeeRecipientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawFee","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCheck","type":"uint256"}],"name":"InelligibleClaimsCheckSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMin","type":"uint256"}],"name":"MinHoldingsForAutoClaimSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMin","type":"uint256"}],"name":"MinPendingRewardsForAutoClaimSet","type":"event"},{"anonymous":false,"inputs":[],"name":"MulticlaimIndexReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"taxlessWithdrawContract","type":"address"}],"name":"TaxlessWithdrawContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allHolders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentMultiClaimHolderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customizedRewards","outputs":[{"internalType":"contract ICustomizedRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inelligibleClaimsCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minHoldingsForAutoClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPendingRewardsForAutoClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"iterations","type":"uint256"}],"name":"multiClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resetMulticlaimIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router_","type":"address"},{"internalType":"address","name":"wrappedEth","type":"address"}],"name":"rollOverDustIntoRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCustomizedRewards","type":"address"}],"name":"setCustomizedRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositFee_","type":"uint256"},{"internalType":"uint256","name":"withdrawFee_","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCheck","type":"uint256"}],"name":"setInelligibleClaimsCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMin","type":"uint256"}],"name":"setMinHoldingsForAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMin","type":"uint256"}],"name":"setMinPendingRewardsForAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slippageTolerance_","type":"uint256"}],"name":"setSlippageTolerance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"taxlessWithdrawContract_","type":"address"}],"name":"setTaxlessWithdrawContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageTolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"taxlessWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxlessWithdrawContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewAllHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600580546001600160a01b031990811661dead179091556006805490911690556001600b819055600c55601e600d819055600e556101f4600f5560326011556013805460ff60a01b191690553480156200005d57600080fd5b5060405162003226380380620032268339810160408190526200008091620003b7565b600080546001600160a01b0319163390811782556040519091907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a36001600160a01b03851615801590620000e057506001600160a01b03841615155b620001205760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b604482015260640160405180910390fd5b6001600160a01b0380861660a052841660c05282516200014890600190602086019062000227565b5081516200015e90600290602085019062000227565b50846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200019e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c491906200045a565b60ff16608052601080546001600160a01b0319166001600160a01b038316179055604051600080825233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050620004c2565b828054620002359062000486565b90600052602060002090601f016020900481019282620002595760008555620002a4565b82601f106200027457805160ff1916838001178555620002a4565b82800160010185558215620002a4579182015b82811115620002a457825182559160200191906001019062000287565b50620002b2929150620002b6565b5090565b5b80821115620002b25760008155600101620002b7565b80516001600160a01b0381168114620002e557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200031257600080fd5b81516001600160401b03808211156200032f576200032f620002ea565b604051601f8301601f19908116603f011681019082821181831017156200035a576200035a620002ea565b816040528381526020925086838588010111156200037757600080fd5b600091505b838210156200039b57858201830151818301840152908201906200037c565b83821115620003ad5760008385830101525b9695505050505050565b600080600080600060a08688031215620003d057600080fd5b620003db86620002cd565b9450620003eb60208701620002cd565b60408701519094506001600160401b03808211156200040957600080fd5b6200041789838a0162000300565b945060608801519150808211156200042e57600080fd5b506200043d8882890162000300565b9250506200044e60808701620002cd565b90509295509295909350565b6000602082840312156200046d57600080fd5b815160ff811681146200047f57600080fd5b9392505050565b600181811c908216806200049b57607f821691505b602082108103620004bc57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051612ce76200053f6000396000818161049d0152818161114501528181611462015281816114c2015281816116520152611ec00152600081816108df015281816111ef0152818161192101528181611a7001528181611f5901528181612315015261243b015260006105130152612ce76000f3fe6080604052600436106102b25760003560e01c80635656e95c11610175578063adc9772e116100dc578063deb9ee7711610095578063ee48c32a1161006f578063ee48c32a1461088d578063f7c0fe5c146108ad578063fc0c546a146108cd578063fe4839211461090157600080fd5b8063deb9ee7714610837578063e74b981b14610857578063e941fa781461087757600080fd5b8063adc9772e14610791578063af0a0c12146107b1578063c60f2e0b146107d3578063cc642cc2146107e9578063d03153aa146107fe578063dd62ed3e1461081457600080fd5b80638bdf67f21161012e5780638bdf67f2146106dc57806392a87e60146106fc57806395d89b411461071c57806398aedca214610731578063a6f9dae114610751578063a9059cbb1461077157600080fd5b80635656e95c1461061257806358fa63ca1461063257806367a527931461065257806370a0823114610668578063850091131461069e578063893d20e8146106be57600080fd5b8063228cb7331161021957806346904840116101d2578063469048401461057257806346fee28f146105925780634d9ab978146105b257806350431ce4146105c8578063509c33de146105dd57806353fdeb81146105f257600080fd5b8063228cb7331461048b57806323b872dd146104bf5780632e1a7d4d146104df578063313ce567146104ff57806331d7a2621461053d578063372500ab1461055d57600080fd5b80630b78f9c01161026b5780630b78f9c0146103b35780630e15561a146103d3578063117da1ee146103e957806318160ddd146104095780631959a0021461041e5780631f2b8b681461047557600080fd5b806303fd2a45146102be57806306fdde03146102fb57806307662c911461031d578063079176d01461033f578063095d504e14610363578063095ea7b31461038357600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506005546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b50610310610921565b6040516102f291906128e4565b34801561032957600080fd5b5061033d610338366004612939565b6109b3565b005b34801561034b57600080fd5b50610355600a5481565b6040519081526020016102f2565b34801561036f57600080fd5b5061033d61037e366004612939565b610a72565b34801561038f57600080fd5b506103a361039e366004612969565b610ad1565b60405190151581526020016102f2565b3480156103bf57600080fd5b5061033d6103ce366004612993565b610b2a565b3480156103df57600080fd5b5061035560075481565b3480156103f557600080fd5b5061033d610404366004612939565b610c42565b34801561041557600080fd5b50600854610355565b34801561042a57600080fd5b5061045a6104393660046129b5565b60036020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102f2565b34801561048157600080fd5b5061035560115481565b34801561049757600080fd5b506102de7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cb57600080fd5b506103a36104da3660046129d7565b610cc3565b3480156104eb57600080fd5b5061033d6104fa366004612939565b610d07565b34801561050b57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102f2565b34801561054957600080fd5b506103556105583660046129b5565b610d5e565b34801561056957600080fd5b5061033d610de9565b34801561057e57600080fd5b506010546102de906001600160a01b031681565b34801561059e57600080fd5b506102de6105ad366004612939565b610e3e565b3480156105be57600080fd5b50610355600b5481565b3480156105d457600080fd5b5061033d610e68565b3480156105e957600080fd5b5061033d610eea565b3480156105fe57600080fd5b5061033d61060d366004612939565b610f44565b34801561061e57600080fd5b506012546102de906001600160a01b031681565b34801561063e57600080fd5b506006546102de906001600160a01b031681565b34801561065e57600080fd5b50610355600d5481565b34801561067457600080fd5b506103556106833660046129b5565b6001600160a01b031660009081526003602052604090205490565b3480156106aa57600080fd5b5061033d6106b9366004612939565b611052565b3480156106ca57600080fd5b506000546001600160a01b03166102de565b3480156106e857600080fd5b5061033d6106f7366004612939565b611101565b34801561070857600080fd5b5061033d610717366004612969565b6111b9565b34801561072857600080fd5b50610310611325565b34801561073d57600080fd5b5061033d61074c366004612a13565b611334565b34801561075d57600080fd5b5061033d61076c3660046129b5565b611722565b34801561077d57600080fd5b506103a361078c366004612969565b6117a7565b34801561079d57600080fd5b5061033d6107ac366004612969565b6117de565b3480156107bd57600080fd5b506107c6611b38565b6040516102f29190612a8a565b3480156107df57600080fd5b50610355600c5481565b3480156107f557600080fd5b50600454610355565b34801561080a57600080fd5b50610355600f5481565b34801561082057600080fd5b5061035561082f366004612a13565b600092915050565b34801561084357600080fd5b5061033d6108523660046129b5565b611b99565b34801561086357600080fd5b5061033d6108723660046129b5565b611c5e565b34801561088357600080fd5b50610355600e5481565b34801561089957600080fd5b506013546102de906001600160a01b031681565b3480156108b957600080fd5b5061033d6108c8366004612969565b611cfc565b3480156108d957600080fd5b506102de7f000000000000000000000000000000000000000000000000000000000000000081565b34801561090d57600080fd5b5061033d61091c3660046129b5565b611d60565b60606001805461093090612a9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90612a9d565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b6000546001600160a01b031633146109e65760405162461bcd60e51b81526004016109dd90612ad7565b60405180910390fd5b60008111610a365760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420436c61696d205a65726f20526577617264730000000000000060448201526064016109dd565b600c8190556040518181527ffa86ead86c56e1b7bfe3349aa6596a5bae44f5e7429c2017584d42996b827ce1906020015b60405180910390a150565b6000546001600160a01b03163314610a9c5760405162461bcd60e51b81526004016109dd90612ad7565b60118190556040518181527f3fa2291a1a67604a0fba1574604f2052e3d50d2d3e1032d7e6cbc22a41c2cca690602001610a67565b6000826001600160a01b0316336001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051610b1991815260200190565b60405180910390a350600192915050565b6000546001600160a01b03163314610b545760405162461bcd60e51b81526004016109dd90612ad7565b610b6160026103e8612b30565b821115610ba75760405162461bcd60e51b8152602060048201526014602482015273088cae0dee6d2e8408ccaca40a8dede4090d2ced60631b60448201526064016109dd565b610bb460026103e8612b30565b811115610bfb5760405162461bcd60e51b81526020600482015260156024820152740aed2e8d0c8e4c2ee408ccaca40a8dede4090d2ced605b1b60448201526064016109dd565b600d829055600e81905560408051838152602081018390527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a15050565b6000546001600160a01b03163314610c6c5760405162461bcd60e51b81526004016109dd90612ad7565b612710811115610cbe5760405162461bcd60e51b815260206004820152601860248201527f536c69707061676520546f6c6572616e636520436865636b000000000000000060448201526064016109dd565b600f55565b6000610cce33611e48565b604051600081526001600160a01b038416903390600080516020612c928339815191529060200160405180910390a35060019392505050565b601354600160a01b900460ff1615610d315760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055610d4e3382612006565b506013805460ff60a01b19169055565b6001600160a01b0381166000908152600360205260408120548103610d8557506000919050565b6001600160a01b038216600090815260036020526040812054610da790612523565b6001600160a01b038416600090815260036020526040902060010154909150808211610dd7575060009392505050565b610de18183612b7a565b949350505050565b601354600160a01b900460ff1615610e135760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055610e2f33611e48565b6013805460ff60a01b19169055565b60048181548110610e4e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610e925760405162461bcd60e51b81526004016109dd90612ad7565b604051600090339047908381818185875af1925050503d8060008114610ed4576040519150601f19603f3d011682016040523d82523d6000602084013e610ed9565b606091505b5050905080610ee757600080fd5b50565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016109dd90612ad7565b6000600a8190556040517ff6f07f64ae37c2c98a441faeffead6096e4a46163f660d29d551d4249adc90879190a1565b601354600160a01b900460ff1615610f6e5760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b1790556000805b8281101561104057600454600a5410610f9e576000600a555b60006004600a5481548110610fb557610fb5612b91565b6000918252602080832090910154600b546001600160a01b03909116808452600390925260409092205490925010801590610ffa5750600c54610ff782610d5e565b10155b1561100d5761100881611e48565b61102d565b60115483101561102d5750600a8054600190810190915590910190610f85565b50600a8054600190810190915501610f85565b50506013805460ff60a01b1916905550565b6000546001600160a01b0316331461107c5760405162461bcd60e51b81526004016109dd90612ad7565b600081116110cc5760405162461bcd60e51b815260206004820181905260248201527f4d757374206265206174206c65617374203120776569206f6620746f6b656e7360448201526064016109dd565b600b8190556040518181527fad7bc7cd954daf1d0ca06a0d963cf211961ec9bfb70d8c300946a823db69ca2c90602001610a67565b601354600160a01b900460ff161561112b5760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055600061116a7f00000000000000000000000000000000000000000000000000000000000000008361254c565b905061117581612863565b6040518181527f4e9221f2cca6ca0397acc6004ea0b716798254f5abcf53924fab34f0373e5d4e9060200160405180910390a150506013805460ff60a01b19169055565b6000546001600160a01b031633146111e35760405162461bcd60e51b81526004016109dd90612ad7565b816001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036112645760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74205769746864726177204661726d20546f6b656e00000000000060448201526064016109dd565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d59190612ba7565b6113215760405162461bcd60e51b815260206004820152601960248201527f4661696c757265204f6e20546f6b656e2057697468647261770000000000000060448201526064016109dd565b5050565b60606002805461093090612a9d565b6000546001600160a01b0316331461135e5760405162461bcd60e51b81526004016109dd90612ad7565b6040516370a0823160e01b815230600482015282906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612bc9565b90506000811161140b5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b60448201526064016109dd565b604080516002808252606082018352600092602083019080368337019050509050838160008151811061144057611440612b91565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061149457611494612b91565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152d9190612bc9565b60405163095ea7b360e01b81526001600160a01b038681166004830152602482018690529192509086169063095ea7b3906044016020604051808303816000875af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a49190612ba7565b50836001600160a01b0316635c11d79584612710600f546127106115c89190612b7a565b6115d29088612be2565b6115dc9190612b30565b85306115e9426064612c01565b6040518663ffffffff1660e01b8152600401611609959493929190612c19565b600060405180830381600087803b15801561162357600080fd5b505af1158015611637573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa1580156116a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c69190612bc9565b90508181116117075760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b60448201526064016109dd565b6117196117148383612b7a565b612863565b50505050505050565b6000546001600160a01b0316331461174c5760405162461bcd60e51b81526004016109dd90612ad7565b600080546040516001600160a01b03808516939216917f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006117b233611e48565b604051600081526001600160a01b038416903390600080516020612c9283398151915290602001610b19565b601354600160a01b900460ff16156118085760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055806118685760405162461bcd60e51b815260206004820152601960248201527f4d757374205374616b652047726561746572205468616e20300000000000000060448201526064016109dd565b6001600160a01b03821661188e5760405162461bcd60e51b81526004016109dd90612c55565b6001600160a01b038216600090815260036020526040902054156118ba576118b582611e48565b61191a565b600480546001600160a01b0384166000818152600360205260408120600201839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b60006119467f00000000000000000000000000000000000000000000000000000000000000008361254c565b6013549091506000906001600160a01b0316331461197e576103e8600d548361196f9190612be2565b6119799190612b30565b611981565b60005b9050600061198f8284612b7a565b905080600860008282546119a39190612c01565b90915550506001600160a01b038516600090815260036020526040812080548392906119d0908490612c01565b90915550506001600160a01b0385166000908152600360205260409020546119f790612523565b6001600160a01b038616600081815260036020526040808220600101939093559151909190600080516020612c9283398151915290611a399085815260200190565b60405180910390a38115611ae15760105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adf9190612ba7565b505b846001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c82604051611b1c91815260200190565b60405180910390a250506013805460ff60a01b19169055505050565b606060048054806020026020016040519081016040528092919081815260200182805480156109a957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b72575050505050905090565b6000546001600160a01b03163314611bc35760405162461bcd60e51b81526004016109dd90612ad7565b611bcc8161289e565b1515600114611c105760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420416464726573732160801b60448201526064016109dd565b601280546001600160a01b0319166001600160a01b0383169081179091556040519081527f2179da1b8a928b04f69ac34e936f911cc3aa17dea882331bcc3515f22564118f90602001610a67565b6000546001600160a01b03163314611c885760405162461bcd60e51b81526004016109dd90612ad7565b6001600160a01b038116611cae5760405162461bcd60e51b81526004016109dd90612c55565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9a9534339a9d6b81696e05dcfb614b7dc518a31d48be3cfb757988381fb32390602001610a67565b6013546001600160a01b03163314611d565760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79205461786c65737320576974686472617720436f6e7472616374000060448201526064016109dd565b6113218282612006565b6000546001600160a01b03163314611d8a5760405162461bcd60e51b81526004016109dd90612ad7565b6001600160a01b038116611db05760405162461bcd60e51b81526004016109dd90612c55565b61deac196001600160a01b03821601611dfa5760405162461bcd60e51b815260206004820152600c60248201526b44656164204164647265737360a01b60448201526064016109dd565b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527fe65a2483f728655be73d076662e52fc66ca916e8d4c5b374338f03090aca456d90602001610a67565b6001600160a01b03811660009081526003602052604081208054909103611e6d575050565b6000611e7883610d5e565b905080600003611e8757505050565b8154611e9290612523565b600183015560125460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2f9190612ba7565b5060125460405163b6e8a98b60e01b81526001600160a01b038581166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000811660448301529091169063b6e8a98b90606401600060405180830381600087803b158015611fa657600080fd5b505af1158015611fba573d6000803e3d6000fd5b50505050826001600160a01b03167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e82604051611ff991815260200190565b60405180910390a2505050565b6001600160a01b0382166120485760405162461bcd60e51b81526020600482015260096024820152682d32b937902ab9b2b960b91b60448201526064016109dd565b6001600160a01b0382166000908152600360205260409020548111156120a65760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d08105b5bdd5b9d606a1b60448201526064016109dd565b600081116120e45760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b60448201526064016109dd565b6001600160a01b0382166000908152600360205260409020541561210b5761210b82611e48565b806008600082825461211d9190612b7a565b90915550506001600160a01b0382166000908152600360205260408120805483929061214a908490612b7a565b90915550506001600160a01b03821660009081526003602052604090205461217190612523565b6001600160a01b03831660009081526003602052604081206001810192909255905490036122d157600480546121a990600190612b7a565b815481106121b9576121b9612b91565b60009182526020808320909101546001600160a01b03858116845260039092526040909220600201546004805492909316929181106121fa576121fa612b91565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591841681526003918290526040812060020154600480549193929161224990600190612b7a565b8154811061225957612259612b91565b60009182526020808320909101546001600160a01b03168352820192909252604001902060020155600480548061229257612292612c7b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841682526003905260408120600201555b6013546000906001600160a01b03163314612306576103e8600e54836122f79190612be2565b6123019190612b30565b612309565b60005b90506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb846123458486612b7a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b49190612ba7565b61240c5760405162461bcd60e51b815260206004820152602360248201527f4661696c757265204f6e20546f6b656e205472616e7366657220546f2053656e6044820152623232b960e91b60648201526084016109dd565b80156124ef5760105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015612486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124aa9190612ba7565b6124ef5760405162461bcd60e51b815260206004820152601660248201527511985a5b1d5c994813db881199594814185e5b595b9d60521b60448201526064016109dd565b6040518281526000906001600160a01b03851690600080516020612c928339815191529060200160405180910390a3505050565b6000670de0b6b3a76400006009548361253c9190612be2565b6125469190612b30565b92915050565b6040516370a0823160e01b815233600482015260009082906001600160a01b038516906370a0823190602401602060405180830381865afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b99190612bc9565b10156125fe5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016109dd565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e9190612bc9565b10156126b55760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b60448201526064016109dd565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190612bc9565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091506001600160a01b038516906323b872dd906064016020604051808303816000875af1158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190612ba7565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128069190612bc9565b90508181116128505760405162461bcd60e51b81526020600482015260166024820152754572726f72204f6e205472616e736665722046726f6d60501b60448201526064016109dd565b61285a8282612b7a565b95945050505050565b600780548201905560085415610ee757600854670de0b6b3a764000082028161288e5761288e612b04565b6009805492909104909101905550565b6005546000906001600160a01b03838116911614806128ca57506006546001600160a01b038381169116145b156128d757506000919050565b506001919050565b919050565b600060208083528351808285015260005b81811015612911578581018301518582016040015282016128f5565b81811115612923576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561294b57600080fd5b5035919050565b80356001600160a01b03811681146128df57600080fd5b6000806040838503121561297c57600080fd5b61298583612952565b946020939093013593505050565b600080604083850312156129a657600080fd5b50508035926020909101359150565b6000602082840312156129c757600080fd5b6129d082612952565b9392505050565b6000806000606084860312156129ec57600080fd5b6129f584612952565b9250612a0360208501612952565b9150604084013590509250925092565b60008060408385031215612a2657600080fd5b612a2f83612952565b9150612a3d60208401612952565b90509250929050565b600081518084526020808501945080840160005b83811015612a7f5781516001600160a01b031687529582019590820190600101612a5a565b509495945050505050565b6020815260006129d06020830184612a46565b600181811c90821680612ab157607f821691505b602082108103612ad157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612b4d57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600e908201526d4e6f2052652d456e7472616e637960901b604082015260600190565b600082821015612b8c57612b8c612b1a565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612bb957600080fd5b815180151581146129d057600080fd5b600060208284031215612bdb57600080fd5b5051919050565b6000816000190483118215151615612bfc57612bfc612b1a565b500290565b60008219821115612c1457612c14612b1a565b500190565b85815284602082015260a060408201526000612c3860a0830186612a46565b6001600160a01b0394909416606083015250608001529392505050565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b634e487b7160e01b600052603160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d3a43173b245ae427948d64a296c80d17cd9b6ed1b337e224ae960bd31171eb564736f6c634300080e00330000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15000000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd0900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000059d94b1799eb0a31d6cce4e1c2fcab6507204ba7000000000000000000000000000000000000000000000000000000000000000e424c4f432d77455448204661726d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000566424c4f43000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102b25760003560e01c80635656e95c11610175578063adc9772e116100dc578063deb9ee7711610095578063ee48c32a1161006f578063ee48c32a1461088d578063f7c0fe5c146108ad578063fc0c546a146108cd578063fe4839211461090157600080fd5b8063deb9ee7714610837578063e74b981b14610857578063e941fa781461087757600080fd5b8063adc9772e14610791578063af0a0c12146107b1578063c60f2e0b146107d3578063cc642cc2146107e9578063d03153aa146107fe578063dd62ed3e1461081457600080fd5b80638bdf67f21161012e5780638bdf67f2146106dc57806392a87e60146106fc57806395d89b411461071c57806398aedca214610731578063a6f9dae114610751578063a9059cbb1461077157600080fd5b80635656e95c1461061257806358fa63ca1461063257806367a527931461065257806370a0823114610668578063850091131461069e578063893d20e8146106be57600080fd5b8063228cb7331161021957806346904840116101d2578063469048401461057257806346fee28f146105925780634d9ab978146105b257806350431ce4146105c8578063509c33de146105dd57806353fdeb81146105f257600080fd5b8063228cb7331461048b57806323b872dd146104bf5780632e1a7d4d146104df578063313ce567146104ff57806331d7a2621461053d578063372500ab1461055d57600080fd5b80630b78f9c01161026b5780630b78f9c0146103b35780630e15561a146103d3578063117da1ee146103e957806318160ddd146104095780631959a0021461041e5780631f2b8b681461047557600080fd5b806303fd2a45146102be57806306fdde03146102fb57806307662c911461031d578063079176d01461033f578063095d504e14610363578063095ea7b31461038357600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506005546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b50610310610921565b6040516102f291906128e4565b34801561032957600080fd5b5061033d610338366004612939565b6109b3565b005b34801561034b57600080fd5b50610355600a5481565b6040519081526020016102f2565b34801561036f57600080fd5b5061033d61037e366004612939565b610a72565b34801561038f57600080fd5b506103a361039e366004612969565b610ad1565b60405190151581526020016102f2565b3480156103bf57600080fd5b5061033d6103ce366004612993565b610b2a565b3480156103df57600080fd5b5061035560075481565b3480156103f557600080fd5b5061033d610404366004612939565b610c42565b34801561041557600080fd5b50600854610355565b34801561042a57600080fd5b5061045a6104393660046129b5565b60036020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102f2565b34801561048157600080fd5b5061035560115481565b34801561049757600080fd5b506102de7f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd0981565b3480156104cb57600080fd5b506103a36104da3660046129d7565b610cc3565b3480156104eb57600080fd5b5061033d6104fa366004612939565b610d07565b34801561050b57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016102f2565b34801561054957600080fd5b506103556105583660046129b5565b610d5e565b34801561056957600080fd5b5061033d610de9565b34801561057e57600080fd5b506010546102de906001600160a01b031681565b34801561059e57600080fd5b506102de6105ad366004612939565b610e3e565b3480156105be57600080fd5b50610355600b5481565b3480156105d457600080fd5b5061033d610e68565b3480156105e957600080fd5b5061033d610eea565b3480156105fe57600080fd5b5061033d61060d366004612939565b610f44565b34801561061e57600080fd5b506012546102de906001600160a01b031681565b34801561063e57600080fd5b506006546102de906001600160a01b031681565b34801561065e57600080fd5b50610355600d5481565b34801561067457600080fd5b506103556106833660046129b5565b6001600160a01b031660009081526003602052604090205490565b3480156106aa57600080fd5b5061033d6106b9366004612939565b611052565b3480156106ca57600080fd5b506000546001600160a01b03166102de565b3480156106e857600080fd5b5061033d6106f7366004612939565b611101565b34801561070857600080fd5b5061033d610717366004612969565b6111b9565b34801561072857600080fd5b50610310611325565b34801561073d57600080fd5b5061033d61074c366004612a13565b611334565b34801561075d57600080fd5b5061033d61076c3660046129b5565b611722565b34801561077d57600080fd5b506103a361078c366004612969565b6117a7565b34801561079d57600080fd5b5061033d6107ac366004612969565b6117de565b3480156107bd57600080fd5b506107c6611b38565b6040516102f29190612a8a565b3480156107df57600080fd5b50610355600c5481565b3480156107f557600080fd5b50600454610355565b34801561080a57600080fd5b50610355600f5481565b34801561082057600080fd5b5061035561082f366004612a13565b600092915050565b34801561084357600080fd5b5061033d6108523660046129b5565b611b99565b34801561086357600080fd5b5061033d6108723660046129b5565b611c5e565b34801561088357600080fd5b50610355600e5481565b34801561089957600080fd5b506013546102de906001600160a01b031681565b3480156108b957600080fd5b5061033d6108c8366004612969565b611cfc565b3480156108d957600080fd5b506102de7f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a150081565b34801561090d57600080fd5b5061033d61091c3660046129b5565b611d60565b60606001805461093090612a9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90612a9d565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b6000546001600160a01b031633146109e65760405162461bcd60e51b81526004016109dd90612ad7565b60405180910390fd5b60008111610a365760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420436c61696d205a65726f20526577617264730000000000000060448201526064016109dd565b600c8190556040518181527ffa86ead86c56e1b7bfe3349aa6596a5bae44f5e7429c2017584d42996b827ce1906020015b60405180910390a150565b6000546001600160a01b03163314610a9c5760405162461bcd60e51b81526004016109dd90612ad7565b60118190556040518181527f3fa2291a1a67604a0fba1574604f2052e3d50d2d3e1032d7e6cbc22a41c2cca690602001610a67565b6000826001600160a01b0316336001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051610b1991815260200190565b60405180910390a350600192915050565b6000546001600160a01b03163314610b545760405162461bcd60e51b81526004016109dd90612ad7565b610b6160026103e8612b30565b821115610ba75760405162461bcd60e51b8152602060048201526014602482015273088cae0dee6d2e8408ccaca40a8dede4090d2ced60631b60448201526064016109dd565b610bb460026103e8612b30565b811115610bfb5760405162461bcd60e51b81526020600482015260156024820152740aed2e8d0c8e4c2ee408ccaca40a8dede4090d2ced605b1b60448201526064016109dd565b600d829055600e81905560408051838152602081018390527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a15050565b6000546001600160a01b03163314610c6c5760405162461bcd60e51b81526004016109dd90612ad7565b612710811115610cbe5760405162461bcd60e51b815260206004820152601860248201527f536c69707061676520546f6c6572616e636520436865636b000000000000000060448201526064016109dd565b600f55565b6000610cce33611e48565b604051600081526001600160a01b038416903390600080516020612c928339815191529060200160405180910390a35060019392505050565b601354600160a01b900460ff1615610d315760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055610d4e3382612006565b506013805460ff60a01b19169055565b6001600160a01b0381166000908152600360205260408120548103610d8557506000919050565b6001600160a01b038216600090815260036020526040812054610da790612523565b6001600160a01b038416600090815260036020526040902060010154909150808211610dd7575060009392505050565b610de18183612b7a565b949350505050565b601354600160a01b900460ff1615610e135760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055610e2f33611e48565b6013805460ff60a01b19169055565b60048181548110610e4e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610e925760405162461bcd60e51b81526004016109dd90612ad7565b604051600090339047908381818185875af1925050503d8060008114610ed4576040519150601f19603f3d011682016040523d82523d6000602084013e610ed9565b606091505b5050905080610ee757600080fd5b50565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016109dd90612ad7565b6000600a8190556040517ff6f07f64ae37c2c98a441faeffead6096e4a46163f660d29d551d4249adc90879190a1565b601354600160a01b900460ff1615610f6e5760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b1790556000805b8281101561104057600454600a5410610f9e576000600a555b60006004600a5481548110610fb557610fb5612b91565b6000918252602080832090910154600b546001600160a01b03909116808452600390925260409092205490925010801590610ffa5750600c54610ff782610d5e565b10155b1561100d5761100881611e48565b61102d565b60115483101561102d5750600a8054600190810190915590910190610f85565b50600a8054600190810190915501610f85565b50506013805460ff60a01b1916905550565b6000546001600160a01b0316331461107c5760405162461bcd60e51b81526004016109dd90612ad7565b600081116110cc5760405162461bcd60e51b815260206004820181905260248201527f4d757374206265206174206c65617374203120776569206f6620746f6b656e7360448201526064016109dd565b600b8190556040518181527fad7bc7cd954daf1d0ca06a0d963cf211961ec9bfb70d8c300946a823db69ca2c90602001610a67565b601354600160a01b900460ff161561112b5760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055600061116a7f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd098361254c565b905061117581612863565b6040518181527f4e9221f2cca6ca0397acc6004ea0b716798254f5abcf53924fab34f0373e5d4e9060200160405180910390a150506013805460ff60a01b19169055565b6000546001600160a01b031633146111e35760405162461bcd60e51b81526004016109dd90612ad7565b816001600160a01b03167f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15006001600160a01b0316036112645760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74205769746864726177204661726d20546f6b656e00000000000060448201526064016109dd565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d59190612ba7565b6113215760405162461bcd60e51b815260206004820152601960248201527f4661696c757265204f6e20546f6b656e2057697468647261770000000000000060448201526064016109dd565b5050565b60606002805461093090612a9d565b6000546001600160a01b0316331461135e5760405162461bcd60e51b81526004016109dd90612ad7565b6040516370a0823160e01b815230600482015282906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612bc9565b90506000811161140b5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b60448201526064016109dd565b604080516002808252606082018352600092602083019080368337019050509050838160008151811061144057611440612b91565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd098160018151811061149457611494612b91565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000917f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd0916906370a0823190602401602060405180830381865afa158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152d9190612bc9565b60405163095ea7b360e01b81526001600160a01b038681166004830152602482018690529192509086169063095ea7b3906044016020604051808303816000875af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a49190612ba7565b50836001600160a01b0316635c11d79584612710600f546127106115c89190612b7a565b6115d29088612be2565b6115dc9190612b30565b85306115e9426064612c01565b6040518663ffffffff1660e01b8152600401611609959493929190612c19565b600060405180830381600087803b15801561162357600080fd5b505af1158015611637573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd096001600160a01b031691506370a0823190602401602060405180830381865afa1580156116a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c69190612bc9565b90508181116117075760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b60448201526064016109dd565b6117196117148383612b7a565b612863565b50505050505050565b6000546001600160a01b0316331461174c5760405162461bcd60e51b81526004016109dd90612ad7565b600080546040516001600160a01b03808516939216917f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006117b233611e48565b604051600081526001600160a01b038416903390600080516020612c9283398151915290602001610b19565b601354600160a01b900460ff16156118085760405162461bcd60e51b81526004016109dd90612b52565b6013805460ff60a01b1916600160a01b179055806118685760405162461bcd60e51b815260206004820152601960248201527f4d757374205374616b652047726561746572205468616e20300000000000000060448201526064016109dd565b6001600160a01b03821661188e5760405162461bcd60e51b81526004016109dd90612c55565b6001600160a01b038216600090815260036020526040902054156118ba576118b582611e48565b61191a565b600480546001600160a01b0384166000818152600360205260408120600201839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b60006119467f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15008361254c565b6013549091506000906001600160a01b0316331461197e576103e8600d548361196f9190612be2565b6119799190612b30565b611981565b60005b9050600061198f8284612b7a565b905080600860008282546119a39190612c01565b90915550506001600160a01b038516600090815260036020526040812080548392906119d0908490612c01565b90915550506001600160a01b0385166000908152600360205260409020546119f790612523565b6001600160a01b038616600081815260036020526040808220600101939093559151909190600080516020612c9283398151915290611a399085815260200190565b60405180910390a38115611ae15760105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15009091169063a9059cbb906044016020604051808303816000875af1158015611abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adf9190612ba7565b505b846001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c82604051611b1c91815260200190565b60405180910390a250506013805460ff60a01b19169055505050565b606060048054806020026020016040519081016040528092919081815260200182805480156109a957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b72575050505050905090565b6000546001600160a01b03163314611bc35760405162461bcd60e51b81526004016109dd90612ad7565b611bcc8161289e565b1515600114611c105760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420416464726573732160801b60448201526064016109dd565b601280546001600160a01b0319166001600160a01b0383169081179091556040519081527f2179da1b8a928b04f69ac34e936f911cc3aa17dea882331bcc3515f22564118f90602001610a67565b6000546001600160a01b03163314611c885760405162461bcd60e51b81526004016109dd90612ad7565b6001600160a01b038116611cae5760405162461bcd60e51b81526004016109dd90612c55565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9a9534339a9d6b81696e05dcfb614b7dc518a31d48be3cfb757988381fb32390602001610a67565b6013546001600160a01b03163314611d565760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79205461786c65737320576974686472617720436f6e7472616374000060448201526064016109dd565b6113218282612006565b6000546001600160a01b03163314611d8a5760405162461bcd60e51b81526004016109dd90612ad7565b6001600160a01b038116611db05760405162461bcd60e51b81526004016109dd90612c55565b61deac196001600160a01b03821601611dfa5760405162461bcd60e51b815260206004820152600c60248201526b44656164204164647265737360a01b60448201526064016109dd565b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527fe65a2483f728655be73d076662e52fc66ca916e8d4c5b374338f03090aca456d90602001610a67565b6001600160a01b03811660009081526003602052604081208054909103611e6d575050565b6000611e7883610d5e565b905080600003611e8757505050565b8154611e9290612523565b600183015560125460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd099091169063a9059cbb906044016020604051808303816000875af1158015611f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2f9190612ba7565b5060125460405163b6e8a98b60e01b81526001600160a01b038581166004830152602482018490527f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a1500811660448301529091169063b6e8a98b90606401600060405180830381600087803b158015611fa657600080fd5b505af1158015611fba573d6000803e3d6000fd5b50505050826001600160a01b03167fba8de60c3403ec381d1d484652ea1980e3c3e56359195c92525bff4ce47ad98e82604051611ff991815260200190565b60405180910390a2505050565b6001600160a01b0382166120485760405162461bcd60e51b81526020600482015260096024820152682d32b937902ab9b2b960b91b60448201526064016109dd565b6001600160a01b0382166000908152600360205260409020548111156120a65760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d08105b5bdd5b9d606a1b60448201526064016109dd565b600081116120e45760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b60448201526064016109dd565b6001600160a01b0382166000908152600360205260409020541561210b5761210b82611e48565b806008600082825461211d9190612b7a565b90915550506001600160a01b0382166000908152600360205260408120805483929061214a908490612b7a565b90915550506001600160a01b03821660009081526003602052604090205461217190612523565b6001600160a01b03831660009081526003602052604081206001810192909255905490036122d157600480546121a990600190612b7a565b815481106121b9576121b9612b91565b60009182526020808320909101546001600160a01b03858116845260039092526040909220600201546004805492909316929181106121fa576121fa612b91565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591841681526003918290526040812060020154600480549193929161224990600190612b7a565b8154811061225957612259612b91565b60009182526020808320909101546001600160a01b03168352820192909252604001902060020155600480548061229257612292612c7b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841682526003905260408120600201555b6013546000906001600160a01b03163314612306576103e8600e54836122f79190612be2565b6123019190612b30565b612309565b60005b90506001600160a01b037f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15001663a9059cbb846123458486612b7a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b49190612ba7565b61240c5760405162461bcd60e51b815260206004820152602360248201527f4661696c757265204f6e20546f6b656e205472616e7366657220546f2053656e6044820152623232b960e91b60648201526084016109dd565b80156124ef5760105460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15009091169063a9059cbb906044016020604051808303816000875af1158015612486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124aa9190612ba7565b6124ef5760405162461bcd60e51b815260206004820152601660248201527511985a5b1d5c994813db881199594814185e5b595b9d60521b60448201526064016109dd565b6040518281526000906001600160a01b03851690600080516020612c928339815191529060200160405180910390a3505050565b6000670de0b6b3a76400006009548361253c9190612be2565b6125469190612b30565b92915050565b6040516370a0823160e01b815233600482015260009082906001600160a01b038516906370a0823190602401602060405180830381865afa158015612595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b99190612bc9565b10156125fe5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016109dd565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e9190612bc9565b10156126b55760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b60448201526064016109dd565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190612bc9565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091506001600160a01b038516906323b872dd906064016020604051808303816000875af1158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190612ba7565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128069190612bc9565b90508181116128505760405162461bcd60e51b81526020600482015260166024820152754572726f72204f6e205472616e736665722046726f6d60501b60448201526064016109dd565b61285a8282612b7a565b95945050505050565b600780548201905560085415610ee757600854670de0b6b3a764000082028161288e5761288e612b04565b6009805492909104909101905550565b6005546000906001600160a01b03838116911614806128ca57506006546001600160a01b038381169116145b156128d757506000919050565b506001919050565b919050565b600060208083528351808285015260005b81811015612911578581018301518582016040015282016128f5565b81811115612923576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561294b57600080fd5b5035919050565b80356001600160a01b03811681146128df57600080fd5b6000806040838503121561297c57600080fd5b61298583612952565b946020939093013593505050565b600080604083850312156129a657600080fd5b50508035926020909101359150565b6000602082840312156129c757600080fd5b6129d082612952565b9392505050565b6000806000606084860312156129ec57600080fd5b6129f584612952565b9250612a0360208501612952565b9150604084013590509250925092565b60008060408385031215612a2657600080fd5b612a2f83612952565b9150612a3d60208401612952565b90509250929050565b600081518084526020808501945080840160005b83811015612a7f5781516001600160a01b031687529582019590820190600101612a5a565b509495945050505050565b6020815260006129d06020830184612a46565b600181811c90821680612ab157607f821691505b602082108103612ad157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612b4d57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600e908201526d4e6f2052652d456e7472616e637960901b604082015260600190565b600082821015612b8c57612b8c612b1a565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612bb957600080fd5b815180151581146129d057600080fd5b600060208284031215612bdb57600080fd5b5051919050565b6000816000190483118215151615612bfc57612bfc612b1a565b500290565b60008219821115612c1457612c14612b1a565b500190565b85815284602082015260a060408201526000612c3860a0830186612a46565b6001600160a01b0394909416606083015250608001529392505050565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b634e487b7160e01b600052603160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d3a43173b245ae427948d64a296c80d17cd9b6ed1b337e224ae960bd31171eb564736f6c634300080e0033

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

0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a15000000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd0900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000059d94b1799eb0a31d6cce4e1c2fcab6507204ba7000000000000000000000000000000000000000000000000000000000000000e424c4f432d77455448204661726d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000566424c4f43000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : token_ (address): 0x8EE9D3F9029AD0eb844dCbb93e7d176c201A1500
Arg [1] : reward_ (address): 0x6cCB663DAd597058Da28b58974e8bdB81323dd09
Arg [2] : name_ (string): BLOC-wETH Farm
Arg [3] : symbol_ (string): fBLOC
Arg [4] : feeRecipient_ (address): 0x59d94B1799eb0A31d6CCe4E1C2FCaB6507204ba7

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ee9d3f9029ad0eb844dcbb93e7d176c201a1500
Arg [1] : 0000000000000000000000006ccb663dad597058da28b58974e8bdb81323dd09
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 00000000000000000000000059d94b1799eb0a31d6cce4e1c2fcab6507204ba7
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 424c4f432d77455448204661726d000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 66424c4f43000000000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.