false
false
0

Contract Address Details

0x0E2bfaabb56A83326A34299Ce75BBbab8A03Fce2

Contract Name
Airdrop
Creator
0xc7d98cā€“7f3521 at 0x754910ā€“59f8fd
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
2,204 Transactions
Transfers
101,581 Transfers
Gas Used
6,615,488,723
Last Balance Update
16285836
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Airdrop




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
200
EVM Version
default




Verified at
2024-09-26T15:24:30.318270Z

Constructor Arguments

0x0000000000000000000000009fae2529863bd691b4a7171bdfcf33c7ebb10a65

Arg [0] (address) : 0x9fae2529863bd691b4a7171bdfcf33c7ebb10a65

              

Contract source code

// SPDX-License-Identifier: No License (None)
pragma solidity ^0.8.0;

/**
 * @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 {
    address private _owner;

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

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

    /**
     * @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() == msg.sender, "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;
    }
}

/**
 * @dev Interface of the ERC223 standard as defined in the EIP.
 */
interface IERC223 {
    /**
     * @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);
    
    
    function transfer(address recipient, uint256 amount, bytes calldata data) 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);
}

abstract contract ERC223Recipient { 
/**
 * @dev Standard ERC223 function that will handle incoming token transfers.
 *
 * @param _from  Token sender address.
 * @param _value Amount of tokens.
 * @param _data  Transaction metadata.
 */
    function tokenReceived(address _from, uint _value, bytes memory _data) external virtual {}
}

