Contract 0x2b1ad6ebad818d5e0b29c694577e70f6e9344e91 1

 
 
Txn Hash
Block
From
To
Value [Txn Fee]
0x93ea3e25443a9943f3978a1d41e184e443713c9c1f830acd35238a0db6184b2297557752021-08-05 1:07:4337 mins ago0xdcbc799e0c9be32d388e5a2153f2e85f3dadbd69 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001470875
0x1d3438eaf95ab218eb70b9c43a1fb49d6307e171ac755bde137d53cc58a6abdf97540222021-08-04 23:37:202 hrs 8 mins ago0xc26f8b76fdda14f0cd177c01160e722c5b2789ec IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001499215
0xe3839d3857a20889d61dc486cae730db3ea7526b44d1acb62a73a0c50da8094e97539722021-08-04 23:34:292 hrs 11 mins ago0x77fcc17608eb06ffa8c6fc4e80ddae8c034270a4 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001470815
0x9cae27b9648242843e5c23c8db283197f0d5df7b6b7704ac7f31fadab8a75e2c97537922021-08-04 23:24:342 hrs 20 mins ago0xe5b7c3396ca0b154a80019ccf3fe08f162495e66 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578115
0x32c8cfba24e8c65ed7b150f6150dc594a5d24d84d7a915a352e2b2e12688c91097527002021-08-04 22:28:563 hrs 16 mins ago0x188e4f7c76315d36899fd09c37db4a5673330ab3 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578115
0x7e4f292c8d42da9c07a4637e902916dd18d6feceab89aebb84caf7cac939dbb097515572021-08-04 21:31:034 hrs 14 mins ago0x8dd57f9689af3a9f5183c413f0a9fbad4a549ed8 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001499155
0xc20a9835c1128f72916b8bdb2d760692c25120d98ff6fa0913798b4e614249df97515432021-08-04 21:30:214 hrs 15 mins ago0x8dd57f9689af3a9f5183c413f0a9fbad4a549ed8 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00229473
0xf3369701550075f289044b8aa54e9cf235d85e2ffac2aedfc7ca6e0008faf1ea97515362021-08-04 21:30:004 hrs 15 mins ago0x8dd57f9689af3a9f5183c413f0a9fbad4a549ed8 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001424215
0x1f747c5ab094fb2f46dd68b34454e1e0a9cb4f1e080e54ebd863e7e584b5862597509372021-08-04 20:58:234 hrs 47 mins ago0xcbd30b241c111e38b5fd728b64a4c29b7e9a4f72 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0xe1729dad43aac4f4d381da245cbf171ba0ac67f36c5c4d339e9ce51115d5ce8b97504782021-08-04 20:34:415 hrs 10 mins ago0x23f8b988d70d71bb1d3354d6511ced807cde0724 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0xb090c0f5113219ced0f1cb7f747af747c146e3e78f26ad1fd18fc50e0fbd67ea97497092021-08-04 19:55:435 hrs 49 mins ago0xc2e1913f74c76348d301dcf6f327446456da97e9 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578115
0x26018ee4a712b38e5b5609b4173fd2b04eac26f3bf71745ebb2bed80094e54af97496522021-08-04 19:52:525 hrs 52 mins ago0xf0ff26febb6ae861443bb40ffc36b8cf53616f81 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00229473
0x5addb1deccff0736e876bbb17bc52671205eb32c073d4da68d63143e8007deb797495672021-08-04 19:48:375 hrs 56 mins ago0x70a1ff10524783ad246b09a3a0f87ef8c05461a2 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001545755
0xbf16339644c98decf822f02e0ad436073a115e94c6fa0fa06bb19a7202067a9497495432021-08-04 19:47:255 hrs 58 mins ago0x70a1ff10524783ad246b09a3a0f87ef8c05461a2 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578055
0x1fc863579b320010488afd4c94f60bad42c701976b6d380f1547353e3838d18c97494192021-08-04 19:40:336 hrs 4 mins ago0xc7dbcbf6200d52b2c50196c11960c9d392cdc07f IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0x6ed1323e68dd57fb9c9fa40a70c8e33aeba7853e6ad640f1143230db6075701497492292021-08-04 19:30:486 hrs 14 mins ago0xae8dd5b3bf21a3215b8a3edeba2ff6405d69f14d IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001545875
0x073f48fc550e841f01e8dadf3351eb2821633a602dc48ab9f67fbb296e6e56b997491372021-08-04 19:26:126 hrs 19 mins ago0x90d9a2e11242f823604cdbae5968c998d2971f6a IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001545935
0x3d168d6840fc82b65fd226c18ade6c8f6396c843e5b368614464e2b53b07946e97491212021-08-04 19:25:246 hrs 20 mins ago0x90d9a2e11242f823604cdbae5968c998d2971f6a IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00229473
0xf50455b6853b8f5e22e36035ccb57a7bcf2db4862cb972e60545368a01f8013f97485232021-08-04 18:55:306 hrs 50 mins ago0xf91d70662eb900768e431c0124cfbcec89285d9a IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578115
0xc20bff31e53f5159ab81b1dbddfa630928baaf3c3c255df1e23167dce0fd793497485122021-08-04 18:54:576 hrs 50 mins ago0x389b8bd4fac72ff9aa5fd888a4b3283ac4c14b28 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001349275
0xd2b3990591a1ab4fa287b8a71a25cac0ea9963875594bb9f2f13493357300d0e97484792021-08-04 18:53:186 hrs 52 mins ago0xf91d70662eb900768e431c0124cfbcec89285d9a IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001349275
0x2d56bff60deccf815bfa310c369aa3042c52f2ebde5e45905c6a9cd1a101d91397483582021-08-04 18:47:156 hrs 58 mins ago0x8e0fd6ab040360dd674dff0f0c24308b3b056499 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0xd1baa25834a2f0f3122baf92425ad3a60d6a49edaa2d188eac4239138eb3f3da97478292021-08-04 18:20:487 hrs 24 mins ago0x0a968cea8d90b0ffc66698baaa11b447abb4a261 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0xbcaa7c229da997db9e04b269e66e87c5c1c9dd484cf0a32630bee31e2a402ce597478262021-08-04 18:20:397 hrs 24 mins ago0xac3520bfea13b7bdeb63fae817023bbef669638a IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.00234873
0xdb5b8e564cfe091bcf0bfc546811a84ec2b31c9c0cb59004a9a6a5f75cbc0e9b97478162021-08-04 18:20:097 hrs 25 mins ago0xb697cea2dd7a0b9c90be7da172831d91c32b70f8 IN  0x2b1ad6ebad818d5e0b29c694577e70f6e9344e910 BNB0.001578055
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x35fb03aa383242ee4a9ba9735ce5e3ee317f89cec846d37d7cf5f64917e0d51281755702021-06-10 12:33:1655 days 13 hrs ago 0x2b1ad6ebad818d5e0b29c694577e70f6e9344e91  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TrustPadLevelsStaking

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : ILevelsStaking.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Structs {
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
        uint256 pendingRewards;
        uint256 unlocksAt;
    }

    struct Tier {
        string id;
        uint8 multiplier;
        uint256 lockingPeriod; // in seconds
        uint256 minAmount; // tier is applied when userAmount >= minAmount
        bool random;
        uint8 odds; // divider: 2 = 50%, 4 = 25%, 10 = 10%
    }
}

