账户
0x55...c159
0x55...c159

0x55...c159

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.5.11+commit.c082d0b4
语言
Solidity
合同源代码
文件 1 的 1:GachaDrop.sol
/**
 *Submitted for verification at Etherscan.io on 2019-11-06
*/

pragma solidity 0.5.11;
pragma experimental ABIEncoderV2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;


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


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}
contract ERC20BasicInterface {
    function totalSupply() public view returns (uint256);

    function balanceOf(address who) public view returns (uint256);

    function transfer(address to, uint256 value) public returns (bool);

    function transferFrom(address from, address to, uint256 value) public returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    uint8 public decimals;
}
contract GachaDrop is Ownable {
    struct Drop {
        string name;
        uint periodToPlay;
        address erc20Need;
        uint256 requireErc20;
        mapping(address => uint) timeTrackUser;
        uint countCallTime;
    }
    mapping(string => Drop) public Drops;
    string[] public DropNames;
    event _random(address _from, uint _ticket, string _drop, uint _countCallTime);
    event _changePeriodToPlay(string _drop, uint _period);

    constructor() public {
        Drops['avatarofwar'].name = 'avatarofwar';
        Drops['avatarofwar'].periodToPlay = 86400;
        Drops['avatarofwar'].erc20Need = 0xEc7ba74789694d0d03D458965370Dc7cF2FE75Ba;
        // Drops['AvatarOfWar'].erc20Need = 0x91013928b1C4dbd0D5cB21BA5b052BfD840A7a7F; // hbwallet rinkeby
        // Drops['avatarofwar'].erc20Need = 0x614F3262c6df42b174cF8544454D6Dc39A9768D2; // kovan
        Drops['avatarofwar'].requireErc20 = 0;
        DropNames.push('avatarofwar');
    }
    function getDropNames() public view returns(string[] memory) {
        return DropNames;
    }
    function getTimeTrackUser(string memory _drop, address _player) public view returns(uint _periodToPlay, uint _timeTrackUser, uint _countCallTime) {
        return (Drops[_drop].periodToPlay, Drops[_drop].timeTrackUser[_player], Drops[_drop].countCallTime);
    }
    function getAward(string memory _drop) public {
        require(isValidToPlay(_drop));
        Drops[_drop].timeTrackUser[msg.sender] = block.timestamp;
        Drops[_drop].countCallTime = Drops[_drop].countCallTime + 1;
        emit _random(msg.sender, block.timestamp, Drops[_drop].name, Drops[_drop].countCallTime);
    }

    function isValidToPlay(string memory _drop) public view returns (bool){
        ERC20BasicInterface erc20 = ERC20BasicInterface(Drops[_drop].erc20Need);
        return Drops[_drop].periodToPlay <= now - Drops[_drop].timeTrackUser[msg.sender]
        && erc20.balanceOf(msg.sender) >= Drops[_drop].requireErc20;
    }
    function changePeriodToPlay(string memory _drop, uint _period, address _erc20Need, uint256 _requireErc20) onlyOwner public{

        if(Drops[_drop].periodToPlay == 0) {
            DropNames.push(_drop);
            Drops[_drop].name = _drop;
        }

        Drops[_drop].periodToPlay = _period;
        Drops[_drop].erc20Need = _erc20Need;
        Drops[_drop].requireErc20 = _requireErc20;
        emit _changePeriodToPlay(_drop, _period);
    }

}
设置
{
  "compilationTarget": {
    "GachaDrop.sol": "GachaDrop"
  },
  "evmVersion": "petersburg",
  "libraries": {},
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"constant":true,"inputs":[],"name":"getDropNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DropNames","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_drop","type":"string"},{"internalType":"address","name":"_player","type":"address"}],"name":"getTimeTrackUser","outputs":[{"internalType":"uint256","name":"_periodToPlay","type":"uint256"},{"internalType":"uint256","name":"_timeTrackUser","type":"uint256"},{"internalType":"uint256","name":"_countCallTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_drop","type":"string"}],"name":"isValidToPlay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"Drops","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"periodToPlay","type":"uint256"},{"internalType":"address","name":"erc20Need","type":"address"},{"internalType":"uint256","name":"requireErc20","type":"uint256"},{"internalType":"uint256","name":"countCallTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_drop","type":"string"}],"name":"getAward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_drop","type":"string"},{"internalType":"uint256","name":"_period","type":"uint256"},{"internalType":"address","name":"_erc20Need","type":"address"},{"internalType":"uint256","name":"_requireErc20","type":"uint256"}],"name":"changePeriodToPlay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_ticket","type":"uint256"},{"indexed":false,"internalType":"string","name":"_drop","type":"string"},{"indexed":false,"internalType":"uint256","name":"_countCallTime","type":"uint256"}],"name":"_random","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_drop","type":"string"},{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"_changePeriodToPlay","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"}]