Contract 0x744db744da07e3ade5ba99d1c80fa11dc5ee247d 1

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x73d70ba5404657e66b9179b0232462799647c268e0d8037300a028d36ab51550Harvest110585362021-09-19 19:24:5951 mins ago0x36bc4617a44283eebf7f3319427b503b3b165dff IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00286983
0xd9a2ff6c0d580e37777ae3dba02ec823e5335b04a60fb29b227b9f13a82d1eadHarvest110572472021-09-19 18:20:321 hr 56 mins ago0xd38307a1f7472785851cb82f79d62ae8d7032288 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.0026194
0x98aef2c1a4e633027f318b5f646c07e8e790ba127e2ecceaff9cd343143fc79eWithdraw110570072021-09-19 18:08:322 hrs 8 mins ago0x9d01e3264572abc75b4d0183ffc932a1d9ff6739 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00044039
0x4f325fb62d9f3a170b9a03191d45711ee470b197eedb09ffbaf0a75bd5e2e233Withdraw110563882021-09-19 17:37:352 hrs 39 mins ago0xc4417ee91ec12a94cf8cbe5e8f19e7db84b8df4c IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.000528324
0x881fec9a3135b5adb3c96b85fc87244a4f75db732deaed852b1d9fd120ec9ef5Withdraw110531942021-09-19 14:57:485 hrs 18 mins ago0xf940c12455541404c8abb1fcb528e029ebdff659 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00388061
0x967633d396a948be1415460007669f99ea5821e0c0a78b986ea35ffac7d1ad98Withdraw110519802021-09-19 13:57:066 hrs 19 mins ago0xc2cacee484288ac4ea1524c97ee2f433aa7e5280 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.004532076
0x7162113030c3514ac7a24839b30ce964aa14ab74badf974342c30d6ec7f6dd11Harvest110519492021-09-19 13:55:336 hrs 21 mins ago0xc2cacee484288ac4ea1524c97ee2f433aa7e5280 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.003683652
0x6a2e7cd1a5c576a9b682273fa6103a5dd3f7719d410ed40d12dd12c1264847e7Withdraw110507322021-09-19 12:54:427 hrs 21 mins ago0x40500ecca288a5e74b7b09f48c82961cfa739bef IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00377673
0x188d3811804236172dded80d84799a8bee0e1c688420d74908cbcff680fb9109Harvest110506832021-09-19 12:52:157 hrs 24 mins ago0x40500ecca288a5e74b7b09f48c82961cfa739bef IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00299471
0x1b05dbb292e0ba74dc5de525d746b0d399d5e13a4905af8fbd3f8883172a8ef8Harvest110475162021-09-19 10:01:2210 hrs 15 mins ago0xc8d2f6189c91b7c40adb152c43c62b7a1160c58b IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00274428
0x2565ab4e308de216136e1f1c89f32634fa34db2186c69d3d8c991ed8a3cec31cHarvest110459122021-09-19 8:40:0711 hrs 36 mins ago0x9b8c7d0a2047316f8abc4066d13d7d4dadb24145 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00299471
0x5c99720c2be07af6ac8a176d0a4984afcd44a938b28c9ce80de1b214e855c892Deposit110454842021-09-19 8:18:4111 hrs 57 mins ago0x54abbd9203b83628a8fcf640ce2026dc3070f66c IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00162622
0x8fe7e0ec7cfb5996a7617789df4ef78c73213722cbf351c577f6b51b97c0a557Withdraw110435322021-09-19 6:41:0513 hrs 35 mins ago0x699514ce2b46f1dd676dd2c445b6fa946dd20a14 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00377667
0xb2d596d33b491cca3d7243f3bc8fea84b7b1eff68b1801e6f447c76906eb133bHarvest110435112021-09-19 6:40:0213 hrs 36 mins ago0x699514ce2b46f1dd676dd2c445b6fa946dd20a14 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00274428
0x1213c7f986c25d8af939cf5d6c71dd23305dbe691f1e952c947cc727929e9935Deposit110432752021-09-19 6:28:1113 hrs 48 mins ago0xcb76e155ae2368b1e5f0b6175be420dfe38641d2 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.002697015
0xa6ae8252f35ff2dfa1f6859182854f30925e5f26a3ec588490342431be0cd4acWithdraw110431912021-09-19 6:23:5913 hrs 52 mins ago0xcb76e155ae2368b1e5f0b6175be420dfe38641d2 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00044039
0x98a25afeb4b2d6ad0052f58304894b8d18fa61b97b133cd86e069d8ef583c2e7Deposit110424332021-09-19 5:46:0414 hrs 30 mins ago0x78d27983fdc32f15f641576664a6ed1e80403b11 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00378853
0x83694ea61ed6557f65b36a41c3026caea6ad7c8fac8895fe742b20b79f1bb2acDeposit110408042021-09-19 4:24:3715 hrs 52 mins ago0xa24073ac7f6e607ea311054e1ddf8853371d7c60 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00371359
0x0921041a282a13946cba3b91caedcae9e72f094c99ad7a5d4fb9e6b61cc23fdbHarvest110395402021-09-19 3:21:0916 hrs 55 mins ago0xb52fa03b3b4d004baae0907fee783110fd26014b IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00286983
0xea1bb1797bf54885225948ba77571deee2de0459126d7e2ebdf62266f247b9abWithdraw110382702021-09-19 2:17:3917 hrs 58 mins ago0x36bbe71f2acbec1e91861d1fadfea5e0b2747581 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00036539
0xaca25dfaba4424b5663375570e728d326c4b224d688c61425a4435b842057f17Harvest110382662021-09-19 2:17:2717 hrs 59 mins ago0x36bbe71f2acbec1e91861d1fadfea5e0b2747581 IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.000526845
0xa0b11cc3c6735e5c36ee77be47704d2f2efe820160bc84615a75194f8566f1bcWithdraw110337462021-09-18 22:30:4621 hrs 45 mins ago0x1bdad819494d64b476ff2cd2f783c3567ce1fd9d IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00044033
0x8b69f4c561dcd1b8f7a2e11f644f77229afb233383ce734155ad13836bfa78eeWithdraw110327312021-09-18 21:40:0122 hrs 36 mins ago0xfe413503735039c675089f7e8422ce7488ffdf4c IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.002062575
0x54048288d3eb8c182736c80a85d164826ebff8b888bdf8bee3670f4754aec8cbDeposit110275112021-09-18 17:18:151 day 2 hrs ago0x29403f74cb9b67a8500ea80441afd121282bee6c IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.00378853
0xeae91434dff807b804b7224702921b8f4bbaa3b8f80c47a7c3a8244f4fb0790dWithdraw110259572021-09-18 16:00:251 day 4 hrs ago0x062d321040824f59bf797513e1d634c38143936e IN  0x744db744da07e3ade5ba99d1c80fa11dc5ee247d0 BNB0.001640185
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DemaxShackFarm

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000 runs

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