contract Airdrop is Ownable, ERC223Recipient {

    struct Setting {
        uint256 amount;
        uint256 duration;   // in days
        uint256 daysPassed;
    }

    struct User {
        uint256 timestamp;
        uint256 amount;
    }

    struct Participants {
        uint256 totalParticipants;
        uint256 addedParticipants;
    }
    
    IERC223 public token;   // token to airdrop
    uint256 constant public lockPeriod = 180;  // 180 days (6 months) lock period
    mapping(uint256 => mapping(address => User)) public receivers; // airdrop ID => user address => amount and timestamp
    mapping(uint256 => mapping(uint256 => Participants)) public participants; // airdrop ID => day => Participants
    Setting[] public airdrops;
    address public system;

    event Rescue(address _token, uint256 _amount);
    event AirdropCreated(uint256 airdropId, uint256 amount, uint256 duration);
    event SetSystem(address _system);
    event Airdropped(uint256 indexed airdropId, address indexed user, uint256 amount);

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

    constructor (address _token) {
        token = IERC223(_token);
    }

    function setSystem(address _system) onlyOwner external {
        system = _system;
        emit SetSystem(_system);
    }

    function createAirdrop(uint256 amount, uint256 duration) onlyOwner external returns(uint256 airdropId) {
        airdropId = airdrops.length;
        airdrops.push(Setting(amount, duration, 0));
        emit AirdropCreated(airdropId, amount, duration);
    }

    function getAirdropsLength() external view returns (uint256) {
        return airdrops.length;
    }

    function getUserInfo(address user) external view returns(User[] memory) {
        uint256 len = airdrops.length;
        User[] memory u = new User[](len);
        for (uint i = 0; i < len; i++) {
            u[i] = receivers[i][user];
        }
        return u;
    }
    
    /**
    * @dev Close Airdrop day. Call this function on next day after claiming (after 00:00 UTC)
    *
    * @param airdropId  Airdrop ID.
    * @param day Day number of airdrop. From 1 to airdrop duration
    * @param totalParticipants  Total number of approved user that claim tokens on this day.
    */
    function closeDay(uint256 airdropId, uint256 day, uint256 totalParticipants) onlySystem external {
        require(participants[airdropId][day].totalParticipants == 0, "Day already closed");
        participants[airdropId][day].totalParticipants = totalParticipants;
    }

    /**
    * @dev Add approved users. Call function closeDay() before start add users.
    *
    * @param airdropId  Airdrop ID.
    * @param day Day number of airdrop. From 1 to airdrop duration
    * @param users The array of approved users whose claim tokens on this day. About 100 users in the array.
    */
    function addUsers(uint256 airdropId, uint256 day, address[] calldata users) onlySystem external {
        require(airdrops[airdropId].daysPassed + 1 == day, "Day already passed");
        require(airdrops[airdropId].daysPassed < airdrops[airdropId].duration, "Airdrop ended");
        uint256 timestamp = block.timestamp / 1 days * 1 days;  // align timestamp to 00:00 UTC
        uint256 totalParticipants = participants[airdropId][day].totalParticipants;
        uint256 amount = airdrops[airdropId].amount / (airdrops[airdropId].duration * totalParticipants);
        participants[airdropId][day].addedParticipants += users.length;
        require (participants[airdropId][day].addedParticipants <= totalParticipants, "Too many users");
        if (participants[airdropId][day].addedParticipants == totalParticipants) {
            airdrops[airdropId].daysPassed = airdrops[airdropId].daysPassed + 1;
        }
        for (uint i = 0; i < users.length; i++) {
            if (receivers[airdropId][users[i]].timestamp == 0) {
                receivers[airdropId][users[i]].timestamp = timestamp;
                receivers[airdropId][users[i]].amount = amount;
            }
        }
    }

    /**
    * @dev Claim tokens on users behalf when lock period ends.
    *
    * @param airdropId  Airdrop ID.
    * @param users The array of users whose lock period ended. About 100 users in the array.
    */
    function claimToken(uint256 airdropId, address[] calldata users) external {
        for (uint i = 0; i < users.length; i++) {
            User memory u = receivers[airdropId][users[i]];
            if (u.timestamp + lockPeriod <= block.timestamp && u.amount > 0)  {
                delete receivers[airdropId][users[i]];
                token.transfer(users[i], u.amount);
                emit Airdropped(airdropId, users[i], u.amount);
            }
        }
    }

    function rescueTokens(address _token) onlyOwner external {
        uint256 amount = IERC223(_token).balanceOf(address(this));
        IERC223(_token).transfer(msg.sender, amount);
        emit Rescue(_token, amount);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"event","name":"AirdropCreated","inputs":[{"type":"uint256","name":"airdropId","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"duration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Airdropped","inputs":[{"type":"uint256","name":"airdropId","internalType":"uint256","indexed":true},{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Rescue","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetSystem","inputs":[{"type":"address","name":"_system","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addUsers","inputs":[{"type":"uint256","name":"airdropId","internalType":"uint256"},{"type":"uint256","name":"day","internalType":"uint256"},{"type":"address[]","name":"users","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"daysPassed","internalType":"uint256"}],"name":"airdrops","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimToken","inputs":[{"type":"uint256","name":"airdropId","internalType":"uint256"},{"type":"address[]","name":"users","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeDay","inputs":[{"type":"uint256","name":"airdropId","internalType":"uint256"},{"type":"uint256","name":"day","internalType":"uint256"},{"type":"uint256","name":"totalParticipants","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"airdropId","internalType":"uint256"}],"name":"createAirdrop","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAirdropsLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct Airdrop.User[]","components":[{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}]}],"name":"getUserInfo","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalParticipants","internalType":"uint256"},{"type":"uint256","name":"addedParticipants","internalType":"uint256"}],"name":"participants","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"receivers","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSystem","inputs":[{"type":"address","name":"_system","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"system","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC223"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b5060405161149e38038061149e83398101604081905261002f91610093565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b03929092169190911790556100c3565b6000602082840312156100a557600080fd5b81516001600160a01b03811681146100bc57600080fd5b9392505050565b6113cc806100d26000396000f3fe608060405234801561001057600080fd5b50600436106101155760003560e01c806381c82648116100a257806395bf75fd1161007157806395bf75fd1461028e578063b4f4613c146102a1578063f2fde38b146102b4578063fc0c546a146102c7578063fe289b65146102da57600080fd5b806381c826481461021157806381fb1fb4146102245780638943ec02146102565780638da5cb5b1461026957600080fd5b806355837757116100e9578063558377571461016157806360db5082146101745780636386c1c7146101a2578063715018a6146101c25780637cf27c39146101ca57600080fd5b8062ae3bf81461011a57806318809fd51461012f5780633fd8b02f14610146578063429d299e1461014e575b600080fd5b61012d610128366004610fb6565b6102ed565b005b6004545b6040519081526020015b60405180910390f35b61013360b481565b61012d61015c366004611024565b610473565b61012d61016f366004610fb6565b61086b565b610187610182366004611077565b6108f8565b6040805193845260208401929092529082015260600161013d565b6101b56101b0366004610fb6565b61092b565b60405161013d9190611090565b61012d610a10565b6101fc6101d83660046110df565b60026020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161013d565b61012d61021f36600461110b565b610a93565b6101fc610232366004611157565b60036020908152600092835260408084209091529082529020805460019091015482565b61012d61026436600461118f565b505050565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161013d565b600554610276906001600160a01b031681565b6101336102af366004611157565b610cd7565b61012d6102c2366004610fb6565b610dff565b600154610276906001600160a01b031681565b61012d6102e836600461125a565b610ef8565b336103006000546001600160a01b031690565b6001600160a01b03161461032f5760405162461bcd60e51b815260040161032690611286565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561037157600080fd5b505afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a991906112bb565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b1580156103f457600080fd5b505af1158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c91906112d4565b50604080516001600160a01b0384168152602081018390527f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af2910160405180910390a15050565b6005546001600160a01b0316331461049d5760405162461bcd60e51b815260040161032690611286565b82600485815481106104b1576104b16112f6565b90600052602060002090600302016002015460016104cf9190611322565b146105115760405162461bcd60e51b815260206004820152601260248201527111185e48185b1c9958591e481c185cdcd95960721b6044820152606401610326565b60048481548110610524576105246112f6565b90600052602060002090600302016001015460048581548110610549576105496112f6565b906000526020600020906003020160020154106105985760405162461bcd60e51b815260206004820152600d60248201526c105a5c991c9bdc08195b991959609a1b6044820152606401610326565b60006105a7620151804261133a565b6105b4906201518061135c565b6000868152600360209081526040808320888452909152812054600480549394509092839190899081106105ea576105ea6112f6565b906000526020600020906003020160010154610606919061135c565b60048881548110610619576106196112f6565b906000526020600020906003020160000154610635919061133a565b60008881526003602090815260408083208a8452909152812060010180549293508692909190610666908490611322565b909155505060008781526003602090815260408083208984529091529020600101548210156106c85760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920757365727360901b6044820152606401610326565b600087815260036020908152604080832089845290915290206001015482141561074657600487815481106106ff576106ff6112f6565b906000526020600020906003020160020154600161071d9190611322565b60048881548110610730576107306112f6565b9060005260206000209060030201600201819055505b60005b8481101561086157600088815260026020526040812090878784818110610772576107726112f6565b90506020020160208101906107879190610fb6565b6001600160a01b0316815260208101919091526040016000205461084f57600088815260026020526040812085918888858181106107c7576107c76112f6565b90506020020160208101906107dc9190610fb6565b6001600160a01b0316815260208082019290925260409081016000908120939093558a835260029091528120839188888581811061081c5761081c6112f6565b90506020020160208101906108319190610fb6565b6001600160a01b031681526020810191909152604001600020600101555b806108598161137b565b915050610749565b5050505050505050565b3361087e6000546001600160a01b031690565b6001600160a01b0316146108a45760405162461bcd60e51b815260040161032690611286565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f49cd4dad53143519125de2da7395d254bd24b8f3c049554685fadeafc1fd96c89060200160405180910390a150565b6004818154811061090857600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60045460609060008167ffffffffffffffff81111561094c5761094c611179565b60405190808252806020026020018201604052801561099157816020015b604080518082019091526000808252602082015281526020019060019003908161096a5790505b50905060005b82811015610a085760008181526002602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015282518390839081106109ea576109ea6112f6565b60200260200101819052508080610a009061137b565b915050610997565b509392505050565b33610a236000546001600160a01b031690565b6001600160a01b031614610a495760405162461bcd60e51b815260040161032690611286565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60005b81811015610cd157600084815260026020526040812081858585818110610abf57610abf6112f6565b9050602002016020810190610ad49190610fb6565b6001600160a01b03166001600160a01b031681526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090504260b48260000151610b279190611322565b11158015610b39575060008160200151115b15610cbe57600085815260026020526040812090858585818110610b5f57610b5f6112f6565b9050602002016020810190610b749190610fb6565b6001600160a01b03908116825260208201929092526040016000908120818155600190810191909155541663a9059cbb858585818110610bb657610bb66112f6565b9050602002016020810190610bcb9190610fb6565b60208401516040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c1657600080fd5b505af1158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e91906112d4565b50838383818110610c6157610c616112f6565b9050602002016020810190610c769190610fb6565b6001600160a01b0316857f745451e9085df6151853070d092cd5b0409d5888d965ea556a9734dabde8801b8360200151604051610cb591815260200190565b60405180910390a35b5080610cc98161137b565b915050610a96565b50505050565b600033610cec6000546001600160a01b031690565b6001600160a01b031614610d125760405162461bcd60e51b815260040161032690611286565b50600480546040805160608082018352868252602080830187815260008486018181526001880189559790529251600386027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81019190915592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c84015594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90920191909155815183815293840186905290830184905290917f87620792bbfc30ecd66cb6c71bb4ffc7323cf9f22c2bbaceca6d37a6a70942cd910160405180910390a192915050565b33610e126000546001600160a01b031690565b6001600160a01b031614610e385760405162461bcd60e51b815260040161032690611286565b6001600160a01b038116610e9d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610326565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f225760405162461bcd60e51b815260040161032690611286565b600083815260036020908152604080832085845290915290205415610f7e5760405162461bcd60e51b815260206004820152601260248201527111185e48185b1c9958591e4818db1bdcd95960721b6044820152606401610326565b6000928352600360209081526040808520938552929052912055565b80356001600160a01b0381168114610fb157600080fd5b919050565b600060208284031215610fc857600080fd5b610fd182610f9a565b9392505050565b60008083601f840112610fea57600080fd5b50813567ffffffffffffffff81111561100257600080fd5b6020830191508360208260051b850101111561101d57600080fd5b9250929050565b6000806000806060858703121561103a57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561105f57600080fd5b61106b87828801610fd8565b95989497509550505050565b60006020828403121561108957600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b828110156110d2578151805185528601518685015292840192908501906001016110ad565b5091979650505050505050565b600080604083850312156110f257600080fd5b8235915061110260208401610f9a565b90509250929050565b60008060006040848603121561112057600080fd5b83359250602084013567ffffffffffffffff81111561113e57600080fd5b61114a86828701610fd8565b9497909650939450505050565b6000806040838503121561116a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156111a457600080fd5b6111ad84610f9a565b925060208401359150604084013567ffffffffffffffff808211156111d157600080fd5b818601915086601f8301126111e557600080fd5b8135818111156111f7576111f7611179565b604051601f8201601f19908116603f0116810190838211818310171561121f5761121f611179565b8160405282815289602084870101111561123857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060006060848603121561126f57600080fd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156112cd57600080fd5b5051919050565b6000602082840312156112e657600080fd5b81518015158114610fd157600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156113355761133561130c565b500190565b60008261135757634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113765761137661130c565b500290565b600060001982141561138f5761138f61130c565b506001019056fea26469706673582212204b751c979b95f0495c78d108bbc4ab2f59ff542435de44ba58b8a1a9b1390f7d64736f6c634300080900330000000000000000000000009fae2529863bd691b4a7171bdfcf33c7ebb10a65

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101155760003560e01c806381c82648116100a257806395bf75fd1161007157806395bf75fd1461028e578063b4f4613c146102a1578063f2fde38b146102b4578063fc0c546a146102c7578063fe289b65146102da57600080fd5b806381c826481461021157806381fb1fb4146102245780638943ec02146102565780638da5cb5b1461026957600080fd5b806355837757116100e9578063558377571461016157806360db5082146101745780636386c1c7146101a2578063715018a6146101c25780637cf27c39146101ca57600080fd5b8062ae3bf81461011a57806318809fd51461012f5780633fd8b02f14610146578063429d299e1461014e575b600080fd5b61012d610128366004610fb6565b6102ed565b005b6004545b6040519081526020015b60405180910390f35b61013360b481565b61012d61015c366004611024565b610473565b61012d61016f366004610fb6565b61086b565b610187610182366004611077565b6108f8565b6040805193845260208401929092529082015260600161013d565b6101b56101b0366004610fb6565b61092b565b60405161013d9190611090565b61012d610a10565b6101fc6101d83660046110df565b60026020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161013d565b61012d61021f36600461110b565b610a93565b6101fc610232366004611157565b60036020908152600092835260408084209091529082529020805460019091015482565b61012d61026436600461118f565b505050565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161013d565b600554610276906001600160a01b031681565b6101336102af366004611157565b610cd7565b61012d6102c2366004610fb6565b610dff565b600154610276906001600160a01b031681565b61012d6102e836600461125a565b610ef8565b336103006000546001600160a01b031690565b6001600160a01b03161461032f5760405162461bcd60e51b815260040161032690611286565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561037157600080fd5b505afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a991906112bb565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b1580156103f457600080fd5b505af1158015610408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042c91906112d4565b50604080516001600160a01b0384168152602081018390527f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af2910160405180910390a15050565b6005546001600160a01b0316331461049d5760405162461bcd60e51b815260040161032690611286565b82600485815481106104b1576104b16112f6565b90600052602060002090600302016002015460016104cf9190611322565b146105115760405162461bcd60e51b815260206004820152601260248201527111185e48185b1c9958591e481c185cdcd95960721b6044820152606401610326565b60048481548110610524576105246112f6565b90600052602060002090600302016001015460048581548110610549576105496112f6565b906000526020600020906003020160020154106105985760405162461bcd60e51b815260206004820152600d60248201526c105a5c991c9bdc08195b991959609a1b6044820152606401610326565b60006105a7620151804261133a565b6105b4906201518061135c565b6000868152600360209081526040808320888452909152812054600480549394509092839190899081106105ea576105ea6112f6565b906000526020600020906003020160010154610606919061135c565b60048881548110610619576106196112f6565b906000526020600020906003020160000154610635919061133a565b60008881526003602090815260408083208a8452909152812060010180549293508692909190610666908490611322565b909155505060008781526003602090815260408083208984529091529020600101548210156106c85760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920757365727360901b6044820152606401610326565b600087815260036020908152604080832089845290915290206001015482141561074657600487815481106106ff576106ff6112f6565b906000526020600020906003020160020154600161071d9190611322565b60048881548110610730576107306112f6565b9060005260206000209060030201600201819055505b60005b8481101561086157600088815260026020526040812090878784818110610772576107726112f6565b90506020020160208101906107879190610fb6565b6001600160a01b0316815260208101919091526040016000205461084f57600088815260026020526040812085918888858181106107c7576107c76112f6565b90506020020160208101906107dc9190610fb6565b6001600160a01b0316815260208082019290925260409081016000908120939093558a835260029091528120839188888581811061081c5761081c6112f6565b90506020020160208101906108319190610fb6565b6001600160a01b031681526020810191909152604001600020600101555b806108598161137b565b915050610749565b5050505050505050565b3361087e6000546001600160a01b031690565b6001600160a01b0316146108a45760405162461bcd60e51b815260040161032690611286565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f49cd4dad53143519125de2da7395d254bd24b8f3c049554685fadeafc1fd96c89060200160405180910390a150565b6004818154811061090857600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60045460609060008167ffffffffffffffff81111561094c5761094c611179565b60405190808252806020026020018201604052801561099157816020015b604080518082019091526000808252602082015281526020019060019003908161096a5790505b50905060005b82811015610a085760008181526002602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015282518390839081106109ea576109ea6112f6565b60200260200101819052508080610a009061137b565b915050610997565b509392505050565b33610a236000546001600160a01b031690565b6001600160a01b031614610a495760405162461bcd60e51b815260040161032690611286565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60005b81811015610cd157600084815260026020526040812081858585818110610abf57610abf6112f6565b9050602002016020810190610ad49190610fb6565b6001600160a01b03166001600160a01b031681526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090504260b48260000151610b279190611322565b11158015610b39575060008160200151115b15610cbe57600085815260026020526040812090858585818110610b5f57610b5f6112f6565b9050602002016020810190610b749190610fb6565b6001600160a01b03908116825260208201929092526040016000908120818155600190810191909155541663a9059cbb858585818110610bb657610bb66112f6565b9050602002016020810190610bcb9190610fb6565b60208401516040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c1657600080fd5b505af1158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e91906112d4565b50838383818110610c6157610c616112f6565b9050602002016020810190610c769190610fb6565b6001600160a01b0316857f745451e9085df6151853070d092cd5b0409d5888d965ea556a9734dabde8801b8360200151604051610cb591815260200190565b60405180910390a35b5080610cc98161137b565b915050610a96565b50505050565b600033610cec6000546001600160a01b031690565b6001600160a01b031614610d125760405162461bcd60e51b815260040161032690611286565b50600480546040805160608082018352868252602080830187815260008486018181526001880189559790529251600386027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81019190915592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c84015594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90920191909155815183815293840186905290830184905290917f87620792bbfc30ecd66cb6c71bb4ffc7323cf9f22c2bbaceca6d37a6a70942cd910160405180910390a192915050565b33610e126000546001600160a01b031690565b6001600160a01b031614610e385760405162461bcd60e51b815260040161032690611286565b6001600160a01b038116610e9d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610326565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f225760405162461bcd60e51b815260040161032690611286565b600083815260036020908152604080832085845290915290205415610f7e5760405162461bcd60e51b815260206004820152601260248201527111185e48185b1c9958591e4818db1bdcd95960721b6044820152606401610326565b6000928352600360209081526040808520938552929052912055565b80356001600160a01b0381168114610fb157600080fd5b919050565b600060208284031215610fc857600080fd5b610fd182610f9a565b9392505050565b60008083601f840112610fea57600080fd5b50813567ffffffffffffffff81111561100257600080fd5b6020830191508360208260051b850101111561101d57600080fd5b9250929050565b6000806000806060858703121561103a57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561105f57600080fd5b61106b87828801610fd8565b95989497509550505050565b60006020828403121561108957600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b828110156110d2578151805185528601518685015292840192908501906001016110ad565b5091979650505050505050565b600080604083850312156110f257600080fd5b8235915061110260208401610f9a565b90509250929050565b60008060006040848603121561112057600080fd5b83359250602084013567ffffffffffffffff81111561113e57600080fd5b61114a86828701610fd8565b9497909650939450505050565b6000806040838503121561116a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156111a457600080fd5b6111ad84610f9a565b925060208401359150604084013567ffffffffffffffff808211156111d157600080fd5b818601915086601f8301126111e557600080fd5b8135818111156111f7576111f7611179565b604051601f8201601f19908116603f0116810190838211818310171561121f5761121f611179565b8160405282815289602084870101111561123857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060006060848603121561126f57600080fd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156112cd57600080fd5b5051919050565b6000602082840312156112e657600080fd5b81518015158114610fd157600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156113355761133561130c565b500190565b60008261135757634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113765761137661130c565b500290565b600060001982141561138f5761138f61130c565b506001019056fea26469706673582212204b751c979b95f0495c78d108bbc4ab2f59ff542435de44ba58b8a1a9b1390f7d64736f6c63430008090033