interface ILevelsStaking {
    function getTierById(string calldata id) external view returns (Structs.Tier memory);
    function getUserTier(address account) external view returns (Structs.Tier memory);
    function getTierIds() external view returns (string[] memory);
    function lock(address account) external;
}

File 2 of 10 : Stakeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./ILevelsStaking.sol";
import "./StakingTreasury.sol";

abstract contract Stakeable is Ownable {
    using SafeERC20 for IERC20;

    struct PoolInfo {
        IERC20 stakingToken;
        uint256 lastRewardBlock;
        uint256 accRewardPerShare;
    }

    mapping(address => Structs.UserInfo) public userInfo;

    IERC20 public rewardToken;
    uint256 public rewardPerBlock = 1 * 1e9; // 1 token
    uint256 private divider = 1e12;

    // Keeps reward tokens
    StakingTreasury public treasury;

    // base 1000, value * % / 100
    uint256 public feePercent = 0;
    uint256 public collectedFees;

    PoolInfo public liquidityMining;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event Claim(address indexed user, uint256 amount);

    constructor() {
        treasury = new StakingTreasury();
    }

    function setPoolInfo(IERC20 _rewardToken, IERC20 _stakingToken) external onlyOwner {
        require(address(rewardToken) == address(0) && address(liquidityMining.stakingToken) == address(0), 'Token is already set');
        rewardToken = _rewardToken;
        liquidityMining = PoolInfo({stakingToken : _stakingToken, lastRewardBlock : 0, accRewardPerShare : 0});
        treasury.allowClaiming(_rewardToken);
    }

    function startMining() external onlyOwner {
        require(liquidityMining.lastRewardBlock == 0, 'Mining already started');
        liquidityMining.lastRewardBlock = block.number;
    }

    function pendingRewards(address _user) external view returns (uint256) {
        if (liquidityMining.lastRewardBlock == 0 || block.number < liquidityMining.lastRewardBlock) {
            return 0;
        }

        Structs.UserInfo storage user = userInfo[_user];
        uint256 accRewardPerShare = liquidityMining.accRewardPerShare;
        uint256 stakingTokenSupply = liquidityMining.stakingToken.balanceOf(address(this));

        if (block.number > liquidityMining.lastRewardBlock && stakingTokenSupply != 0) {
            uint256 perBlock = rewardPerBlock;
            uint256 multiplier = block.number - liquidityMining.lastRewardBlock;
            uint256 reward = multiplier * perBlock;
            accRewardPerShare = accRewardPerShare + (reward * divider / stakingTokenSupply);
        }

        return (user.amount * accRewardPerShare / divider) - user.rewardDebt + user.pendingRewards;
    }

    function updatePool() internal {
        require(liquidityMining.lastRewardBlock > 0 && block.number >= liquidityMining.lastRewardBlock, 'Mining not yet started');
        if (block.number <= liquidityMining.lastRewardBlock) {
            return;
        }
        uint256 stakingTokenSupply = liquidityMining.stakingToken.balanceOf(address(this));
        if (stakingTokenSupply == 0) {
            liquidityMining.lastRewardBlock = block.number;
            return;
        }
        uint256 multiplier = block.number - liquidityMining.lastRewardBlock;
        uint256 tokensReward = multiplier * rewardPerBlock;
        liquidityMining.accRewardPerShare = liquidityMining.accRewardPerShare + (tokensReward * divider / stakingTokenSupply);
        liquidityMining.lastRewardBlock = block.number;
    }

    function deposit(uint256 amount) public virtual {
        Structs.UserInfo storage user = userInfo[msg.sender];
        updatePool();

        uint256 accRewardPerShare = liquidityMining.accRewardPerShare;

        if (user.amount > 0) {
            uint256 pending = (user.amount * accRewardPerShare / divider) - user.rewardDebt;
            if (pending > 0) {
                user.pendingRewards = user.pendingRewards + pending;
            }
        }
        if (amount > 0) {
            liquidityMining.stakingToken.safeTransferFrom(address(msg.sender), address(this), amount);

            if (feePercent > 0) {
                uint256 fee = amount * feePercent / 1000;
                amount = amount - fee;
                collectedFees = collectedFees + fee;
            }

            user.amount = user.amount + amount;
        }
        user.rewardDebt = user.amount * accRewardPerShare / divider;
        emit Deposit(msg.sender, amount);
    }

    function withdraw(uint256 amount) public virtual {
        Structs.UserInfo storage user = userInfo[msg.sender];
        require(user.amount >= amount, "Withdrawing more than you have!");
        updatePool();

        uint256 accRewardPerShare = liquidityMining.accRewardPerShare;

        uint256 pending = (user.amount * accRewardPerShare / divider) - user.rewardDebt;
        if (pending > 0) {
            user.pendingRewards = user.pendingRewards + pending;
        }
        if (amount > 0) {
            user.amount = user.amount - amount;

            if (feePercent > 0) {
                uint256 fee = amount * feePercent / 1000;
                amount = amount - fee;
                collectedFees = collectedFees + fee;
            }

            liquidityMining.stakingToken.safeTransfer(address(msg.sender), amount);
        }
        user.rewardDebt = user.amount * accRewardPerShare / divider;
        emit Withdraw(msg.sender, amount);
    }

    function claim() external {
        Structs.UserInfo storage user = userInfo[msg.sender];
        updatePool();

        uint256 accRewardPerShare = liquidityMining.accRewardPerShare;

        uint256 pending = (user.amount * accRewardPerShare / divider) - user.rewardDebt;
        if (pending > 0 || user.pendingRewards > 0) {
            user.pendingRewards = user.pendingRewards + pending;
            uint256 claimedAmount = safeRewardTransfer(msg.sender, user.pendingRewards);
            emit Claim(msg.sender, claimedAmount);
            user.pendingRewards = user.pendingRewards - claimedAmount;
        }
        user.rewardDebt = user.amount * accRewardPerShare / divider;
    }

    function safeRewardTransfer(address to, uint256 amount) internal returns (uint256) {
        uint256 balance = rewardToken.balanceOf(address(treasury));
        require(amount > 0, 'Reward amount must be more than zero');
        require(balance > 0, 'Not enough reward tokens for transfer');
        if (amount > balance) {
            rewardToken.safeTransferFrom(address(treasury), to, balance);
            return balance;
        }

        rewardToken.safeTransferFrom(address(treasury), to, amount);
        return amount;
    }

    function setRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner {
        require(_rewardPerBlock > 0, "Reward per block should be greater than 0");
        rewardPerBlock = _rewardPerBlock;
    }

    function setFee(uint256 fee) external onlyOwner {
        require(fee >= 0, 'Fee is too small');
        require(fee <= 50, 'Fee is too big');
        feePercent = fee;
    }

    function withdrawFees(address payable withdrawalAddress) external onlyOwner {
        liquidityMining.stakingToken.safeTransfer(withdrawalAddress, collectedFees);
        collectedFees = 0;
    }
}