pragma solidity >=0.6.6;

import "./interfaces/IERC20.sol";
import './interfaces/IWETH.sol';
import './libraries/SafeMath.sol';
import './modules/ShackConfigable.sol';
import "./modules/ReentrancyGuard.sol";

interface IRewardToken {
    function mint(address to, uint value) external returns (bool);
}

interface IDemaxLP {
    function mintReward() external returns (uint256 amount);
    function queryReward() external view returns (uint256);
    function shareToken() external view returns (address);
}

// DemaxShackFarm is the master of xBURGER. He can make xBURGER and he is a fair guy.
//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once xBURGER is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract DemaxShackFarm is ShackConfigable, ReentrancyGuard {
    using SafeMath for uint256;

    // Info of each user.
    struct UserInfo {
        uint256 amount;         // How many LP tokens the user has provided.
        uint256 rewardDebt;     // Reward debt. See explanation below.
        uint256 reward2Debt;    // Reward2 debt. See explanation below.
        //
        // We do some fancy math here. Basically, any point in time, the amount of RewardTokens
        // entitled to a user but is pending to be distributed is:
        //
        //   pending reward = (user.amount * pool.accRewardPerShare) - user.rewardDebt
        //
        // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
        //   1. The pool's `accRewardPerShare` (and `lastRewardBlock`) gets updated.
        //   2. User receives the pending reward sent to his/her address.
        //   3. User's `amount` gets updated.
        //   4. User's `rewardDebt` gets updated.
        //   5. User's `reward2Debt` gets updated.
    }

    // Info of each pool.
    struct PoolInfo {
        address depositToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. RewardTokens to distribute per block.
        uint256 lastRewardBlock;  // Last block number that RewardTokens distribution occurs.
        uint256 accRewardPerShare;   // Accumulated RewardTokens per share, times 1e18. See below.
        uint256 accReward2PerShare;   // Accumulated RewardToken2s per share, times 1e18. See below.
        uint256 depositTokenSupply;
        uint16 depositFeeBP;      // Deposit fee in basis points
        uint16 tokenType;
        bool isReward2;
    }

    uint256 version = 1;
    address public weth;

    // The reward TOKEN!
    address public rewardToken;
    // Dev address.
    address public devaddr;
    // reward tokens created per block.
    uint256 public mintPerBlock;
    // Bonus muliplier for early rewardToken makers.
    uint256 public constant BONUS_MULTIPLIER = 1;
    // Deposit Fee address
    address public feeAddress;

    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;
    // The block number when reward token mining starts.
    uint256 public startBlock;

    uint256 public devRewardRate;
    uint256 public rewardTotal;
    uint256 public reward2Total;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount, uint256 fee);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event SetFeeAddress(address indexed user, address indexed newAddress);
    event SetDevAddress(address indexed user, address indexed newAddress);
    event UpdateEmissionRate(address indexed user, uint256 mintPerBlock);

    constructor(
        address _weth,
        address _rewardToken,
        address _devaddr,
        address _feeAddress,
        uint256 _mintPerBlock,
        uint256 _startBlock
    ) public {
        weth = _weth;
        rewardToken = _rewardToken;
        devaddr = _devaddr;
        feeAddress = _feeAddress;
        mintPerBlock = _mintPerBlock;
        startBlock = _startBlock;
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    mapping(address => bool) public poolExistence;
    
    modifier nonDuplicated(address _depositToken) {
        require(poolExistence[_depositToken] == false, "nonDuplicated: duplicated");
        _;
    }

    receive() external payable {
        assert(msg.sender == weth);
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // _tokenType 1: token, 2: demax LP, 3: third LP
    function add(uint256 _allocPoint, address _depositToken, uint16 _depositFeeBP, bool _withUpdate, uint16 _tokenType, bool _isReward2) public onlyOwner nonDuplicated(_depositToken) {
        require(_depositFeeBP <= 10000, "add: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }

        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolExistence[_depositToken] = true;
        poolInfo.push(PoolInfo({
            depositToken : _depositToken,
            allocPoint : _allocPoint,
            lastRewardBlock : lastRewardBlock,
            accRewardPerShare : 0,
            accReward2PerShare : 0,
            depositTokenSupply: 0,
            depositFeeBP : _depositFeeBP,
            tokenType: _tokenType,
            isReward2: _isReward2
        }));
    }

    function batchAdd(bool _withUpdate, uint256[] memory _allocPoints, address[] memory _depositTokens, uint16[] memory _depositFeeBPs, uint16[] memory _tokenTypes, bool[] memory _isReward2s) public onlyOwner {
        require(_allocPoints.length == _depositTokens.length && _depositTokens.length == _depositFeeBPs.length, 'invalid params');
        for(uint256 i; i<_allocPoints.length; i++) {
            add(_allocPoints[i], _depositTokens[i], _depositFeeBPs[i], false, _tokenTypes[i], _isReward2s[i]);
        }
        if (_withUpdate) {
            massUpdatePools();
        }
    }

    function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate, uint16 _tokenType, bool _isReward2) public onlyAdmin {
        require(_depositFeeBP <= 10000, "set: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        poolInfo[_pid].depositFeeBP = _depositFeeBP;
        poolInfo[_pid].tokenType = _tokenType;
        poolInfo[_pid].isReward2 = _isReward2;
    }

    function batchSetAllocPoint(uint256[] memory _pids, uint256[] memory _allocPoints) public onlyAdmin {
        require(_pids.length == _allocPoints.length, 'invalid params');
        massUpdatePools();
        for (uint256 i; i<_pids.length; i++) {
            totalAllocPoint = totalAllocPoint.sub(poolInfo[_pids[i]].allocPoint).add(_allocPoints[i]);
            poolInfo[_pids[i]].allocPoint = _allocPoints[i];
        }
    }

    function batchSetDepositFeeBP(uint256[] memory _pids, uint16[] memory _depositFeeBPs) public onlyAdmin {
        require(_pids.length == _depositFeeBPs.length, 'invalid params');
        for (uint256 i; i<_pids.length; i++) {
            poolInfo[_pids[i]].depositFeeBP = _depositFeeBPs[i];
        }
    }

    // Return reward multiplier over the given _from to _to block.
    function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
        return _to.sub(_from).mul(BONUS_MULTIPLIER);
    }

    function reward2Token(uint256 _pid) public view returns (address) {
        PoolInfo memory pool = poolInfo[_pid];
        if(pool.tokenType == 2) {
            return IDemaxLP(pool.depositToken).shareToken();
        }
        return address(0);
    }

    // View function to see pending RewardTokens on frontend.
    function pendingReward(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][_user];
        uint256 accRewardPerShare = pool.accRewardPerShare;
        if (block.number > pool.lastRewardBlock && pool.depositTokenSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 reward = multiplier.mul(mintPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accRewardPerShare = accRewardPerShare.add(reward.mul(1e18).div(pool.depositTokenSupply));
        }
        return user.amount.mul(accRewardPerShare).div(1e18).sub(user.rewardDebt);
    }

    function pendingReward2(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][_user];
        uint256 accReward2PerShare = pool.accReward2PerShare;
        if (block.number > pool.lastRewardBlock && pool.depositTokenSupply != 0 && pool.isReward2 && reward2Token(_pid) != address(0)) {
            uint256 reward2 = IDemaxLP(pool.depositToken).queryReward();
            accReward2PerShare = accReward2PerShare.add(reward2.mul(1e18).div(pool.depositTokenSupply));
        }
        return user.amount.mul(accReward2PerShare).div(1e18).sub(user.reward2Debt);
    }

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

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        if (pool.depositTokenSupply == 0 || pool.allocPoint == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 reward = multiplier.mul(mintPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
        if(devRewardRate > 0) {
            IRewardToken(rewardToken).mint(devaddr, reward.div(devRewardRate));
            rewardTotal = rewardTotal.add(reward.div(devRewardRate));
        }
        IRewardToken(rewardToken).mint(address(this), reward);
        rewardTotal = rewardTotal.add(reward);
        pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e18).div(pool.depositTokenSupply));

        if(pool.isReward2 && reward2Token(_pid) != address(0)) {
            if(IDemaxLP(pool.depositToken).queryReward() > 0) {
                uint256 reward2 = IDemaxLP(pool.depositToken).mintReward();
                reward2Total = reward2Total.add(reward2);
                pool.accReward2PerShare = pool.accReward2PerShare.add(reward2.mul(1e18).div(pool.depositTokenSupply));
            }
        }
        
        pool.lastRewardBlock = block.number;
    }

    // Deposit LP tokens to DemaxShackFarm for reward allocation.
    function deposit(uint256 _pid, uint256 _amount) payable public nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        _harvest(_pid);
        uint256 depositFee;
        if(address(pool.depositToken) == weth) {
            _amount = msg.value;
        }
        if (_amount > 0) {
            if(address(pool.depositToken) == weth) {
                IWETH(weth).deposit{value: _amount}();
            } else {
                IERC20(pool.depositToken).transferFrom(address(msg.sender), address(this), _amount);
            }
            
            if (pool.depositFeeBP > 0) {
                depositFee = _amount.mul(pool.depositFeeBP).div(10000);
                IERC20(pool.depositToken).transfer(feeAddress, depositFee);
                _amount = _amount.sub(depositFee);
                user.amount = user.amount.add(_amount);
            } else {
                user.amount = user.amount.add(_amount);
            }
        }
        pool.depositTokenSupply  = pool.depositTokenSupply.add(_amount);
        user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e18);
        user.reward2Debt = user.amount.mul(pool.accReward2PerShare).div(1e18);
        emit Deposit(msg.sender, _pid, _amount, depositFee);
    }

    // Withdraw LP tokens from DemaxShackFarm.
    function withdraw(uint256 _pid, uint256 _amount) public nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        _harvest(_pid);
       
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.depositTokenSupply = pool.depositTokenSupply.sub(_amount);
            safeTransfer(pool.depositToken, msg.sender, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e18);
        user.reward2Debt = user.amount.mul(pool.accReward2PerShare).div(1e18);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    function _harvest(uint256 _pid) internal returns (uint256 reward, uint256 reward2) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 pending = user.amount.mul(pool.accRewardPerShare).div(1e18).sub(user.rewardDebt);
        if (pending > 0) {
            reward = safeTokenTransfer(rewardToken, msg.sender, pending);
        }
        
        pending = user.amount.mul(pool.accReward2PerShare).div(1e18).sub(user.reward2Debt);
        if (pending > 0 && reward2Token(_pid) != address(0)) {
            reward2 = safeTokenTransfer(reward2Token(_pid), msg.sender, pending);
        }
        return (reward, reward2);
    }

    function harvest(uint256 _pid) public nonReentrant returns (uint256 reward, uint256 reward2) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        (reward, reward2) = _harvest(_pid);
        user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e18);
        user.reward2Debt = user.amount.mul(pool.accReward2PerShare).div(1e18);
        return (reward, reward2);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        user.reward2Debt = 0;
        pool.depositTokenSupply = pool.depositTokenSupply.sub(amount);
        safeTransfer(pool.depositToken, msg.sender, amount);
        emit EmergencyWithdraw(msg.sender, _pid, amount);
    }

    // Safe Token transfer function, just in case if rounding error causes pool to not have enough tokens.
    function safeTokenTransfer(address _token, address _to, uint256 _amount) internal returns(uint256) {
        uint256 tokenBal = IERC20(_token).balanceOf(address(this));
        if(_amount > 0 && tokenBal > 0) {
            if (_amount > tokenBal) {
                _amount = tokenBal;
            }
            IERC20(_token).transfer(_to, _amount);
        }
        return _amount;
    }

    function safeTransfer(address _token, address _to, uint256 _amount) internal returns(uint256) {
        if(_token == weth) {
            IWETH(weth).withdraw(_amount);
            address(uint160(_to)).transfer(_amount);
        } else {
            IERC20(_token).transfer(_to, _amount);
        }
        return _amount;
    }

    // Update dev address by the previous dev.
    function dev(address _devaddr) public {
        require(msg.sender == devaddr || msg.sender == owner, "dev: wut?");
        devaddr = _devaddr;
        emit SetDevAddress(msg.sender, _devaddr);
    }

    function setFeeAddress(address _feeAddress) public {
        require(msg.sender == feeAddress || msg.sender == owner, "setFeeAddress: FORBIDDEN");
        feeAddress = _feeAddress;
        emit SetFeeAddress(msg.sender, _feeAddress);
    }

    function setDevRewardRate(uint256 _value) public onlyOwner {
        require(_value >=0 && _value <=10, 'invalid param');
        devRewardRate = _value;
    }

    //reward has to add hidden dummy pools inorder to alter the emission, here we make it simple and transparent to all.
    function updateEmissionRate(uint256 _mintPerBlock) public onlyOwner {
        massUpdatePools();
        mintPerBlock = _mintPerBlock;
        emit UpdateEmissionRate(msg.sender, _mintPerBlock);
    }
}

