pragma solidity 0.5.16; /*
___________________________________________________________________
_ _ ______
| | / / /
--|-/|-/-----__---/----__----__---_--_----__-------/-------__------
|/ |/ /___) / / ' / ) / / ) /___) / / )
__/__|____(___ _/___(___ _(___/_/_/__/_(___ _____/______(___/__o_o_
███╗ ███╗███████╗██╗ ██╗██████╗ ████████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗
████╗ ████║██╔════╝╚██╗██╔╝██╔══██╗ ╚══██╔══╝██╔═══██╗██║ ██╔╝██╔════╝████╗ ██║
██╔████╔██║█████╗ ╚███╔╝ ██████╔╝ ██║ ██║ ██║█████╔╝ █████╗ ██╔██╗ ██║
██║╚██╔╝██║██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║ ██║██╔═██╗ ██╔══╝ ██║╚██╗██║
██║ ╚═╝ ██║███████╗██╔╝ ██╗██║ ██║ ╚██████╔╝██║ ██╗███████╗██║ ╚████║
╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝
=== 'MEXP' Token contract with following features ===
=> TRC20 Compliance
=> Higher degree of control by owner - safeguard functionality
=> SafeMath implementation
=> Burnable and minting ( For MOJI Players)
======================= Quick Stats ===================
=> Name : "MOJI Experience Points"
=> Symbol : MEXP
=> Total supply: 0 (Minted only by MOJI players only)
=> Decimals : 18
*/
//*******************************************************************//
//------------------------ SafeMath Library -------------------------//
//*******************************************************************//
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
}
//*******************************************************************//
//------------------ Contract to Manage Ownership -------------------//
//*******************************************************************//
contract owned {
address payable public owner;
address payable private newOwner;
/**
Signer is deligated admin wallet, which can do sub-owner functions.
Signer calls following four functions:
=> claimOwnerTokens
=> distributeMainDividend
=> distributeLeaders1
=> distributeLeaders2
*/
address public signer;
event OwnershipTransferred(address indexed _from, address indexed _to);
constructor() public {
owner = msg.sender;
signer = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
modifier onlySigner {
require(msg.sender == signer);
_;
}
function changeSigner(address _signer) public onlyOwner {
signer = _signer;
}
function transferOwnership(address payable _newOwner) public onlyOwner {
newOwner = _newOwner;
}
//this flow is to prevent transferring ownership to wrong wallet by mistake
function acceptOwnership() public {
require(msg.sender == newOwner);
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
newOwner = address(0);
}
}
//**************************************************************************//
//------------------- NIFTYMOJI CONTRACT INTERFACE --------------------//
//**************************************************************************//
interface niftyMoji
{
function ownerOf(uint256 tokenId) external view returns (address);
function powerNLucks(uint256 tokenID) external view returns(uint256, uint256);
function totalSupply() external view returns(uint256);
}
//****************************************************************************//
//--------------------- MEXP MAIN CODE STARTS HERE ---------------------//
//****************************************************************************//
contract MEXPToken is owned {
/*===============================
= DATA STORAGE =
===============================*/
// Public variables of the token
using SafeMath for uint256;
uint256 public withdrawnByAdmin;
string public constant name = "MOJI Experience Points";
string public constant symbol = "MEXP";
uint256 public constant decimals = 18;
uint256 public totalSupply;
uint256 public burnTracker; //mainly used in mintToken function..
uint256 public mintingMultiplier=10000; // 10000 = 1, 123 = 0.0123 admin can set it minting per day, will be factored as luck %
address public niftyMojiContractAddress = 0xde544E54a330Abd1eA8a0E6693D46BFe95D9A684; // admin can set / change this address
uint256 public battleFees=1; // default is 0.000000000000000001 Ether for battle fees, which admin can change
uint256 public mintTokenFee = 0.001 ether;
uint256 public battleWinReward= 10**18; // = 1 token with 18 decimal places, admin can change
uint256 public battleLooseReward = 10**17; // = 0.1 token with 10 decimal places, admin can change
uint256 public maxBattlePerDay=10; //daily 10 max battles
bool public globalHalt; // Emergency Break
uint256 public lastFinishedIndex;
// This creates a mapping with all data storage
mapping (address => uint256) public balanceOf;
mapping(uint256 => uint256) public totalMintedForTokenId;
mapping(uint256 => uint256) public totalMintedByOwnerForTokenID;
mapping(uint256 => uint256) public totalMintedByUserForTokenID;
mapping(uint256 => uint256) public totalMintedByBattleForTokenID;
mapping(uint256 => uint256) public dayTracker;
mapping (address => mapping (address => uint256)) public allowance;
mapping(address => uint256) public BattleCountEndTime;
mapping (address => uint256) public userBattleCount;
mapping(address => bool) public blackListedUser;
mapping(uint256 => bool) public blackListedToken;
struct battleInfo
{
uint256 tokenID;
uint256 userSeed;
uint256 rewardAmount;
uint256 blockNo;
uint256 opponentTokenID;
}
battleInfo[] public battleInfos;
/*===============================
= PUBLIC EVENTS =
===============================*/
// This generates a public event of token transfer
event Transfer(address indexed from, address indexed to, uint256 value);
// This notifies clients about the amount burnt
event Burn(address indexed indexed from, uint256 value);
// This trackes approvals
event Approval(address indexed owner, address indexed spender, uint256 value );
/*======================================
= STANDARD TRC20 FUNCTIONS =
======================================*/
/* Internal transfer, only can be called by this contract */
function _transfer(address _from, address _to, uint _value) internal {
//checking conditions
require(!globalHalt, "paused by admin");
require (_to != address(0x0)); // Prevent transfer to 0x0 address. Use burn() instead
// overflow and undeflow checked by SafeMath Library
balanceOf[_from] = balanceOf[_from].sub(_value); // Subtract from the sender
balanceOf[_to] = balanceOf[_to].add(_value); // Add the same to the recipient
// emit Transfer event
emit Transfer(_from, _to, _value);
}
/**
* Transfer tokens
*
* Send `_value` tokens to `_to` from your account
*
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transfer(address _to, uint256 _value) public returns (bool success) {
require(!blackListedUser[msg.sender], "you are not allowed");
//no need to check for input validations, as that is ruled by SafeMath
_transfer(msg.sender, _to, _value);
return true;
}
/**
* Transfer tokens from other address
*
* Send `_value` tokens to `_to` in behalf of `_from`
*
* @param _from The address of the sender
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(!blackListedUser[msg.sender], "you are not allowed");
//require(_value <= allowance[_from][msg.sender]); // no need for this condition as it is already checked by SafeMath below
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
_transfer(_from, _to, _value);
return true;
}
/**
* Set allowance for other address
*
* Allows `_spender` to spend no more than `_value` tokens in your behalf
*
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public returns (bool success) {
require(!blackListedUser[msg.sender], "you are not allowed");
require(!globalHalt, "paused by admin");
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/*=====================================
= CUSTOM PUBLIC FUNCTIONS =
======================================*/
/**
Constructor function
*/
constructor() public
{
battleInfo memory temp;
battleInfos.push(temp);
}
/**
* Fallback function. It just accepts incoming Ether
*/
function () payable external {}
/**
* Destroy tokens
*
* Remove `_value` tokens from the system irreversibly
*
* @param _value the amount of money to burn
*/
function burn(uint256 _value) public returns (bool success) {
require(!globalHalt, "paused by admin");
require(!blackListedUser[msg.sender], "you are not allowed");
//checking of enough token balance is done by SafeMath
balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); // Subtract from the sender
totalSupply = totalSupply.sub(_value); // Updates totalSupply
burnTracker = burnTracker.add(_value);
emit Transfer(msg.sender, address(0), _value);
//althogh we can track all the "burn" from the Transfer function, we just kept it as it is. As that is no much harm
emit Burn(msg.sender, _value);
return true;
}
/**
* Destroy tokens from other account
*
* Remove `_value` tokens from the system irreversibly on behalf of `_from`.
*
* @param _from the address of the sender
* @param _value the amount of money to burn
*/
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(!globalHalt, "paused by admin");
require(!blackListedUser[msg.sender], "you are not allowed");
//checking of allowance and token value is done by SafeMath
balanceOf[_from] = balanceOf[_from].sub(_value); // Subtract from the targeted balance
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value); // Subtract from the sender's allowance
totalSupply = totalSupply.sub(_value); // Update totalSupply
burnTracker = burnTracker.add(_value);
emit Transfer(_from, address(0), _value);
emit Burn(_from, _value);
return true;
}
function mintTokenOwnerOnly(address user, uint256 _tokenID, uint256 tokenAmount) public onlyOwner returns(bool)
{
require(user != address(this) && user != address(0), "invalid address" );
require(tokenAmount > 0 , "Invalid token to mint");
require(!blackListedToken[_tokenID], "this token is blacklisted");
if(_tokenID != 0)
{
require(niftyMoji(niftyMojiContractAddress).ownerOf(_tokenID) == user,"user is not the owner of this tokenID");
totalMintedForTokenId[_tokenID] = totalMintedForTokenId[_tokenID].add(tokenAmount);
totalMintedByOwnerForTokenID[_tokenID] = totalMintedByOwnerForTokenID[_tokenID].add(tokenAmount);
}
totalSupply = totalSupply.add(tokenAmount);
balanceOf[user] = balanceOf[user].add(tokenAmount);
//emitting Transfer event
emit Transfer(address(0),user,tokenAmount);
return true;
}
function blackListUser(address user) public onlyOwner returns(bool)
{
blackListedUser[user] = true;
return true;
}
function removeUserFromBlackList(address user) public onlyOwner returns(bool)
{
blackListedUser[user] = false;
return true;
}
function blackListToken(uint256 _tokenID) public onlyOwner returns(bool)
{
blackListedToken[_tokenID] = true;
return true;
}
function removeTokenFromBlackList(uint256 _tokenID) public onlyOwner returns(bool)
{
blackListedToken[_tokenID] = false;
return true;
}
//Minting according to luck percent of the given token id
function mintToken(uint256 _tokenID) public payable returns(bool) {
require(!globalHalt, "paused by admin");
address caller = niftyMoji(niftyMojiContractAddress).ownerOf(_tokenID);
require(!blackListedUser[caller], "you are not allowed");
require(!blackListedToken[_tokenID], "this token is blacklisted");
require(caller == msg.sender,"caller is not the owner of this tokenID");
require(msg.value >= mintTokenFee, 'Not enough token minting fee');
uint256 dt = dayTracker[_tokenID];
if (dt != 0)
{
uint256 secPassed = now - dt ;
require(secPassed > 0 , "already minted for the day");
(,uint256 luckPercent ) = niftyMoji(niftyMojiContractAddress).powerNLucks(_tokenID);
uint256 mintAmount = (( (mintingMultiplier * (10 ** 18) * ((luckPercent + 9 ) / 10 ) ) / 100000 ) / 86400 ) * secPassed ;
dayTracker[_tokenID] = now ;
totalMintedByUserForTokenID[_tokenID] = totalMintedByUserForTokenID[_tokenID].add(mintAmount);
totalMintedForTokenId[_tokenID] = totalMintedForTokenId[_tokenID].add(mintAmount);
totalSupply = totalSupply.add(mintAmount);
balanceOf[caller] = balanceOf[caller].add(mintAmount);
//emitting Transfer event
emit Transfer(address(0),caller,mintAmount);
}
else
{
dayTracker[_tokenID] = now;
}
owner.transfer(msg.value);
return true;
}
function viewAmountIfIMintNow(uint256 _tokenID) public view returns(uint256 amount)
{
uint256 dt = dayTracker[_tokenID];
if (dt != 0)
{
uint256 secPassed = now - dt ;
(,uint256 luckPercent ) = niftyMoji(niftyMojiContractAddress).powerNLucks(_tokenID);
amount = (( (mintingMultiplier * (10 ** 18) * ((luckPercent + 9 ) / 10 ) ) / 100000 ) / 86400 ) * secPassed ;
return amount;
}
else
{
return (0);
}
}
function setMaxBattlePerDay(uint _maxBattlePerDay) public onlyOwner returns (bool)
{
maxBattlePerDay = _maxBattlePerDay;
return true;
}
event initiateBattleEv(address caller,uint256 _tokenID,uint256 _userSeed,uint256 battleInfoIndex, uint256 blockNo);
function initiateBattle(uint256 _tokenID, uint256 _userSeed) public payable returns (uint256 battleID)
{
require(!globalHalt, "paused by admin");
require(msg.value == battleFees, "Invalid fees amount");
address caller = niftyMoji(niftyMojiContractAddress).ownerOf(_tokenID);
require(!blackListedUser[caller], "you are not allowed");
require(!blackListedToken[_tokenID], "this token is blacklisted");
require(caller == msg.sender,"caller is not the owner of this tokenID");
require( userBattleCount[caller] <= maxBattlePerDay, "enough for the day");
if(BattleCountEndTime[caller] >= now )
{
userBattleCount[caller] += 1;
}
else
{
BattleCountEndTime[caller] = now + 86400;
userBattleCount[caller] = 1;
}
battleInfo memory temp;
temp.tokenID = _tokenID;
temp.userSeed = _userSeed;
temp.blockNo = block.number;
battleInfos.push(temp);
//emitting Transfer event
battleID = battleInfos.length - 1;
address(owner).transfer(msg.value);
emit initiateBattleEv(caller, _tokenID, _userSeed, battleID,block.number );
return battleID;
}
event finishBattleEv(address user, uint256 battleInfoIndex, uint256 _tokenID, uint256 randomToken, uint256 mintAmount);
function finishBattle(uint256 _battleInfoIndex,bytes32 blockHashValue) public onlySigner returns (bool) // returns winning amount minted
{
require(_battleInfoIndex < battleInfos.length, "Invalid Battle Index");
require(battleInfos[_battleInfoIndex].rewardAmount == 0, "Already finished");
uint256 _tokenID = battleInfos[_battleInfoIndex].tokenID;
uint256 _userSeed = battleInfos[_battleInfoIndex].userSeed;
address caller = niftyMoji(niftyMojiContractAddress).ownerOf(_tokenID);
bool success;
uint256 randomToken;
address randomTokenUser;
for(uint256 i=0;i<50;i++)
{
randomToken = uint256(keccak256(abi.encodePacked(blockHashValue, _userSeed))) % niftyMoji(niftyMojiContractAddress).totalSupply() + 1;
randomTokenUser = niftyMoji(niftyMojiContractAddress).ownerOf(_tokenID);
if(blackListedToken[randomToken] || blackListedUser[randomTokenUser])
{
_userSeed += block.number%8;
}
else
{
success = true;
break;
}
}
require(success, "try again");
(uint256 powerPercent,uint256 luckPercent ) = niftyMoji(niftyMojiContractAddress).powerNLucks(_tokenID);
(uint256 powerPercent2,uint256 luckPercent2 ) = niftyMoji(niftyMojiContractAddress).powerNLucks(randomToken);
uint256 mintAmount;
if( powerPercent + luckPercent > powerPercent2 + luckPercent2)
{
mintAmount = battleWinReward ;
}
else
{
mintAmount = battleLooseReward;
}
battleInfos[_battleInfoIndex].rewardAmount = mintAmount;
battleInfos[_battleInfoIndex].opponentTokenID = randomToken;
emit finishBattleEv(caller,_battleInfoIndex, _tokenID, randomToken, mintAmount);
balanceOf[caller] = balanceOf[caller].add(mintAmount);
totalSupply = totalSupply.add(mintAmount);
totalMintedForTokenId[_tokenID] = totalMintedForTokenId[_tokenID].add(mintAmount);
totalMintedByBattleForTokenID[_tokenID] = totalMintedByBattleForTokenID[_tokenID].add(mintAmount);
dayTracker[_tokenID] = now;
lastFinishedIndex = _battleInfoIndex;
emit Transfer(address(0),caller,mintAmount);
return true;
}
function multipleFinishBattle (bytes32[] memory _blockHashValue) public onlySigner returns(bool)
{
uint i;
for(i=0;i<_blockHashValue.length;i++)
{
require(finishBattle(lastFinishedIndex + i + 1,_blockHashValue[i]),"could not fihish battle");
}
return true;
}
function lastUnFinishedIndexNBlock() public view returns (uint256 lastUnFinishedIndex, uint256 blockNo)
{
uint len = battleInfos.length-1;
if(len > lastFinishedIndex)
{
return (lastFinishedIndex +1, battleInfos[lastFinishedIndex +1].blockNo);
}
else
{
return (0,0);
}
}
function setNiftyMojiContractAddress(address _niftyMojiContractAddress) public onlyOwner returns(bool)
{
niftyMojiContractAddress = _niftyMojiContractAddress;
return true;
}
function setMintingMultiplier(uint256 _mintingMultiplier) public onlyOwner returns (bool)
{
mintingMultiplier = _mintingMultiplier;
return true;
}
function setbattleFees(uint256 _battleFees) public onlyOwner returns(bool)
{
battleFees = _battleFees;
return true;
}
function setMintTokenFee(uint256 _mintTokenFee) public onlyOwner returns(bool)
{
mintTokenFee = _mintTokenFee;
return true;
}
function setBattleReward(uint256 winReward, uint256 looseReward) public onlyOwner returns(bool)
{
battleWinReward = winReward;
battleLooseReward = looseReward;
return true;
}
/**
* If global halt is off, then this funtion will on it. And vice versa
* This also change safeguard for token movement status
*/
function changeGlobalHalt() onlyOwner public returns(bool) {
if (globalHalt == false){
globalHalt = true;
}
else{
globalHalt = false;
}
return true;
}
/**
* Function to check Ether balance in this contract
*/
function totalEtherbalanceContract() public view returns(uint256){
return address(this).balance;
}
/**
* Just in rare case, owner wants to transfer Ether from contract to owner address
*/
function manualWithdrawEtherAdmin(uint64 Amount) public onlyOwner returns (bool){
require (address(this).balance >= Amount);
address(owner).transfer(Amount);
withdrawnByAdmin = withdrawnByAdmin.add(Amount);
return true;
}
}
{
"compilationTarget": {
"MEXPToken.sol": "MEXPToken"
},
"evmVersion": "istanbul",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"battleInfoIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"randomToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"finishBattleEv","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_userSeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"battleInfoIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNo","type":"uint256"}],"name":"initiateBattleEv","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"BattleCountEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"battleInfos","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"userSeed","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"blockNo","type":"uint256"},{"internalType":"uint256","name":"opponentTokenID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleLooseReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleWinReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"blackListToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"blackListUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blackListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blackListedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"changeGlobalHalt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"changeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dayTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_battleInfoIndex","type":"uint256"},{"internalType":"bytes32","name":"blockHashValue","type":"bytes32"}],"name":"finishBattle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"globalHalt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"_userSeed","type":"uint256"}],"name":"initiateBattle","outputs":[{"internalType":"uint256","name":"battleID","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lastFinishedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUnFinishedIndexNBlock","outputs":[{"internalType":"uint256","name":"lastUnFinishedIndex","type":"uint256"},{"internalType":"uint256","name":"blockNo","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint64","name":"Amount","type":"uint64"}],"name":"manualWithdrawEtherAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxBattlePerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"mintToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"mintTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"mintTokenOwnerOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_blockHashValue","type":"bytes32[]"}],"name":"multipleFinishBattle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"niftyMojiContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"removeTokenFromBlackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeUserFromBlackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"winReward","type":"uint256"},{"internalType":"uint256","name":"looseReward","type":"uint256"}],"name":"setBattleReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxBattlePerDay","type":"uint256"}],"name":"setMaxBattlePerDay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_mintTokenFee","type":"uint256"}],"name":"setMintTokenFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_mintingMultiplier","type":"uint256"}],"name":"setMintingMultiplier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_niftyMojiContractAddress","type":"address"}],"name":"setNiftyMojiContractAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_battleFees","type":"uint256"}],"name":"setbattleFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherbalanceContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMintedByBattleForTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMintedByOwnerForTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMintedByUserForTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMintedForTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBattleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"viewAmountIfIMintNow","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawnByAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]