false
false
0
Contract Address Details
contract

0xE9454db62323D7A36b3C3444fAbb264d2c37b1Cf

Sponsored: OIL, is a blockchain-based, algorithmically pegged to the real-time price of one barrel of Brent crude oil. It serves as a store of value for global energy trade and investment activities. 

Overview

OIL Balance

0 OIL ( )

OIL Value

$0.00

Token Holdings

Fetching tokens...

More Info

Private Name Tags

Last Balance Update

Blocks Validated

Sponsored

Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
OILStake




Optimization enabled
true
Compiler version
v0.8.6+commit.11564f7e




Optimization runs
200
EVM Version
default




Verified at
2025-08-21T08:23:09.639825Z

Constructor Arguments

0x000000000000000000000000fc32358335ce47788f1f2fc45a53fb53268aad980000000000000000000000009ca7e919c78e5d0d99b395dfb524efcef40ad2d00000000000000000000000009ca7e919c78e5d0d99b395dfb524efcef40ad2d0

Arg [0] (address) : 0xfc32358335ce47788f1f2fc45a53fb53268aad98
Arg [1] (address) : 0x9ca7e919c78e5d0d99b395dfb524efcef40ad2d0
Arg [2] (address) : 0x9ca7e919c78e5d0d99b395dfb524efcef40ad2d0

              

contracts/Stakingv2.sol

Sol2uml
new
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.6;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external;

    function transfer(address to, uint256 value) external;

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external;
}