File 3 of 10 : StakingTreasury.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract StakingTreasury is Ownable {
    function allowClaiming(IERC20 _rewardToken) external onlyOwner {
        _rewardToken.approve(this.owner(), 100000000 ether);
    }
}

File 4 of 10 : TrustPadLevelsStaking.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./ILevelsStaking.sol";
import "./StakingTreasury.sol";
import "./WithLevels.sol";
import "./Stakeable.sol";

contract TrustPadLevelsStaking is Ownable, ILevelsStaking, Stakeable, WithLevels {
    using SafeERC20 for IERC20;

    mapping(address => bool) isIDO;
    bool public lockEnabled = true;
    bool public halted = false;

    event Lock(address indexed account, uint256 unlockTime, address locker);
    event LockEnabled(bool status);
    event Halted(bool status);

    function getUserTier(address account) external view override returns (Structs.Tier memory) {
        return getTierForAmount(userInfo[account].amount);
    }

    function getUserUnlockTime(address account) external view returns (uint) {
        return userInfo[account].unlocksAt;
    }

    function toggleLocking(bool status) external onlyOwner {
        lockEnabled = status;
        emit LockEnabled(status);
    }

    modifier onlyIDO() {
        require(isIDO[_msgSender()], "Only IDOs can lock");
        _;
    }

    modifier lockable() {
        require(!lockEnabled || userInfo[_msgSender()].unlocksAt <= block.timestamp, "Account is locked");
        _;
    }

    modifier notHalted() {
        require(!halted, "Deposits are paused");
        _;
    }

    function deposit(uint256 amount) public override notHalted {
        super.deposit(amount);
    }

    function withdraw(uint256 amount) public override lockable {
        super.withdraw(amount);
    }

    function lock(address account) external override onlyIDO {
        Structs.UserInfo storage user = userInfo[account];
        Structs.Tier memory tier = getTierForAmount(user.amount);
        if (tier.lockingPeriod == 0) {
            return;
        }

        uint unlockTime = block.timestamp + tier.lockingPeriod;
        if (user.unlocksAt < unlockTime) {
            user.unlocksAt = unlockTime;
            emit Lock(account, unlockTime, _msgSender());
        }
    }

    function halt(bool status) external onlyOwner {
        halted = status;
        emit Halted(status);
    }

    function addIDO(address account) external onlyOwner {
        require(account != address(0), "IDO cannot be zero address");
        isIDO[account] = true;
    }
}

