CODE DailyRewards

pragma solidity ^0.4.24;

// written by garry from Team Chibi Fighters Wiki // find us at https://chibifighters.io // chibifighters@gmail.com // version 1.0.0

contract Owned { address public owner; address public newOwner;

event OwnershipTransferred(address indexed _from, address indexed _to);

constructor public { owner = msg.sender; }

modifier onlyOwner { require(msg.sender == owner); _;   }

function transferOwnership(address _newOwner) public onlyOwner { newOwner = _newOwner; }   function acceptOwnership public { require(msg.sender == newOwner); emit OwnershipTransferred(owner, newOwner); owner = newOwner; newOwner = address(0); } }

interface ERC20Interface { function transferFrom(address from, address to, uint tokens) external returns (bool success); function transfer(address to, uint tokens) external; function balanceOf(address _owner) external view returns (uint256 _balance); }

interface ERC20InterfaceClassic { function transfer(address to, uint tokens) external returns (bool success); }

contract DailyRewards is Owned {

event RewardClaimed(		address indexed buyer,		uint256 day	); // what day the player is on in his reward chain mapping (address => uint) private daysInRow;

// timeout after which row is broken mapping (address => uint) private timeout; // how often the reward can be claimed, e.g. every 24h uint waitingTime = 24 hours; // window of claiming, if it expires day streak resets to day 1 uint waitingTimeBuffer = 48 hours; constructor public { // Explore Chibis and their universe // Off chain battles, real Ether fights, true on chain ownership // Leaderboards, tournaments, roleplay elements, we got it all }	function requestReward public returns (uint _days) { require (msg.sender != address(0)); require (now > timeout[msg.sender]); // waited too long, reset if (now > timeout[msg.sender] + waitingTimeBuffer) { daysInRow[msg.sender] = 1; } else { // no limit to being logged in, looking forward to the longest streak daysInRow[msg.sender]++; }	   timeout[msg.sender] = now + waitingTime; emit RewardClaimed(msg.sender, daysInRow[msg.sender]); return daysInRow[msg.sender]; }	/**	 * @dev Query stats of next reward, checks for expired time, too **/	function nextReward public view returns (uint _day, uint _nextClaimTime, uint _nextClaimExpire) { uint _dayCheck; if (now > timeout[msg.sender] + waitingTimeBuffer) _dayCheck = 1; else _dayCheck = daysInRow[msg.sender] + 1; return (_dayCheck, timeout[msg.sender], timeout[msg.sender] + waitingTimeBuffer); }	function queryWaitingTime public view returns (uint _waitingTime) { return waitingTime; }	function queryWaitingTimeBuffer public view returns (uint _waitingTimeBuffer) { return waitingTimeBuffer; }

/**	 * @dev Sets the interval for daily rewards, e.g. 24h = 86400 * @param newTime New interval time in seconds **/	function setWaitingTime(uint newTime) public onlyOwner returns (uint _newWaitingTime) { waitingTime = newTime; return waitingTime; }	/**	 * @dev Sets buffer for daily rewards. So user have time to claim it. e.g. 1h = 3600 * @param newTime New buffer in seconds **/	function setWaitingTimeBuffer(uint newTime) public onlyOwner returns (uint _newWaitingTimeBuffer) { waitingTimeBuffer = newTime; return waitingTimeBuffer; }

/**   * @dev Send Ether to owner * @param _address Receiving address * @param _amountWei Amount in WEI to send **/   function weiToOwner(address _address, uint _amountWei) public onlyOwner returns (bool) { require(_amountWei <= address(this).balance); _address.transfer(_amountWei); return true; }

function ERC20ToOwner(address _to, uint256 _amount, ERC20Interface _tokenContract) public onlyOwner { _tokenContract.transfer(_to, _amount); }

function ERC20ClassicToOwner(address _to, uint256 _amount, ERC20InterfaceClassic _tokenContract) public onlyOwner { _tokenContract.transfer(_to, _amount); }

}