File 2 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 3 of 6 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 4 of 6 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

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

        return c;
    }

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

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

File 5 of 6 : ShackConfigable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.6;

interface IConfig {
    function admin() external view returns (address);
}

contract ShackConfigable {
    address public config;
    address public owner;

    constructor() public {
        owner = msg.sender;
    }
    
    function setupConfig(address _config) external onlyOwner {
        config = _config;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 'OWNER FORBIDDEN');
        _;
    }

    function admin() public view returns(address) {
        if(config != address(0)) {
            return IConfig(config).admin();
        }
        return owner;
    }


    function changeOwner(address _user) external onlyOwner {
        require(owner != _user, 'IFOConfig: NO CHANGE');
        owner = _user;
    }
    
    modifier onlyAdmin() {
        require(msg.sender == admin() || msg.sender == owner, 'admin FORBIDDEN');
        _;
    }
}

File 6 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_mintPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint16","name":"_tokenType","type":"uint16"},{"internalType":"bool","name":"_isReward2","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"},{"internalType":"address[]","name":"_depositTokens","type":"address[]"},{"internalType":"uint16[]","name":"_depositFeeBPs","type":"uint16[]"},{"internalType":"uint16[]","name":"_tokenTypes","type":"uint16[]"},{"internalType":"bool[]","name":"_isReward2s","type":"bool[]"}],"name":"batchAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"}],"name":"batchSetAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint16[]","name":"_depositFeeBPs","type":"uint16[]"}],"name":"batchSetDepositFeeBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"reward2","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"accReward2PerShare","type":"uint256"},{"internalType":"uint256","name":"depositTokenSupply","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint16","name":"tokenType","type":"uint16"},{"internalType":"bool","name":"isReward2","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"reward2Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward2Total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint16","name":"_tokenType","type":"uint16"},{"internalType":"bool","name":"_isReward2","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setDevRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_config","type":"address"}],"name":"setupConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"reward2Debt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260016003556000600b5534801561001a57600080fd5b506040516135fc3803806135fc833981810160405260c081101561003d57600080fd5b508051602082015160408301516060840151608085015160a09095015160018054336001600160a01b03199182161782556002919091556004805482166001600160a01b039788161790556005805482169587169590951790945560068054851693861693909317909255600880549093169316929092179055600791909155600c5561352d806100cf6000396000f3fe6080604052600436106102a45760003560e01c80638a58e89f1161016e578063a7e03dcb116100cb578063e2bbb1581161007f578063f7c618c111610064578063f7c618c114610dd9578063f851a44014610dee578063f959680b14610e03576102bf565b8063e2bbb15814610d8c578063ec5af49b14610daf576102bf565b8063cbd258b5116100b0578063cbd258b514610ced578063d49e77cd14610d34578063ddc6326214610d49576102bf565b8063a7e03dcb14610ba4578063c046d18814610bb9576102bf565b806393f1a40b1161012257806398969e821161010757806398969e8214610b23578063a544d0da14610b5c578063a6f9dae114610b71576102bf565b806393f1a40b1461099857806394f9c612146109ef576102bf565b80638d88a90e116101535780638d88a90e146109205780638da5cb5b146109535780638dbb1e3a14610968576102bf565b80638a58e89f146108e15780638aa285501461090b576102bf565b806348cd4cb11161021c578063701c01e7116101d05780637a336fcd116101b55780637a336fcd146108015780637ca443151461085c5780638705fcd4146108ae576102bf565b8063701c01e7146107b357806379502c55146107ec576102bf565b80635312ea8e116102015780635312ea8e146104ab578063620f0564146104d5578063630b5ba11461079e576102bf565b806348cd4cb11461046c57806351eb05a614610481576102bf565b806317caf6f1116102735780633fc8cef3116102585780633fc8cef3146103f65780634127535814610427578063441a3e701461043c576102bf565b806317caf6f1146103ae5780633d50f2e0146103c3576102bf565b8063081e3eda146102c45780630ba84cd2146102eb57806313476cef146103155780631526fe271461032a576102bf565b366102bf576004546001600160a01b031633146102bd57fe5b005b600080fd5b3480156102d057600080fd5b506102d9610e18565b60408051918252519081900360200190f35b3480156102f757600080fd5b506102bd6004803603602081101561030e57600080fd5b5035610e1f565b34801561032157600080fd5b506102d9610eb6565b34801561033657600080fd5b506103546004803603602081101561034d57600080fd5b5035610ebc565b604080516001600160a01b03909a168a5260208a0198909852888801969096526060880194909452608087019290925260a086015261ffff90811660c08601521660e0840152151561010083015251908190036101200190f35b3480156103ba57600080fd5b506102d9610f2e565b3480156103cf57600080fd5b506102bd600480360360208110156103e657600080fd5b50356001600160a01b0316610f34565b34801561040257600080fd5b5061040b610fa7565b604080516001600160a01b039092168252519081900360200190f35b34801561043357600080fd5b5061040b610fb6565b34801561044857600080fd5b506102bd6004803603604081101561045f57600080fd5b5080359060200135610fc5565b34801561047857600080fd5b506102d96111b0565b34801561048d57600080fd5b506102bd600480360360208110156104a457600080fd5b50356111b6565b3480156104b757600080fd5b506102bd600480360360208110156104ce57600080fd5b50356115c5565b3480156104e157600080fd5b506102bd600480360360c08110156104f857600080fd5b81351515919081019060408101602082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105a057600080fd5b8201836020820111156105b257600080fd5b803590602001918460208302840111640100000000831117156105d457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561062457600080fd5b82018360208201111561063657600080fd5b8035906020019184602083028401116401000000008311171561065857600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106a857600080fd5b8201836020820111156106ba57600080fd5b803590602001918460208302840111640100000000831117156106dc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561072c57600080fd5b82018360208201111561073e57600080fd5b8035906020019184602083028401116401000000008311171561076057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506116df945050505050565b3480156107aa57600080fd5b506102bd61181d565b3480156107bf57600080fd5b506102d9600480360360408110156107d657600080fd5b50803590602001356001600160a01b0316611840565b3480156107f857600080fd5b5061040b611a69565b34801561080d57600080fd5b506102bd600480360360c081101561082457600080fd5b508035906001600160a01b036020820135169061ffff604082013581169160608101351515916080820135169060a001351515611a78565b34801561086857600080fd5b506102bd600480360360c081101561087f57600080fd5b5080359060208101359061ffff604082013581169160608101351515916080820135169060a001351515611dab565b3480156108ba57600080fd5b506102bd600480360360208110156108d157600080fd5b50356001600160a01b0316611f8e565b3480156108ed57600080fd5b5061040b6004803603602081101561090457600080fd5b503561204e565b34801561091757600080fd5b506102d9612181565b34801561092c57600080fd5b506102bd6004803603602081101561094357600080fd5b50356001600160a01b0316612186565b34801561095f57600080fd5b5061040b612246565b34801561097457600080fd5b506102d96004803603604081101561098b57600080fd5b5080359060200135612255565b3480156109a457600080fd5b506109d1600480360360408110156109bb57600080fd5b50803590602001356001600160a01b0316612273565b60408051938452602084019290925282820152519081900360600190f35b3480156109fb57600080fd5b506102bd60048036036040811015610a1257600080fd5b810190602081018135640100000000811115610a2d57600080fd5b820183602082011115610a3f57600080fd5b80359060200191846020830284011164010000000083111715610a6157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610ab157600080fd5b820183602082011115610ac357600080fd5b80359060200191846020830284011164010000000083111715610ae557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061229f945050505050565b348015610b2f57600080fd5b506102d960048036036040811015610b4657600080fd5b50803590602001356001600160a01b03166123ce565b348015610b6857600080fd5b506102d9612582565b348015610b7d57600080fd5b506102bd60048036036020811015610b9457600080fd5b50356001600160a01b0316612588565b348015610bb057600080fd5b506102d961265e565b348015610bc557600080fd5b506102bd60048036036040811015610bdc57600080fd5b810190602081018135640100000000811115610bf757600080fd5b820183602082011115610c0957600080fd5b80359060200191846020830284011164010000000083111715610c2b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610c7b57600080fd5b820183602082011115610c8d57600080fd5b80359060200191846020830284011164010000000083111715610caf57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612664945050505050565b348015610cf957600080fd5b50610d2060048036036020811015610d1057600080fd5b50356001600160a01b03166127c4565b604080519115158252519081900360200190f35b348015610d4057600080fd5b5061040b6127d9565b348015610d5557600080fd5b50610d7360048036036020811015610d6c57600080fd5b50356127e8565b6040805192835260208301919091528051918290030190f35b6102bd60048036036040811015610da257600080fd5b50803590602001356128f9565b348015610dbb57600080fd5b506102bd60048036036020811015610dd257600080fd5b5035612cc2565b348015610de557600080fd5b5061040b612d6e565b348015610dfa57600080fd5b5061040b612d7d565b348015610e0f57600080fd5b506102d9612e1f565b6009545b90565b6001546001600160a01b03163314610e70576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b610e7861181d565b600781905560408051828152905133917fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053919081900360200190a250565b600f5481565b60098181548110610ec957fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169650929491939092919061ffff8082169162010000810490911690640100000000900460ff1689565b600b5481565b6001546001600160a01b03163314610f85576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6008546001600160a01b031681565b60028054141561101c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002808190555060006009838154811061103257fe5b60009182526020808320868452600a8252604080852033865290925292208054600790920290920192508311156110b0576040805162461bcd60e51b815260206004820152601260248201527f77697468647261773a206e6f7420676f6f640000000000000000000000000000604482015290519081900360640190fd5b6110b9846111b6565b6110c284612e25565b505082156111105780546110dc908463ffffffff612f2c16565b815560058201546110f3908463ffffffff612f2c16565b6005830155815461110e906001600160a01b03163385612f6e565b505b6003820154815461114091670de0b6b3a7640000916111349163ffffffff6130d316565b9063ffffffff61312c16565b60018201556004820154815461116991670de0b6b3a7640000916111349163ffffffff6130d316565b6002820155604080518481529051859133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505060016002555050565b600c5481565b6000600982815481106111c557fe5b90600052602060002090600702019050806002015443116111e657506115c2565b600581015415806111f957506001810154155b1561120a57436002909101556115c2565b600061121a826002015443612255565b9050600061124d600b546111348560010154611241600754876130d390919063ffffffff16565b9063ffffffff6130d316565b600d549091501561132c57600554600654600d546001600160a01b03928316926340c10f1992169061128690859063ffffffff61312c16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156112d557600080fd5b505af11580156112e9573d6000803e3d6000fd5b505050506040513d60208110156112ff57600080fd5b5050600d546113289061131990839063ffffffff61312c16565b600e549063ffffffff61316e16565b600e555b600554604080517f40c10f190000000000000000000000000000000000000000000000000000000081523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b15801561139957600080fd5b505af11580156113ad573d6000803e3d6000fd5b505050506040513d60208110156113c357600080fd5b5050600e546113d8908263ffffffff61316e16565b600e556005830154611411906114009061113484670de0b6b3a764000063ffffffff6130d316565b60038501549063ffffffff61316e16565b60038401556006830154640100000000900460ff168015611444575060006114388561204e565b6001600160a01b031614155b156115b8578254604080517f2c79db1100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691632c79db11916004808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b505111156115b8578254604080517f174f57af00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163174f57af91600480830192602092919082900301818787803b15801561153657600080fd5b505af115801561154a573d6000803e3d6000fd5b505050506040513d602081101561156057600080fd5b5051600f54909150611578908263ffffffff61316e16565b600f5560058401546115b1906115a09061113484670de0b6b3a764000063ffffffff6130d316565b60048601549063ffffffff61316e16565b6004850155505b5050436002909101555b50565b60028054141561161c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002808190555060006009828154811061163257fe5b60009182526020808320858452600a8252604080852033865290925290832080548482556001820185905560028201949094556007929092020160058101549093509091906116819082612f2c565b6005840155825461169c906001600160a01b03163383612f6e565b50604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a3505060016002555050565b6001546001600160a01b03163314611730576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b83518551148015611742575082518451145b611784576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b8551811015611806576117fe86828151811061179f57fe5b60200260200101518683815181106117b357fe5b60200260200101518684815181106117c757fe5b602002602001015160008786815181106117dd57fe5b60200260200101518787815181106117f157fe5b6020026020010151611a78565b600101611787565b5085156118155761181561181d565b505050505050565b60095460005b8181101561183c57611834816111b6565b600101611823565b5050565b600061184a61340c565b6009848154811061185757fe5b60009182526020918290206040805161012081018252600790930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015461ffff80821660c08401526201000082041660e083015260ff64010000000090910416151561010082015290506118f061346b565b506000848152600a602090815260408083206001600160a01b0387168452825291829020825160608101845281548152600182015492810192909252600201548183015260808301519183015190919043118015611951575060a083015115155b801561195f57508261010001515b801561197d575060006119718761204e565b6001600160a01b031614155b15611a2657600083600001516001600160a01b0316632c79db116040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d60208110156119eb57600080fd5b505160a0850151909150611a2290611a159061113484670de0b6b3a764000063ffffffff6130d316565b839063ffffffff61316e16565b9150505b611a5d8260400151611a51670de0b6b3a76400006111348587600001516130d390919063ffffffff16565b9063ffffffff612f2c16565b93505050505b92915050565b6000546001600160a01b031681565b6001546001600160a01b03163314611ac9576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b6001600160a01b038516600090815260106020526040902054859060ff1615611b39576040805162461bcd60e51b815260206004820152601960248201527f6e6f6e4475706c6963617465643a206475706c69636174656400000000000000604482015290519081900360640190fd5b6127108561ffff161115611b7e5760405162461bcd60e51b815260040180806020018281038252602581526020018061348d6025913960400191505060405180910390fd5b8315611b8c57611b8c61181d565b6000600c544311611b9f57600c54611ba1565b435b600b54909150611bb7908963ffffffff61316e16565b600b556001600160a01b039687166000818152601060209081526040808320805460ff191660019081179091558151610120810183529485529184019b8c528301938452606083018281526080840183815260a0850184815261ffff9b8c1660c08701908152998c1660e087019081529815156101008701908152600980549586018155909552945160079093027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af8101805494909d166001600160a01b031990941693909317909b559a517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b082015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b184015598517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b283015596517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b382015595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b48701555090517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b590940180549151955115156401000000000264ff0000000019968516620100000263ffff0000199690951661ffff199093169290921794909416929092179390931617905550565b611db3612d7d565b6001600160a01b0316336001600160a01b03161480611ddc57506001546001600160a01b031633145b611e1f576040805162461bcd60e51b815260206004820152600f60248201526e30b236b4b7102327a92124a22222a760891b604482015290519081900360640190fd5b6127108461ffff161115611e645760405162461bcd60e51b81526004018080602001828103825260258152602001806134d36025913960400191505060405180910390fd5b8215611e7257611e7261181d565b611eb585611ea960098981548110611e8657fe5b906000526020600020906007020160010154600b54612f2c90919063ffffffff16565b9063ffffffff61316e16565b600b819055508460098781548110611ec957fe5b9060005260206000209060070201600101819055508360098781548110611eec57fe5b906000526020600020906007020160060160006101000a81548161ffff021916908361ffff1602179055508160098781548110611f2557fe5b906000526020600020906007020160060160026101000a81548161ffff021916908361ffff1602179055508060098781548110611f5e57fe5b906000526020600020906007020160060160046101000a81548160ff021916908315150217905550505050505050565b6008546001600160a01b0316331480611fb157506001546001600160a01b031633145b612002576040805162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e0000000000000000604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03831690811790915560405133907fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f790600090a350565b600061205861340c565b6009838154811061206557fe5b6000918252602091829020604080516101208101825260079390930290910180546001600160a01b03168352600181015493830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a083015260069092015461ffff80821660c08401526201000082041660e0830181905264010000000090910460ff16151561010083015290925014156121765780600001516001600160a01b0316636c9fa59e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214157600080fd5b505afa158015612155573d6000803e3d6000fd5b505050506040513d602081101561216b57600080fd5b5051915061217c9050565b60009150505b919050565b600181565b6006546001600160a01b03163314806121a957506001546001600160a01b031633145b6121fa576040805162461bcd60e51b815260206004820152600960248201527f6465763a207775743f0000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e790600090a350565b6001546001600160a01b031681565b600061226c6001611241848663ffffffff612f2c16565b9392505050565b600a60209081526000928352604080842090915290825290208054600182015460029092015490919083565b6122a7612d7d565b6001600160a01b0316336001600160a01b031614806122d057506001546001600160a01b031633145b612313576040805162461bcd60e51b815260206004820152600f60248201526e30b236b4b7102327a92124a22222a760891b604482015290519081900360640190fd5b805182511461235a576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b82518110156123c95781818151811061237257fe5b6020026020010151600984838151811061238857fe5b60200260200101518154811061239a57fe5b60009182526020909120600790910201600601805461ffff191661ffff9290921691909117905560010161235d565b505050565b60006123d861340c565b600984815481106123e557fe5b60009182526020918290206040805161012081018252600790930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015461ffff80821660c08401526201000082041660e083015260ff640100000000909104161515610100820152905061247e61346b565b506000848152600a602090815260408083206001600160a01b038716845282529182902082516060808201855282548252600183015493820193909352600290910154818401529083015191830151909190431180156124e1575060a083015115155b156125575760006124f6846040015143612255565b9050600061251d600b546111348760200151611241600754876130d390919063ffffffff16565b90506125526125458660a00151611134670de0b6b3a7640000856130d390919063ffffffff16565b849063ffffffff61316e16565b925050505b611a5d8260200151611a51670de0b6b3a76400006111348587600001516130d390919063ffffffff16565b600d5481565b6001546001600160a01b031633146125d9576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b6001546001600160a01b038281169116141561263c576040805162461bcd60e51b815260206004820152601460248201527f49464f436f6e6669673a204e4f204348414e4745000000000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b61266c612d7d565b6001600160a01b0316336001600160a01b0316148061269557506001546001600160a01b031633145b6126d8576040805162461bcd60e51b815260206004820152600f60248201526e30b236b4b7102327a92124a22222a760891b604482015290519081900360640190fd5b805182511461271f576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b604482015290519081900360640190fd5b61272761181d565b60005b82518110156123c95761276d82828151811061274257fe5b6020026020010151611ea9600986858151811061275b57fe5b602002602001015181548110611e8657fe5b600b55815182908290811061277e57fe5b6020026020010151600984838151811061279457fe5b6020026020010151815481106127a657fe5b6000918252602090912060016007909202018101919091550161272a565b60106020526000908152604090205460ff1681565b6006546001600160a01b031681565b600080600280541415612842576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002808190555060006009848154811061285857fe5b60009182526020808320878452600a82526040808520338652909252922060079091029091019150612889856111b6565b61289285612e25565b600384015483549296509094506128bd91670de0b6b3a764000091611134919063ffffffff6130d316565b6001820155600482015481546128e691670de0b6b3a7640000916111349163ffffffff6130d316565b6002909101555060016002559092909150565b600280541415612950576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002808190555060006009838154811061296657fe5b60009182526020808320868452600a82526040808520338652909252922060079091029091019150612997846111b6565b6129a084612e25565b505060045482546000916001600160a01b03918216911614156129c1573493505b8315612c0b5760045483546001600160a01b0390811691161415612a5b5760048054604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169263d0e30db0928892808301926000929182900301818588803b158015612a3d57600080fd5b505af1158015612a51573d6000803e3d6000fd5b5050505050612afa565b8254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015612acd57600080fd5b505af1158015612ae1573d6000803e3d6000fd5b505050506040513d6020811015612af757600080fd5b50505b600683015461ffff1615612bf6576006830154612b2a906127109061113490879061ffff1663ffffffff6130d316565b8354600854604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015612b9d57600080fd5b505af1158015612bb1573d6000803e3d6000fd5b505050506040513d6020811015612bc757600080fd5b50612bda9050848263ffffffff612f2c16565b8254909450612bef908563ffffffff61316e16565b8255612c0b565b8154612c08908563ffffffff61316e16565b82555b6005830154612c20908563ffffffff61316e16565b600584015560038301548254612c4991670de0b6b3a7640000916111349163ffffffff6130d316565b600183015560048301548254612c7291670de0b6b3a7640000916111349163ffffffff6130d316565b600283015560408051858152602081018390528151879233927f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e929081900390910190a350506001600255505050565b6001546001600160a01b03163314612d13576040805162461bcd60e51b815260206004820152600f60248201526e27aba722a9102327a92124a22222a760891b604482015290519081900360640190fd5b600a811115612d69576040805162461bcd60e51b815260206004820152600d60248201527f696e76616c696420706172616d00000000000000000000000000000000000000604482015290519081900360640190fd5b600d55565b6005546001600160a01b031681565b600080546001600160a01b031615612e0f576000809054906101000a90046001600160a01b03166001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015612ddc57600080fd5b505afa158015612df0573d6000803e3d6000fd5b505050506040513d6020811015612e0657600080fd5b50519050610e1c565b506001546001600160a01b031690565b600e5481565b600080600060098481548110612e3757fe5b60009182526020808320878452600a82526040808520338652909252908320600181015460036007909402909201928301548154939550909392612e949291611a5191670de0b6b3a764000091611134919063ffffffff6130d316565b90508015612eb657600554612eb3906001600160a01b031633836131c8565b94505b612ee58260020154611a51670de0b6b3a7640000611134876004015487600001546130d390919063ffffffff16565b9050600081118015612f0957506000612efd8761204e565b6001600160a01b031614155b15612f2457612f21612f1a8761204e565b33836131c8565b93505b505050915091565b600061226c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613310565b6004546000906001600160a01b038581169116141561303f5760048054604080517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152928301859052516001600160a01b0390911691632e1a7d4d91602480830192600092919082900301818387803b158015612feb57600080fd5b505af1158015612fff573d6000803e3d6000fd5b50506040516001600160a01b038616925084156108fc02915084906000818181858888f19350505050158015613039573d6000803e3d6000fd5b506130cc565b836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561309f57600080fd5b505af11580156130b3573d6000803e3d6000fd5b505050506040513d60208110156130c957600080fd5b50505b5092915050565b6000826130e257506000611a63565b828202828482816130ef57fe5b041461226c5760405162461bcd60e51b81526004018080602001828103825260218152602001806134b26021913960400191505060405180910390fd5b600061226c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506133a7565b60008282018381101561226c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009182916001600160a01b038716916370a08231916024808301926020929190829003018186803b15801561322c57600080fd5b505afa158015613240573d6000803e3d6000fd5b505050506040513d602081101561325657600080fd5b5051905082158015906132695750600081115b15613307578083111561327a578092505b846001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156132da57600080fd5b505af11580156132ee573d6000803e3d6000fd5b505050506040513d602081101561330457600080fd5b50505b50909392505050565b6000818484111561339f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336457818101518382015260200161334c565b50505050905090810190601f1680156133915780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836133f65760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561336457818101518382015260200161334c565b50600083858161340257fe5b0495945050505050565b60405180610120016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600061ffff168152602001600061ffff1681526020016000151581525090565b6040518060600160405280600081526020016000815260200160008152509056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e7473a26469706673582212200ffa1fff3e07b7556b6e4f396aa5b2042f4e6bf00f9a66446c2e13004101ad7f64736f6c63430006060033000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000afe24e29da7e9b3e8a25c9478376b6ad6ad788dd0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000663b14

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

000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000afe24e29da7e9b3e8a25c9478376b6ad6ad788dd0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000663b14

-----Decoded View---------------
Arg [0] : _weth (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [1] : _rewardToken (address): 0xafe24e29da7e9b3e8a25c9478376b6ad6ad788dd
Arg [2] : _devaddr (address): 0x3860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc
Arg [3] : _feeAddress (address): 0x3860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc
Arg [4] : _mintPerBlock (uint256): 100000000000000000
Arg [5] : _startBlock (uint256): 6699796

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [1] : 000000000000000000000000afe24e29da7e9b3e8a25c9478376b6ad6ad788dd
Arg [2] : 0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc
Arg [3] : 0000000000000000000000003860bbfc68f19b06ed2ca13f50c3ae3d9543b3bc
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000663b14


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