File 5 of 10 : WithLevels.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./ILevelsStaking.sol";

abstract contract WithLevels is Ownable, ILevelsStaking {
    string constant noneTierId = "none";

    Structs.Tier[] public tiers;

    event TierCreate(string indexed id, uint8 multiplier, uint256 lockingPeriod, uint256 minAmount, bool random, uint8 odds);
    event TierUpdate(string indexed id, uint8 multiplier, uint256 lockingPeriod, uint256 minAmount, bool random, uint8 odds);
    event TierRemove(string indexed id, uint256 idx);

    constructor() {
        tiers.push(Structs.Tier(noneTierId, 0, 0, 0, false, 0));
    }

    function getTierIds() external view override returns (string[] memory) {
        string[] memory ids = new string[](tiers.length);
        for (uint i = 0; i < tiers.length; i++) {
            ids[i] = tiers[i].id;
        }

        return ids;
    }

    function getTierById(string calldata id) public view override returns (Structs.Tier memory) {
        for (uint256 i = 0; i < tiers.length; i++) {
            if (stringsEqual(tiers[i].id, id)) {
                return tiers[i];
            }
        }
        revert('No such tier');
    }

    function getTierForAmount(uint amount) internal view returns (Structs.Tier memory) {
        return tiers[getTierIdxForAmount(amount)];
    }

    function getTierIdxForAmount(uint amount) internal view returns (uint) {
        if (amount == 0) {
            return 0;
        }
        uint maxTierK = 0;
        uint256 maxTierV;
        for (uint i = 1; i < tiers.length; i++) {
            Structs.Tier storage tier = tiers[i];
            if (amount >= tier.minAmount && tier.minAmount > maxTierV) {
                maxTierK = i;
                maxTierV = tier.minAmount;
            }
        }

        return maxTierK;
    }

    function setTier(string calldata id, uint8 multiplier, uint256 lockingPeriod, uint256 minAmount, bool random, uint8 odds) external onlyOwner returns (uint256) {
        require(!stringsEqual(id, noneTierId), "Can't change 'none' tier");

        for (uint256 i = 0; i < tiers.length; i++) {
            if (stringsEqual(tiers[i].id, id)) {
                tiers[i].multiplier = multiplier;
                tiers[i].lockingPeriod = lockingPeriod;
                tiers[i].minAmount = minAmount;
                tiers[i].random = random;
                tiers[i].odds = odds;

                emit TierUpdate(id, multiplier, lockingPeriod, minAmount, random, odds);

                return i;
            }
        }

        Structs.Tier memory newTier = Structs.Tier(id, multiplier, lockingPeriod, minAmount, random, odds);
        tiers.push(newTier);

        emit TierCreate(id, multiplier, lockingPeriod, minAmount, random, odds);

        return tiers.length - 1;
    }

    function deleteTier(string calldata id) external onlyOwner {
        require(!stringsEqual(id, noneTierId), "Can't delete 'none' tier");

        for (uint256 tierIdx = 0; tierIdx < tiers.length; tierIdx++) {
            if (stringsEqual(tiers[tierIdx].id, id)) {
                for (uint i = tierIdx; i < tiers.length - 1; i++) {
                    tiers[i] = tiers[i + 1];
                }
                tiers.pop();

                emit TierRemove(id, tierIdx);
                break;
            }
        }
    }

    function stringsEqual(string memory a, string memory b) private pure returns (bool) {
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }
}

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

File 7 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);
}

File 8 of 10 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