contract OILStake {
    using SafeMath for uint256;
    IERC20 public stakeToken;
    IERC20 public rewardToken;
    IERC20 public token3;

    address payable public owner;

    uint256 public maxStakeableToken;
    uint256 public minimumStakeToken;
    uint256 public totalUnStakedToken;
    uint256 public totalStakedToken;
    uint256 public totalClaimedRewardToken;
    uint256 public totalStakers;
    uint256 public percentDivider;
    uint256 public totalFee;

    //STAKING DURATION
    uint256[4] public Duration = [30 days, 90 days, 180 days, 360 days];

    //APY BONUS IN PERCENTAGE 
    uint256[4] public Bonus = [5, 15, 30, 60];

    struct Stake {
        uint256 unstaketime;
        uint256 staketime;
        uint256 amount;
        uint256 rewardTokenAmount;
        uint256 reward;
        uint256 lastharvesttime;
        uint256 remainingreward;
        uint256 harvestreward;
        uint256 persecondreward;
        bool withdrawan;
        bool unstaked;
    }

    struct User {
        uint256 totalStakedTokenUser;
        uint256 totalUnstakedTokenUser;
        uint256 totalClaimedRewardTokenUser;
        uint256 stakeCount;
        bool alreadyExists;
    }

    mapping(address => User) public Stakers;
    mapping(uint256 => address) public StakersID;
    mapping(address => mapping(uint256 => Stake)) public stakersRecord;
    event STAKE(address Staker, uint256 amount);
    event HARVEST(address Staker, uint256 amount);
    event UNSTAKE(address Staker, uint256 amount);



    modifier onlyowner() {
        require(owner == msg.sender, "only owner");
        _;
    }

    constructor(address payable _owner, address token1, address token2) {
        owner = _owner;
        stakeToken = IERC20(token1);
        rewardToken = IERC20(token2);
        totalFee = 150;
        maxStakeableToken = 1e23;
        percentDivider = 10000;
        minimumStakeToken = 1e15;
    }

    function stake(uint256 amount1, uint256 timeperiod) public {
        require(timeperiod >= 0 && timeperiod <= 3, "Invalid Time Period");
        require(amount1 >= minimumStakeToken, "stake more than minimum amount");
        uint256 TKNVAL = getPriceinUSD();
        uint256 amount = amount1.sub((amount1.mul(totalFee)).div(percentDivider));
        uint256 rewardtokenPrice = (amount.mul(TKNVAL)).div(1e9);
        if (!Stakers[msg.sender].alreadyExists) {
            Stakers[msg.sender].alreadyExists = true;
            StakersID[totalStakers] = msg.sender;
            totalStakers++;
        }

        stakeToken.transferFrom(msg.sender, address(this), amount1);

        uint256 index = Stakers[msg.sender].stakeCount;
        Stakers[msg.sender].totalStakedTokenUser = Stakers[msg.sender]
            .totalStakedTokenUser
            .add(amount);
        totalStakedToken = totalStakedToken.add(amount);
        stakersRecord[msg.sender][index].unstaketime = block.timestamp.add(
            Duration[timeperiod]
        );
        stakersRecord[msg.sender][index].staketime = block.timestamp;
        stakersRecord[msg.sender][index].amount = amount;
        stakersRecord[msg.sender][index].reward = rewardtokenPrice
            .mul(Bonus[timeperiod])
            .div(percentDivider);
        stakersRecord[msg.sender][index].persecondreward = stakersRecord[
            msg.sender
        ][index].reward.div(Duration[timeperiod]);

        stakersRecord[msg.sender][index].rewardTokenAmount = rewardtokenPrice;
        stakersRecord[msg.sender][index].lastharvesttime = 0;
        stakersRecord[msg.sender][index].remainingreward = stakersRecord[msg.sender][index].reward;
        stakersRecord[msg.sender][index].harvestreward = 0;
        Stakers[msg.sender].stakeCount++;

        emit STAKE(msg.sender, amount);
    }

    function unstake(uint256 index) public {
        require(!stakersRecord[msg.sender][index].unstaked, "already unstaked");
        require(
            stakersRecord[msg.sender][index].unstaketime < block.timestamp,
            "cannot unstake after before duration"
        );

        if(!stakersRecord[msg.sender][index].withdrawan){
            harvest(index);
        }
        stakersRecord[msg.sender][index].unstaked = true;

        stakeToken.transfer(
            msg.sender,
            stakersRecord[msg.sender][index].amount
        );
        
        totalUnStakedToken = totalUnStakedToken.add(
            stakersRecord[msg.sender][index].amount
        );
        Stakers[msg.sender].totalUnstakedTokenUser = Stakers[msg.sender]
            .totalUnstakedTokenUser
            .add(stakersRecord[msg.sender][index].amount);

        emit UNSTAKE(
            msg.sender,
            stakersRecord[msg.sender][index].amount
        );
    }

    function harvest(uint256 index) public {
        require(
            !stakersRecord[msg.sender][index].withdrawan,
            "already withdrawan"
        );
        require(!stakersRecord[msg.sender][index].unstaked, "already unstaked");
        uint256 rewardTillNow;
        uint256 commontimestamp;
        (rewardTillNow,commontimestamp) = realtimeRewardPerBlock(msg.sender , index);
        stakersRecord[msg.sender][index].lastharvesttime =  commontimestamp;
        rewardToken.transfer(
            msg.sender,
            rewardTillNow
        );
        totalClaimedRewardToken = totalClaimedRewardToken.add(
            rewardTillNow
        );
        stakersRecord[msg.sender][index].remainingreward = stakersRecord[msg.sender][index].remainingreward.sub(rewardTillNow);
        stakersRecord[msg.sender][index].harvestreward = stakersRecord[msg.sender][index].harvestreward.add(rewardTillNow);
        Stakers[msg.sender].totalClaimedRewardTokenUser = Stakers[msg.sender]
            .totalClaimedRewardTokenUser
            .add(rewardTillNow);

        if(stakersRecord[msg.sender][index].harvestreward == stakersRecord[msg.sender][index].reward){
            stakersRecord[msg.sender][index].withdrawan = true;

        }

        emit HARVEST(
            msg.sender,
            rewardTillNow
        );
    }

    function getPriceinUSD() public pure returns (uint256){
        uint256 TKNUSDVAL = 1000000000;
        return TKNUSDVAL;
    }

    function realtimeRewardPerBlock(address user, uint256 blockno) public view returns (uint256,uint256) {
        uint256 ret;
        uint256 commontimestamp;
            if (
                !stakersRecord[user][blockno].withdrawan &&
                !stakersRecord[user][blockno].unstaked
            ) {
                uint256 val;
                uint256 tempharvesttime = stakersRecord[user][blockno].lastharvesttime;
                commontimestamp = block.timestamp;
                if(tempharvesttime == 0){
                    tempharvesttime = stakersRecord[user][blockno].staketime;
                }
                val = commontimestamp - tempharvesttime;
                val = val.mul(stakersRecord[user][blockno].persecondreward);
                if (val < stakersRecord[user][blockno].remainingreward) {
                    ret += val;
                } else {
                    ret += stakersRecord[user][blockno].remainingreward;
                }
            }
        return (ret,commontimestamp);
    }

    function realtimeReward(address user) public view returns (uint256) {
        uint256 ret;
        for (uint256 i; i < Stakers[user].stakeCount; i++) {
            if (
                !stakersRecord[user][i].withdrawan &&
                !stakersRecord[user][i].unstaked
            ) {
                uint256 val;
                val = block.timestamp - stakersRecord[user][i].staketime;
                val = val.mul(stakersRecord[user][i].persecondreward);
                if (val < stakersRecord[user][i].reward) {
                    ret += val;
                } else {
                    ret += stakersRecord[user][i].reward;
                }
            }
        }
        return ret;
    }


    function SetStakeLimits(uint256 _min, uint256 _max) external onlyowner {
        minimumStakeToken = _min;
        maxStakeableToken = _max;
    }
    function SetTotalFees(uint256 _fee) external onlyowner {
        totalFee = _fee;
    }

    function SetStakeDuration(
        uint256 first,
        uint256 second,
        uint256 third,
        uint256 fourth
    ) external onlyowner {
        Duration[0] = first;
        Duration[1] = second;
        Duration[2] = third;
        Duration[3] = fourth;
    }

    function SetStakeBonus(
        uint256 first,
        uint256 second,
        uint256 third,
        uint256 fourth
    ) external onlyowner {
        Bonus[0] = first;
        Bonus[1] = second;
        Bonus[2] = third;
        Bonus[3] = fourth;
    }


    function withdrawOIL() public onlyowner {
        uint256 balance = address(this).balance;
        require(balance > 0, "does not have any balance");
        payable(msg.sender).transfer(balance);
    }

    function initToken(address addr) public onlyowner{
        token3 = IERC20(addr);
    }
    function withdrawToken(uint256 amount) public onlyowner {
        token3.transfer(msg.sender
        , amount);
    }
    function transferOwnership(address payable newOwner) public onlyowner {
        require(newOwner != address(0), "New owner should not be the zero address");
        owner = newOwner;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
        

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address payable"},{"type":"address","name":"token1","internalType":"address"},{"type":"address","name":"token2","internalType":"address"}]},{"type":"event","name":"HARVEST","inputs":[{"type":"address","name":"Staker","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"STAKE","inputs":[{"type":"address","name":"Staker","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UNSTAKE","inputs":[{"type":"address","name":"Staker","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Bonus","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Duration","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetStakeBonus","inputs":[{"type":"uint256","name":"first","internalType":"uint256"},{"type":"uint256","name":"second","internalType":"uint256"},{"type":"uint256","name":"third","internalType":"uint256"},{"type":"uint256","name":"fourth","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetStakeDuration","inputs":[{"type":"uint256","name":"first","internalType":"uint256"},{"type":"uint256","name":"second","internalType":"uint256"},{"type":"uint256","name":"third","internalType":"uint256"},{"type":"uint256","name":"fourth","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetStakeLimits","inputs":[{"type":"uint256","name":"_min","internalType":"uint256"},{"type":"uint256","name":"_max","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetTotalFees","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalStakedTokenUser","internalType":"uint256"},{"type":"uint256","name":"totalUnstakedTokenUser","internalType":"uint256"},{"type":"uint256","name":"totalClaimedRewardTokenUser","internalType":"uint256"},{"type":"uint256","name":"stakeCount","internalType":"uint256"},{"type":"bool","name":"alreadyExists","internalType":"bool"}],"name":"Stakers","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"StakersID","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPriceinUSD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initToken","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxStakeableToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minimumStakeToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"percentDivider","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"realtimeReward","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"realtimeRewardPerBlock","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"blockno","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"rewardToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"amount1","internalType":"uint256"},{"type":"uint256","name":"timeperiod","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stakeToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"unstaketime","internalType":"uint256"},{"type":"uint256","name":"staketime","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardTokenAmount","internalType":"uint256"},{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"lastharvesttime","internalType":"uint256"},{"type":"uint256","name":"remainingreward","internalType":"uint256"},{"type":"uint256","name":"harvestreward","internalType":"uint256"},{"type":"uint256","name":"persecondreward","internalType":"uint256"},{"type":"bool","name":"withdrawan","internalType":"bool"},{"type":"bool","name":"unstaked","internalType":"bool"}],"name":"stakersRecord","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"token3","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalClaimedRewardToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalStakedToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalStakers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalUnStakedToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawOIL","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]}]
              

Contract Creation Code

0x61010060405262278d0060809081526276a70060a05262ed4e0060c0526301da9c0060e0526200003490600c90600462000102565b506040805160808101825260058152600f6020820152601e91810191909152603c60608201526200006a9060109060046200014d565b503480156200007857600080fd5b5060405162001a3138038062001a318339810160408190526200009b916200019a565b600380546001600160a01b039485166001600160a01b0319918216179091556000805493851693821693909317909255600180549190931691161790556096600b5569152d02c7e14af6800000600455612710600a5566038d7ea4c6800060055562000207565b82600481019282156200013b579160200282015b828111156200013b578251829063ffffffff1690559160200191906001019062000116565b506200014992915062000183565b5090565b82600481019282156200013b579160200282015b828111156200013b578251829060ff1690559160200191906001019062000161565b5b8082111562000149576000815560010162000184565b600080600060608486031215620001b057600080fd5b8351620001bd81620001ee565b6020850151909350620001d081620001ee565b6040850151909250620001e381620001ee565b809150509250925092565b6001600160a01b03811681146200020457600080fd5b50565b61181a80620002176000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80639d9240b61161010f578063ddc63262116100a2578063f2fde38b11610071578063f2fde38b146104e5578063f7c618c1146104f8578063f8eb741a1461050b578063fe6f1b051461053357600080fd5b8063ddc6326214610442578063df4d17dc14610455578063ede85eb714610468578063ef14101e146104d257600080fd5b8063c73174bf116100de578063c73174bf1461040a578063cb6d8ee61461041d578063d287de4e14610426578063da04197e1461042f57600080fd5b80639d9240b6146103dd578063b067354d146103e5578063b6cfb9aa146103ee578063c03728381461040157600080fd5b80636356cdac11610187578063869890381161015657806386989038146102eb5780638da5cb5b146102f45780639502ddfd146103075780639845db701461031057600080fd5b80636356cdac14610289578063649493571461029c5780637a6346e7146102c55780637b0472f0146102d857600080fd5b80634543a17c116101c35780634543a17c1461022e57806350baa6221461024157806351ed6a30146102545780635faf30ad1461027f57600080fd5b80630db192e8146101ea5780631df4ccfc146102105780632e17de7814610219575b600080fd5b6101fd6101f83660046115e6565b61053c565b6040519081526020015b60405180910390f35b6101fd600b5481565b61022c61022736600461162f565b6106c4565b005b61022c61023c366004611648565b61092b565b61022c61024f36600461162f565b610960565b600054610267906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b633b9aca006101fd565b6101fd61029736600461162f565b6109f1565b6102676102aa36600461162f565b6015602052600090815260409020546001600160a01b031681565b61022c6102d336600461166a565b610a08565b61022c6102e6366004611648565b610a4e565b6101fd60095481565b600354610267906001600160a01b031681565b6101fd60055481565b61038661031e366004611603565b601660209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901549798969795969495939492939192909160ff808216916101009004168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526101008401521515610120830152151561014082015261016001610207565b61022c610dbe565b6101fd60045481565b61022c6103fc36600461162f565b610e67565b6101fd60085481565b61022c61041836600461166a565b610e96565b6101fd60075481565b6101fd60065481565b6101fd61043d36600461162f565b610ed8565b61022c61045036600461162f565b610ee8565b61022c6104633660046115e6565b61118a565b6104a86104763660046115e6565b601460205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a001610207565b600254610267906001600160a01b031681565b61022c6104f33660046115e6565b6111d6565b600154610267906001600160a01b031681565b61051e610519366004611603565b611289565b60408051928352602083019190915201610207565b6101fd600a5481565b60008060005b6001600160a01b0384166000908152601460205260409020600301548110156106bd576001600160a01b038416600090815260166020908152604080832084845290915290206009015460ff161580156105c857506001600160a01b0384166000908152601660209081526040808320848452909152902060090154610100900460ff16155b156106ab576001600160a01b03841660009081526016602090815260408083208484529091528120600101546105fe904261176e565b6001600160a01b0386166000908152601660209081526040808320868452909152902060080154909150610633908290611413565b6001600160a01b03861660009081526016602090815260408083208684529091529020600401549091508110156106755761066e8184611715565b92506106a9565b6001600160a01b03851660009081526016602090815260408083208584529091529020600401546106a69084611715565b92505b505b806106b581611785565b915050610542565b5092915050565b336000908152601660209081526040808320848452909152902060090154610100900460ff161561072f5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b60448201526064015b60405180910390fd5b33600090815260166020908152604080832084845290915290205442116107a45760405162461bcd60e51b8152602060048201526024808201527f63616e6e6f7420756e7374616b65206166746572206265666f726520647572616044820152633a34b7b760e11b6064820152608401610726565b33600090815260166020908152604080832084845290915290206009015460ff166107d2576107d281610ee8565b33600081815260166020908152604080832085845290915280822060098101805461ff0019166101001790559154600290920154905163a9059cbb60e01b8152600481019390935260248301526001600160a01b03169063a9059cbb90604401600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b505033600090815260166020908152604080832086845290915290206002015460065461088f9350915061149b565b60065533600081815260166020908152604080832085845282528083206002015493835260149091529020600101546108c79161149b565b3360008181526014602090815260408083206001019490945560168152838220858352815290839020600201548351928352908201527fdd932dbf4936c18597ed8cf0290c4866ee0974179a6a475acd677b06bec81c60910160405180910390a150565b6003546001600160a01b031633146109555760405162461bcd60e51b8152600401610726906116f1565b600591909155600455565b6003546001600160a01b0316331461098a5760405162461bcd60e51b8152600401610726906116f1565b60025460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401600060405180830381600087803b1580156109d657600080fd5b505af11580156109ea573d6000803e3d6000fd5b5050505050565b60108160048110610a0157600080fd5b0154905081565b6003546001600160a01b03163314610a325760405162461bcd60e51b8152600401610726906116f1565b600c848155600d849055600e839055819060035b015550505050565b6003811115610a955760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908151a5b594814195c9a5bd9606a1b6044820152606401610726565b600554821015610ae75760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206d6f7265207468616e206d696e696d756d20616d6f756e7400006044820152606401610726565b6000633b9aca0090506000610b1d610b16600a54610b10600b548861141390919063ffffffff16565b906114fa565b859061153c565b90506000610b33633b9aca00610b108486611413565b3360009081526014602052604090206004015490915060ff16610ba257336000818152601460209081526040808320600401805460ff191660011790556009805484526015909252822080546001600160a01b03191690931790925581549190610b9c83611785565b91905055505b6000546040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610bf457600080fd5b505af1158015610c08573d6000803e3d6000fd5b505033600090815260146020526040902060038101549054909250610c2e91508461149b565b33600090815260146020526040902055600754610c4b908461149b565b600755610c6d600c8660048110610c6457610c646117b6565b0154429061149b565b3360009081526016602090815260408083208584529091529020908155426001820155600201839055600a54610cbc90610b1060108860048110610cb357610cb36117b6565b01548590611413565b3360009081526016602090815260408083208584529091529020600490810191909155610d1c90600c9087908110610cf657610cf66117b6565b0154336000908152601660209081526040808320868452909152902060040154906114fa565b3360008181526016602090815260408083208684528252808320600881019590955560038086018890556005860184905560048601546006870155600790950183905592825260149052908120909101805491610d7883611785565b909155505060408051338152602081018590527fa4e109bb7f03a3cbe671105ffecfc362319eaa88ecaf35997a4d3a2328d66d6c910160405180910390a1505050505050565b6003546001600160a01b03163314610de85760405162461bcd60e51b8152600401610726906116f1565b4780610e365760405162461bcd60e51b815260206004820152601960248201527f646f6573206e6f74206861766520616e792062616c616e6365000000000000006044820152606401610726565b604051339082156108fc029083906000818181858888f19350505050158015610e63573d6000803e3d6000fd5b5050565b6003546001600160a01b03163314610e915760405162461bcd60e51b8152600401610726906116f1565b600b55565b6003546001600160a01b03163314610ec05760405162461bcd60e51b8152600401610726906116f1565b60108481556011849055601283905581906003610a46565b600c8160048110610a0157600080fd5b33600090815260166020908152604080832084845290915290206009015460ff1615610f4b5760405162461bcd60e51b815260206004820152601260248201527130b63932b0b23c903bb4ba34323930bbb0b760711b6044820152606401610726565b336000908152601660209081526040808320848452909152902060090154610100900460ff1615610fb15760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610726565b600080610fbe3384611289565b33600081815260166020908152604080832089845290915290819020600501839055600154905163a9059cbb60e01b81526004810192909252602482018490529294509092506001600160a01b039091169063a9059cbb90604401600060405180830381600087803b15801561103357600080fd5b505af1158015611047573d6000803e3d6000fd5b5050600854611059925090508361149b565b600855336000908152601660209081526040808320868452909152902060060154611084908361153c565b33600090815260166020908152604080832087845290915290206006810191909155600701546110b4908361149b565b336000818152601660209081526040808320888452825280832060070194909455918152601490915220600201546110ec908361149b565b33600090815260146020908152604080832060020193909355601681528282208683529052206004810154600790910154141561114c573360009081526016602090815260408083208684529091529020600901805460ff191660011790555b60408051338152602081018490527ffb9432fa1fa7e0db773769fb77b5f241e9eb4987776725d22c900b3949b38e97910160405180910390a1505050565b6003546001600160a01b031633146111b45760405162461bcd60e51b8152600401610726906116f1565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031633146112005760405162461bcd60e51b8152600401610726906116f1565b6001600160a01b0381166112675760405162461bcd60e51b815260206004820152602860248201527f4e6577206f776e65722073686f756c64206e6f7420626520746865207a65726f604482015267206164647265737360c01b6064820152608401610726565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216600090815260166020908152604080832084845290915281206009015481908190819060ff161580156112f257506001600160a01b0386166000908152601660209081526040808320888452909152902060090154610100900460ff16155b1561140857506001600160a01b03851660009081526016602090815260408083208784529091528120600501544291908061135057506001600160a01b03871660009081526016602090815260408083208984529091529020600101545b61135a818461176e565b6001600160a01b03891660009081526016602090815260408083208b845290915290206008015490925061138f908390611413565b6001600160a01b03891660009081526016602090815260408083208b84529091529020600601549092508210156113d1576113ca8285611715565b9350611405565b6001600160a01b03881660009081526016602090815260408083208a84529091529020600601546114029085611715565b93505b50505b909590945092505050565b60008261142257506000611495565b600061142e838561174f565b90508261143b858361172d565b146114925760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610726565b90505b92915050565b6000806114a88385611715565b9050838110156114925760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610726565b600061149283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061157e565b600061149283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115b5565b6000818361159f5760405162461bcd60e51b8152600401610726919061169c565b5060006115ac848661172d565b95945050505050565b600081848411156115d95760405162461bcd60e51b8152600401610726919061169c565b5060006115ac848661176e565b6000602082840312156115f857600080fd5b8135611492816117cc565b6000806040838503121561161657600080fd5b8235611621816117cc565b946020939093013593505050565b60006020828403121561164157600080fd5b5035919050565b6000806040838503121561165b57600080fd5b50508035926020909101359150565b6000806000806080858703121561168057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b818110156116c9578581018301518582016040015282016116ad565b818111156116db576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b60008219821115611728576117286117a0565b500190565b60008261174a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611769576117696117a0565b500290565b600082821015611780576117806117a0565b500390565b6000600019821415611799576117996117a0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117e157600080fd5b5056fea264697066735822122043b18f7fad2567542ffe27689acb38cdd2609c54efeba0d74f12c97860bfd02064736f6c63430008060033000000000000000000000000fc32358335ce47788f1f2fc45a53fb53268aad980000000000000000000000009ca7e919c78e5d0d99b395dfb524efcef40ad2d00000000000000000000000009ca7e919c78e5d0d99b395dfb524efcef40ad2d0

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80639d9240b61161010f578063ddc63262116100a2578063f2fde38b11610071578063f2fde38b146104e5578063f7c618c1146104f8578063f8eb741a1461050b578063fe6f1b051461053357600080fd5b8063ddc6326214610442578063df4d17dc14610455578063ede85eb714610468578063ef14101e146104d257600080fd5b8063c73174bf116100de578063c73174bf1461040a578063cb6d8ee61461041d578063d287de4e14610426578063da04197e1461042f57600080fd5b80639d9240b6146103dd578063b067354d146103e5578063b6cfb9aa146103ee578063c03728381461040157600080fd5b80636356cdac11610187578063869890381161015657806386989038146102eb5780638da5cb5b146102f45780639502ddfd146103075780639845db701461031057600080fd5b80636356cdac14610289578063649493571461029c5780637a6346e7146102c55780637b0472f0146102d857600080fd5b80634543a17c116101c35780634543a17c1461022e57806350baa6221461024157806351ed6a30146102545780635faf30ad1461027f57600080fd5b80630db192e8146101ea5780631df4ccfc146102105780632e17de7814610219575b600080fd5b6101fd6101f83660046115e6565b61053c565b6040519081526020015b60405180910390f35b6101fd600b5481565b61022c61022736600461162f565b6106c4565b005b61022c61023c366004611648565b61092b565b61022c61024f36600461162f565b610960565b600054610267906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b633b9aca006101fd565b6101fd61029736600461162f565b6109f1565b6102676102aa36600461162f565b6015602052600090815260409020546001600160a01b031681565b61022c6102d336600461166a565b610a08565b61022c6102e6366004611648565b610a4e565b6101fd60095481565b600354610267906001600160a01b031681565b6101fd60055481565b61038661031e366004611603565b601660209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901549798969795969495939492939192909160ff808216916101009004168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526101008401521515610120830152151561014082015261016001610207565b61022c610dbe565b6101fd60045481565b61022c6103fc36600461162f565b610e67565b6101fd60085481565b61022c61041836600461166a565b610e96565b6101fd60075481565b6101fd60065481565b6101fd61043d36600461162f565b610ed8565b61022c61045036600461162f565b610ee8565b61022c6104633660046115e6565b61118a565b6104a86104763660046115e6565b601460205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a001610207565b600254610267906001600160a01b031681565b61022c6104f33660046115e6565b6111d6565b600154610267906001600160a01b031681565b61051e610519366004611603565b611289565b60408051928352602083019190915201610207565b6101fd600a5481565b60008060005b6001600160a01b0384166000908152601460205260409020600301548110156106bd576001600160a01b038416600090815260166020908152604080832084845290915290206009015460ff161580156105c857506001600160a01b0384166000908152601660209081526040808320848452909152902060090154610100900460ff16155b156106ab576001600160a01b03841660009081526016602090815260408083208484529091528120600101546105fe904261176e565b6001600160a01b0386166000908152601660209081526040808320868452909152902060080154909150610633908290611413565b6001600160a01b03861660009081526016602090815260408083208684529091529020600401549091508110156106755761066e8184611715565b92506106a9565b6001600160a01b03851660009081526016602090815260408083208584529091529020600401546106a69084611715565b92505b505b806106b581611785565b915050610542565b5092915050565b336000908152601660209081526040808320848452909152902060090154610100900460ff161561072f5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b60448201526064015b60405180910390fd5b33600090815260166020908152604080832084845290915290205442116107a45760405162461bcd60e51b8152602060048201526024808201527f63616e6e6f7420756e7374616b65206166746572206265666f726520647572616044820152633a34b7b760e11b6064820152608401610726565b33600090815260166020908152604080832084845290915290206009015460ff166107d2576107d281610ee8565b33600081815260166020908152604080832085845290915280822060098101805461ff0019166101001790559154600290920154905163a9059cbb60e01b8152600481019390935260248301526001600160a01b03169063a9059cbb90604401600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b505033600090815260166020908152604080832086845290915290206002015460065461088f9350915061149b565b60065533600081815260166020908152604080832085845282528083206002015493835260149091529020600101546108c79161149b565b3360008181526014602090815260408083206001019490945560168152838220858352815290839020600201548351928352908201527fdd932dbf4936c18597ed8cf0290c4866ee0974179a6a475acd677b06bec81c60910160405180910390a150565b6003546001600160a01b031633146109555760405162461bcd60e51b8152600401610726906116f1565b600591909155600455565b6003546001600160a01b0316331461098a5760405162461bcd60e51b8152600401610726906116f1565b60025460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401600060405180830381600087803b1580156109d657600080fd5b505af11580156109ea573d6000803e3d6000fd5b5050505050565b60108160048110610a0157600080fd5b0154905081565b6003546001600160a01b03163314610a325760405162461bcd60e51b8152600401610726906116f1565b600c848155600d849055600e839055819060035b015550505050565b6003811115610a955760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908151a5b594814195c9a5bd9606a1b6044820152606401610726565b600554821015610ae75760405162461bcd60e51b815260206004820152601e60248201527f7374616b65206d6f7265207468616e206d696e696d756d20616d6f756e7400006044820152606401610726565b6000633b9aca0090506000610b1d610b16600a54610b10600b548861141390919063ffffffff16565b906114fa565b859061153c565b90506000610b33633b9aca00610b108486611413565b3360009081526014602052604090206004015490915060ff16610ba257336000818152601460209081526040808320600401805460ff191660011790556009805484526015909252822080546001600160a01b03191690931790925581549190610b9c83611785565b91905055505b6000546040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd90606401600060405180830381600087803b158015610bf457600080fd5b505af1158015610c08573d6000803e3d6000fd5b505033600090815260146020526040902060038101549054909250610c2e91508461149b565b33600090815260146020526040902055600754610c4b908461149b565b600755610c6d600c8660048110610c6457610c646117b6565b0154429061149b565b3360009081526016602090815260408083208584529091529020908155426001820155600201839055600a54610cbc90610b1060108860048110610cb357610cb36117b6565b01548590611413565b3360009081526016602090815260408083208584529091529020600490810191909155610d1c90600c9087908110610cf657610cf66117b6565b0154336000908152601660209081526040808320868452909152902060040154906114fa565b3360008181526016602090815260408083208684528252808320600881019590955560038086018890556005860184905560048601546006870155600790950183905592825260149052908120909101805491610d7883611785565b909155505060408051338152602081018590527fa4e109bb7f03a3cbe671105ffecfc362319eaa88ecaf35997a4d3a2328d66d6c910160405180910390a1505050505050565b6003546001600160a01b03163314610de85760405162461bcd60e51b8152600401610726906116f1565b4780610e365760405162461bcd60e51b815260206004820152601960248201527f646f6573206e6f74206861766520616e792062616c616e6365000000000000006044820152606401610726565b604051339082156108fc029083906000818181858888f19350505050158015610e63573d6000803e3d6000fd5b5050565b6003546001600160a01b03163314610e915760405162461bcd60e51b8152600401610726906116f1565b600b55565b6003546001600160a01b03163314610ec05760405162461bcd60e51b8152600401610726906116f1565b60108481556011849055601283905581906003610a46565b600c8160048110610a0157600080fd5b33600090815260166020908152604080832084845290915290206009015460ff1615610f4b5760405162461bcd60e51b815260206004820152601260248201527130b63932b0b23c903bb4ba34323930bbb0b760711b6044820152606401610726565b336000908152601660209081526040808320848452909152902060090154610100900460ff1615610fb15760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610726565b600080610fbe3384611289565b33600081815260166020908152604080832089845290915290819020600501839055600154905163a9059cbb60e01b81526004810192909252602482018490529294509092506001600160a01b039091169063a9059cbb90604401600060405180830381600087803b15801561103357600080fd5b505af1158015611047573d6000803e3d6000fd5b5050600854611059925090508361149b565b600855336000908152601660209081526040808320868452909152902060060154611084908361153c565b33600090815260166020908152604080832087845290915290206006810191909155600701546110b4908361149b565b336000818152601660209081526040808320888452825280832060070194909455918152601490915220600201546110ec908361149b565b33600090815260146020908152604080832060020193909355601681528282208683529052206004810154600790910154141561114c573360009081526016602090815260408083208684529091529020600901805460ff191660011790555b60408051338152602081018490527ffb9432fa1fa7e0db773769fb77b5f241e9eb4987776725d22c900b3949b38e97910160405180910390a1505050565b6003546001600160a01b031633146111b45760405162461bcd60e51b8152600401610726906116f1565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031633146112005760405162461bcd60e51b8152600401610726906116f1565b6001600160a01b0381166112675760405162461bcd60e51b815260206004820152602860248201527f4e6577206f776e65722073686f756c64206e6f7420626520746865207a65726f604482015267206164647265737360c01b6064820152608401610726565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216600090815260166020908152604080832084845290915281206009015481908190819060ff161580156112f257506001600160a01b0386166000908152601660209081526040808320888452909152902060090154610100900460ff16155b1561140857506001600160a01b03851660009081526016602090815260408083208784529091528120600501544291908061135057506001600160a01b03871660009081526016602090815260408083208984529091529020600101545b61135a818461176e565b6001600160a01b03891660009081526016602090815260408083208b845290915290206008015490925061138f908390611413565b6001600160a01b03891660009081526016602090815260408083208b84529091529020600601549092508210156113d1576113ca8285611715565b9350611405565b6001600160a01b03881660009081526016602090815260408083208a84529091529020600601546114029085611715565b93505b50505b909590945092505050565b60008261142257506000611495565b600061142e838561174f565b90508261143b858361172d565b146114925760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610726565b90505b92915050565b6000806114a88385611715565b9050838110156114925760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610726565b600061149283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061157e565b600061149283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115b5565b6000818361159f5760405162461bcd60e51b8152600401610726919061169c565b5060006115ac848661172d565b95945050505050565b600081848411156115d95760405162461bcd60e51b8152600401610726919061169c565b5060006115ac848661176e565b6000602082840312156115f857600080fd5b8135611492816117cc565b6000806040838503121561161657600080fd5b8235611621816117cc565b946020939093013593505050565b60006020828403121561164157600080fd5b5035919050565b6000806040838503121561165b57600080fd5b50508035926020909101359150565b6000806000806080858703121561168057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b818110156116c9578581018301518582016040015282016116ad565b818111156116db576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b60008219821115611728576117286117a0565b500190565b60008261174a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611769576117696117a0565b500290565b600082821015611780576117806117a0565b500390565b6000600019821415611799576117996117a0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117e157600080fd5b5056fea264697066735822122043b18f7fad2567542ffe27689acb38cdd2609c54efeba0d74f12c97860bfd02064736f6c63430008060033