File 9 of 10 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","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":"bool","name":"status","type":"bool"}],"name":"Halted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"locker","type":"address"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LockEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint8","name":"multiplier","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"random","type":"bool"},{"indexed":false,"internalType":"uint8","name":"odds","type":"uint8"}],"name":"TierCreate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint256","name":"idx","type":"uint256"}],"name":"TierRemove","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint8","name":"multiplier","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"random","type":"bool"},{"indexed":false,"internalType":"uint8","name":"odds","type":"uint8"}],"name":"TierUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addIDO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"deleteTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getTierById","outputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint8","name":"multiplier","type":"uint8"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"random","type":"bool"},{"internalType":"uint8","name":"odds","type":"uint8"}],"internalType":"struct Structs.Tier","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTierIds","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserTier","outputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint8","name":"multiplier","type":"uint8"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"random","type":"bool"},{"internalType":"uint8","name":"odds","type":"uint8"}],"internalType":"struct Structs.Tier","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"halt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"halted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityMining","outputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_stakingToken","type":"address"}],"name":"setPoolInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint8","name":"multiplier","type":"uint8"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"random","type":"bool"},{"internalType":"uint8","name":"odds","type":"uint8"}],"name":"setTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tiers","outputs":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint8","name":"multiplier","type":"uint8"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"bool","name":"random","type":"bool"},{"internalType":"uint8","name":"odds","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"toggleLocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract StakingTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"uint256","name":"unlocksAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawalAddress","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052633b9aca0060035564e8d4a510006004556000600655600d805461ffff191660011790553480156200003557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040516200008590620001bc565b604051809103906000f080158015620000a2573d6000803e3d6000fd5b50600580546001600160a01b0319166001600160a01b03929092169190911781556040805161010081018252600460c08201908152636e6f6e6560e01b60e0830152815260006020808301829052928201819052606082018190526080820181905260a08201819052600b805460018101825591528151805192947f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9920291909101926200015692849290910190620001ca565b50602082015160018201805460ff92831660ff19909116179055604083015160028301556060830151600383015560808301516004909201805460a0909401519091166101000261ff00199215159290921661ffff1990931692909217179055620002ad565b61048280620030b383390190565b828054620001d89062000270565b90600052602060002090601f016020900481019282620001fc576000855562000247565b82601f106200021757805160ff191683800117855562000247565b8280016001018555821562000247579182015b82811115620002475782518255916020019190600101906200022a565b506200025592915062000259565b5090565b5b808211156200025557600081556001016200025a565b600181811c908216806200028557607f821691505b60208210811415620002a757634e487b7160e01b600052602260045260246000fd5b50919050565b612df680620002bd6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638ae39cac1161010f578063d5a162bd116100a2578063ebb5e18511610071578063ebb5e185146104ac578063f2fde38b146104bf578063f435f5a7146104d2578063f7c618c1146104e557600080fd5b8063d5a162bd14610451578063d8cde1c614610471578063d91114bd14610486578063e4d2620e1461049957600080fd5b806396a38d22116100de57806396a38d2214610406578063b6b55f2514610419578063b9b8af0b1461042c578063bb872b4a1461043e57600080fd5b80638ae39cac146103b75780638da5cb5b146103c05780639003adfe146103d157806394ad5a9d146103da57600080fd5b806342313b5611610187578063715018a611610156578063715018a614610353578063789513ec1461035b5780637fd6f15c1461036e57806385b2d5351461037757600080fd5b806342313b56146102fa5780634e71d92d1461030d57806361d027b31461031557806369fe0e2d1461034057600080fd5b806321b79d98116101c357806321b79d98146102a15780632e1a7d4d146102a95780633166b848146102bc57806331d7a262146102d957600080fd5b8063039af9eb146101f5578063164e68de146102235780631959a002146102385780631a7076291461028e575b600080fd5b610208610203366004612ac4565b6104f8565b60405161021a96959493929190612bc0565b60405180910390f35b61023661023136600461296f565b6105d6565b005b61026e61024636600461296f565b6001602081905260009182526040909120805491810154600282015460039092015490919084565b60408051948552602085019390935291830152606082015260800161021a565b61023661029c36600461298b565b61062e565b6102366106a0565b6102366102b7366004612ac4565b610719565b600d546102c99060ff1681565b604051901515815260200161021a565b6102ec6102e736600461296f565b610789565b60405190815260200161021a565b6102ec610308366004612a3b565b6108e0565b610236610e37565b600554610328906001600160a01b031681565b6040516001600160a01b03909116815260200161021a565b61023661034e366004612ac4565b610f34565b610236610fa5565b6102366103693660046129c3565b611019565b6102ec60065481565b600854600954600a54610392926001600160a01b0316919083565b604080516001600160a01b03909416845260208401929092529082015260600161021a565b6102ec60035481565b6000546001600160a01b0316610328565b6102ec60075481565b6102ec6103e836600461296f565b6001600160a01b031660009081526001602052604090206003015490565b61023661041436600461298b565b611155565b610236610427366004612ac4565b6111c8565b600d546102c990610100900460ff1681565b61023661044c366004612ac4565b61121f565b61046461045f3660046129fb565b6112b0565b60405161021a9190612c3b565b610479611529565b60405161021a9190612b4c565b61023661049436600461296f565b61169a565b6104646104a736600461296f565b61173e565b6102366104ba3660046129fb565b611768565b6102366104cd36600461296f565b611b36565b6102366104e036600461296f565b611c20565b600254610328906001600160a01b031681565b600b818154811061050857600080fd5b906000526020600020906005020160009150905080600001805461052b90612d37565b80601f016020809104026020016040519081016040528092919081815260200182805461055790612d37565b80156105a45780601f10610579576101008083540402835291602001916105a4565b820191906000526020600020905b81548152906001019060200180831161058757829003601f168201915b50505050600183015460028401546003850154600490950154939460ff92831694919350918082169161010090041686565b6000546001600160a01b031633146106095760405162461bcd60e51b815260040161060090612c06565b60405180910390fd5b600754600854610626916001600160a01b03909116908390611d20565b506000600755565b6000546001600160a01b031633146106585760405162461bcd60e51b815260040161060090612c06565b600d805460ff19168215159081179091556040519081527f7414c53e35672e4bc1afd1a4d2b89944ad098746786e452e7ed7a10862d4991b906020015b60405180910390a150565b6000546001600160a01b031633146106ca5760405162461bcd60e51b815260040161060090612c06565b600954156107135760405162461bcd60e51b8152602060048201526016602482015275135a5b9a5b99c8185b1c9958591e481cdd185c9d195960521b6044820152606401610600565b43600955565b600d5460ff16158061073d5750336000908152600160205260409020600301544210155b61077d5760405162461bcd60e51b81526020600482015260116024820152701058d8dbdd5b9d081a5cc81b1bd8dad959607a1b6044820152606401610600565b61078681611d83565b50565b600954600090158061079c575060095443105b156107a957506000919050565b6001600160a01b03828116600090815260016020526040808220600a5460085492516370a0823160e01b8152306004820152919490939216906370a082319060240160206040518083038186803b15801561080357600080fd5b505afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190612adc565b6009549091504311801561084e57508015155b1561089f576003546009546000906108669043612cf4565b905060006108748383612cd5565b905083600454826108859190612cd5565b61088f9190612cb5565b6108999086612c9d565b94505050505b6002830154600184015460045485546108b9908690612cd5565b6108c39190612cb5565b6108cd9190612cf4565b6108d79190612c9d565b95945050505050565b600080546001600160a01b0316331461090b5760405162461bcd60e51b815260040161060090612c06565b61096688888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636e6f6e6560e01b60208201529150611efd9050565b156109b35760405162461bcd60e51b815260206004820152601860248201527f43616e2774206368616e676520276e6f6e6527207469657200000000000000006044820152606401610600565b60005b600b54811015610c9257610aba600b82815481106109e457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016000018054610a0090612d37565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90612d37565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b50505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611efd92505050565b15610c805786600b8281548110610ae157634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010160006101000a81548160ff021916908360ff16021790555085600b8281548110610b2c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002018190555084600b8281548110610b6357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003018190555083600b8281548110610b9a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160040160006101000a81548160ff02191690831515021790555082600b8281548110610be457634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160040160016101000a81548160ff021916908360ff1602179055508888604051610c1d929190612b3c565b6040805191829003822060ff808b168452602084018a905291830188905286151560608401529085166080830152907f28d3dbf163e70097dfe9e97377d4e779a393aa1a56dea94bed77064c59cdc85f9060a00160405180910390a29050610e2c565b80610c8a81612d6c565b9150506109b6565b506040805160e06020601f8b01819004028201810190925260c081018981526000928291908c908c9081908501838280828437600092018290525093855250505060ff808b16602080850191909152604084018b9052606084018a9052881515608085015290871660a090930192909252600b8054600181018255915282518051939450849360059092027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90192610d4f9284929091019061278a565b50602082015160018201805460ff191660ff92831617905560408084015160028401556060840151600384015560808401516004909301805460a09095015161ffff1990951693151561ff00191693909317610100949092169390930217905551610dbd908a908a90612b3c565b6040805191829003822060ff808b168452602084018a905291830188905286151560608401529085166080830152907fa29ba83a53da0ff00e57c500f0d4f30a7d23e7742d36cd3ea4ca8f91567d3e539060a00160405180910390a2600b54610e2890600190612cf4565b9150505b979650505050505050565b336000908152600160205260409020610e4e611f56565b600a54600182015460045483546000929190610e6b908590612cd5565b610e759190612cb5565b610e7f9190612cf4565b90506000811180610e94575060008360020154115b15610f0d57808360020154610ea99190612c9d565b60028401819055600090610ebe903390612099565b60405181815290915033907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a2808460020154610f069190612cf4565b6002850155505b6004548354610f1d908490612cd5565b610f279190612cb5565b8360010181905550505050565b6000546001600160a01b03163314610f5e5760405162461bcd60e51b815260040161060090612c06565b6032811115610fa05760405162461bcd60e51b815260206004820152600e60248201526d46656520697320746f6f2062696760901b6044820152606401610600565b600655565b6000546001600160a01b03163314610fcf5760405162461bcd60e51b815260040161060090612c06565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110435760405162461bcd60e51b815260040161060090612c06565b6002546001600160a01b031615801561106557506008546001600160a01b0316155b6110a85760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881a5cc8185b1c9958591e481cd95d60621b6044820152606401610600565b600280546001600160a01b038481166001600160a01b031992831681179093556040805160608101825285831680825260006020830181905291830182905260088054909516179093556009839055600a9290925560055491516312759a7960e01b8152600481019390935216906312759a7990602401600060405180830381600087803b15801561113957600080fd5b505af115801561114d573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461117f5760405162461bcd60e51b815260040161060090612c06565b600d80548215156101000261ff00199091161790556040517f92333b0b676476985757350034668cb9ee247674ac7a7479de10cd761381f7339061069590831515815260200190565b600d54610100900460ff16156112165760405162461bcd60e51b815260206004820152601360248201527211195c1bdcda5d1cc8185c99481c185d5cd959606a1b6044820152606401610600565b6107868161222b565b6000546001600160a01b031633146112495760405162461bcd60e51b815260040161060090612c06565b600081116112ab5760405162461bcd60e51b815260206004820152602960248201527f5265776172642070657220626c6f636b2073686f756c6420626520677265617460448201526806572207468616e20360bc1b6064820152608401610600565b600355565b6112b861280e565b60005b600b548110156114eb576113bf600b82815481106112e957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001805461130590612d37565b80601f016020809104026020016040519081016040528092919081815260200182805461133190612d37565b801561137e5780601f106113535761010080835404028352916020019161137e565b820191906000526020600020905b81548152906001019060200180831161136157829003601f168201915b505050505085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611efd92505050565b156114d957600b81815481106113e557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060c001604052908160008201805461140e90612d37565b80601f016020809104026020016040519081016040528092919081815260200182805461143a90612d37565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050509183525050600182015460ff9081166020830152600283015460408301526003830154606083015260049092015480831615156080830152610100900490911660a09091015291506115239050565b806114e381612d6c565b9150506112bb565b5060405162461bcd60e51b815260206004820152600c60248201526b27379039bab1b4103a34b2b960a11b6044820152606401610600565b92915050565b600b5460609060009067ffffffffffffffff81111561155857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561158b57816020015b60608152602001906001900390816115765790505b50905060005b600b5481101561169457600b81815481106115bc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160000180546115d890612d37565b80601f016020809104026020016040519081016040528092919081815260200182805461160490612d37565b80156116515780601f1061162657610100808354040283529160200191611651565b820191906000526020600020905b81548152906001019060200180831161163457829003601f168201915b505050505082828151811061167657634e487b7160e01b600052603260045260246000fd5b6020026020010181905250808061168c90612d6c565b915050611591565b50919050565b6000546001600160a01b031633146116c45760405162461bcd60e51b815260040161060090612c06565b6001600160a01b03811661171a5760405162461bcd60e51b815260206004820152601a60248201527f49444f2063616e6e6f74206265207a65726f20616464726573730000000000006044820152606401610600565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b61174661280e565b6001600160a01b0382166000908152600160205260409020546115239061235f565b6000546001600160a01b031633146117925760405162461bcd60e51b815260040161060090612c06565b6117ed82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636e6f6e6560e01b60208201529150611efd9050565b1561183a5760405162461bcd60e51b815260206004820152601860248201527f43616e27742064656c65746520276e6f6e6527207469657200000000000000006044820152606401610600565b60005b600b54811015611b3157611941600b828154811061186b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600001805461188790612d37565b80601f01602080910402602001604051908101604052809291908181526020018280546118b390612d37565b80156119005780601f106118d557610100808354040283529160200191611900565b820191906000526020600020905b8154815290600101906020018083116118e357829003601f168201915b505050505084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611efd92505050565b15611b1f57805b600b5461195790600190612cf4565b811015611a6657600b61196b826001612c9d565b8154811061198957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600b82815481106119b857634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160008201816000019080546119da90612d37565b6119e592919061284c565b50600182810154908201805460ff1990811660ff9384161790915560028085015490840155600380850154908401556004938401805494909301805494831615159185168217815592546101009081900490921690910261ff001990911661ffff199093169290921791909117905580611a5e81612d6c565b915050611948565b50600b805480611a8657634e487b7160e01b600052603160045260246000fd5b60008281526020812060001990920191600583020190611aa682826128c7565b5060018101805460ff191690556000600282018190556003820155600401805461ffff191690559055604051611adf9084908490612b3c565b604051908190038120828252907fcee998486f3d0adcdd2adb0961c0a53c3601b7165798f8f771109a455ba2d8b3906020015b60405180910390a2505050565b80611b2981612d6c565b91505061183d565b505050565b6000546001600160a01b03163314611b605760405162461bcd60e51b815260040161060090612c06565b6001600160a01b038116611bc55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610600565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600c602052604090205460ff16611c745760405162461bcd60e51b81526020600482015260126024820152714f6e6c792049444f732063616e206c6f636b60701b6044820152606401610600565b6001600160a01b03811660009081526001602052604081208054909190611c9a9061235f565b9050806040015160001415611cae57505050565b6000816040015142611cc09190612c9d565b90508083600301541015611d1a5760038301819055604080518281523360208201526001600160a01b038616917f40568d24078f16fec7efe527eb5900acc325ad318cb5d4bd7ad0aa110f4edbba91015b60405180910390a25b50505050565b6040516001600160a01b038316602482015260448101829052611b3190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612481565b3360009081526001602052604090208054821115611de35760405162461bcd60e51b815260206004820152601f60248201527f5769746864726177696e67206d6f7265207468616e20796f75206861766521006044820152606401610600565b611deb611f56565b600a54600182015460045483546000929190611e08908590612cd5565b611e129190612cb5565b611e1c9190612cf4565b90508015611e3a57808360020154611e349190612c9d565b60028401555b8315611eac578254611e4d908590612cf4565b835560065415611e955760006103e860065486611e6a9190612cd5565b611e749190612cb5565b9050611e808186612cf4565b945080600754611e909190612c9d565b600755505b600854611eac906001600160a01b03163386611d20565b6004548354611ebc908490612cd5565b611ec69190612cb5565b600184015560405184815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490602001611d11565b600081604051602001611f109190612b20565b6040516020818303038152906040528051906020012083604051602001611f379190612b20565b6040516020818303038152906040528051906020012014905092915050565b60095415801590611f6957506009544310155b611fae5760405162461bcd60e51b8152602060048201526016602482015275135a5b9a5b99c81b9bdd081e595d081cdd185c9d195960521b6044820152606401610600565b6009544311611fb957565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611ffd57600080fd5b505afa158015612011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120359190612adc565b905080612043575043600955565b6009546000906120539043612cf4565b90506000600354826120659190612cd5565b905082600454826120769190612cd5565b6120809190612cb5565b600a5461208d9190612c9d565b600a5550504360095550565b6002546005546040516370a0823160e01b81526001600160a01b039182166004820152600092839216906370a082319060240160206040518083038186803b1580156120e457600080fd5b505afa1580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190612adc565b90506000831161217a5760405162461bcd60e51b8152602060048201526024808201527f52657761726420616d6f756e74206d757374206265206d6f7265207468616e206044820152637a65726f60e01b6064820152608401610600565b600081116121d85760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f7567682072657761726420746f6b656e7320666f72207472616044820152643739b332b960d91b6064820152608401610600565b80831115612205576005546002546121fe916001600160a01b0391821691168684612553565b9050611523565b600554600254612223916001600160a01b0391821691168686612553565b509092915050565b336000908152600160205260409020612242611f56565b600a5481541561229a57600082600101546004548385600001546122669190612cd5565b6122709190612cb5565b61227a9190612cf4565b90508015612298578083600201546122929190612c9d565b60028401555b505b821561230e576008546122b8906001600160a01b0316333086612553565b600654156122fe5760006103e8600654856122d39190612cd5565b6122dd9190612cb5565b90506122e98185612cf4565b9350806007546122f99190612c9d565b600755505b815461230b908490612c9d565b82555b600454825461231e908390612cd5565b6123289190612cb5565b600183015560405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b12565b61236761280e565b600b6123728361258b565b8154811061239057634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060c00160405290816000820180546123b990612d37565b80601f01602080910402602001604051908101604052809291908181526020018280546123e590612d37565b80156124325780601f1061240757610100808354040283529160200191612432565b820191906000526020600020905b81548152906001019060200180831161241557829003601f168201915b5050509183525050600182015460ff9081166020830152600283015460408301526003830154606083015260049092015480831615156080830152610100900490911660a09091015292915050565b60006124d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126209092919063ffffffff16565b805190915015611b3157808060200190518101906124f491906129a7565b611b315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610600565b6040516001600160a01b0380851660248301528316604482015260648101829052611d1a9085906323b872dd60e01b90608401611d4c565b60008161259a57506000919050565b60008060015b600b54811015612617576000600b82815481106125cd57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502019050806003015486101580156125f45750828160030154115b1561260457819350806003015492505b508061260f81612d6c565b9150506125a0565b50909392505050565b606061262f8484600085612639565b90505b9392505050565b60608247101561269a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610600565b843b6126e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610600565b600080866001600160a01b031685876040516127049190612b20565b60006040518083038185875af1925050503d8060008114612741576040519150601f19603f3d011682016040523d82523d6000602084013e612746565b606091505b5091509150610e2c82828660608315612760575081612632565b8251156127705782518084602001fd5b8160405162461bcd60e51b81526004016106009190612bad565b82805461279690612d37565b90600052602060002090601f0160209004810192826127b857600085556127fe565b82601f106127d157805160ff19168380011785556127fe565b828001600101855582156127fe579182015b828111156127fe5782518255916020019190600101906127e3565b5061280a9291506128fd565b5090565b6040518060c0016040528060608152602001600060ff1681526020016000815260200160008152602001600015158152602001600060ff1681525090565b82805461285890612d37565b90600052602060002090601f01602090048101928261287a57600085556127fe565b82601f1061288b57805485556127fe565b828001600101855582156127fe57600052602060002091601f016020900482015b828111156127fe5782548255916001019190600101906128ac565b5080546128d390612d37565b6000825580601f106128e3575050565b601f01602090049060005260206000209081019061078691905b5b8082111561280a57600081556001016128fe565b60008083601f840112612923578182fd5b50813567ffffffffffffffff81111561293a578182fd5b60208301915083602082850101111561295257600080fd5b9250929050565b803560ff8116811461296a57600080fd5b919050565b600060208284031215612980578081fd5b813561263281612d9d565b60006020828403121561299c578081fd5b813561263281612db2565b6000602082840312156129b8578081fd5b815161263281612db2565b600080604083850312156129d5578081fd5b82356129e081612d9d565b915060208301356129f081612d9d565b809150509250929050565b60008060208385031215612a0d578182fd5b823567ffffffffffffffff811115612a23578283fd5b612a2f85828601612912565b90969095509350505050565b600080600080600080600060c0888a031215612a55578283fd5b873567ffffffffffffffff811115612a6b578384fd5b612a778a828b01612912565b9098509650612a8a905060208901612959565b945060408801359350606088013592506080880135612aa881612db2565b9150612ab660a08901612959565b905092959891949750929550565b600060208284031215612ad5578081fd5b5035919050565b600060208284031215612aed578081fd5b5051919050565b60008151808452612b0c816020860160208601612d0b565b601f01601f19169290920160200192915050565b60008251612b32818460208701612d0b565b9190910192915050565b8183823760009101908152919050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b82811015612ba057603f19888603018452612b8e858351612af4565b94509285019290850190600101612b72565b5092979650505050505050565b6020815260006126326020830184612af4565b60c081526000612bd360c0830189612af4565b905060ff87166020830152856040830152846060830152831515608083015260ff831660a0830152979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602081526000825160c06020840152612c5760e0840182612af4565b905060ff602085015116604084015260408401516060840152606084015160808401526080840151151560a084015260ff60a08501511660c08401528091505092915050565b60008219821115612cb057612cb0612d87565b500190565b600082612cd057634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612cef57612cef612d87565b500290565b600082821015612d0657612d06612d87565b500390565b60005b83811015612d26578181015183820152602001612d0e565b83811115611d1a5750506000910152565b600181811c90821680612d4b57607f821691505b6020821081141561169457634e487b7160e01b600052602260045260246000fd5b6000600019821415612d8057612d80612d87565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461078657600080fd5b801515811461078657600080fdfea2646970667358221220873d40f8371b6477ba30ab1618539cad3a5456c4340b36edb5a71cee8dfcadcb64736f6c63430008040033608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610421806100616000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806312759a7914610051578063715018a6146100665780638da5cb5b1461006e578063f2fde38b1461008d575b600080fd5b61006461005f36600461033f565b6100a0565b005b6100646101e1565b600054604080516001600160a01b039092168252519081900360200190f35b61006461009b36600461033f565b610255565b6000546001600160a01b031633146100d35760405162461bcd60e51b81526004016100ca9061039e565b60405180910390fd5b806001600160a01b031663095ea7b3306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561011b57600080fd5b505afa15801561012f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101539190610362565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526a52b7d2dcc80cd2e40000006024820152604401602060405180830381600087803b1580156101a557600080fd5b505af11580156101b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101dd919061037e565b5050565b6000546001600160a01b0316331461020b5760405162461bcd60e51b81526004016100ca9061039e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461027f5760405162461bcd60e51b81526004016100ca9061039e565b6001600160a01b0381166102e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ca565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060208284031215610350578081fd5b813561035b816103d3565b9392505050565b600060208284031215610373578081fd5b815161035b816103d3565b60006020828403121561038f578081fd5b8151801515811461035b578182fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6001600160a01b03811681146103e857600080fd5b5056fea2646970667358221220a6c48ddd7283e8dabb7d3818b1b6676425de649c2683e39d385c3b1d7f37001364736f6c63430008040033

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.