Morpheus Game - Smart Contract Audit Report

Summary

Morpheus Game Morpheus Game is a social experiment within the cypto sphere where users can bet the platform's native token by selecting a color 'pill.' A pseudo-random function is called to select a 'pill' that will win the game. Winners have their tokens doubled, and losers forfeit their tokens to the rewards pool; which rewards users who hold tokens and participate in the game. Users can also stake their tokens to earn Rabbits NFTs as additional rewards, tradeable through a on-chain marketplace.

We audited Morpheus Game's contracts at commit 68a2cf658af251b66038c6b7755dc9b8247c891c on GitHub.
  • randomOracle is deployed at 0xCFc2d34b63d0e2fC623eEb4c0d7943e341140810
  • MorpheusGameController is deployed at 0xc0700098433F9dBC5B69fa3E972BbC07245291a8
  • Crowdsale is deployed at 0x326a17ae8d5039ad19f31de6e1d118f530be5f70
  • The Game Controller address in the Oracle and token address in the Game Controller have been properly set after deployment.
  • Audit Findings:
    • At deployment, transfers of the token are prohibited from any address except the deployer. One hour after the crowdsale concludes, token transfers will automatically unlock.
    • After the ecosystem is set up, Morpheus Token can only be minted by the GameController to mint tokens to the winners of the game. The total supply of tokens is capped at 500 million with 3M minted intended to be used for marketing use and ~9M intended for providing liquidity when the crowdsale ends. Anyone can burn their own tokens.
    • The logic that manages the randomness was run on an off-chain NodeJS server. After discussions with the team, they have decided to improve this via using an on-chain pseudo-random Oracle contract instead. While this is an improvement over off-chain code, this randomness contract relies upon predictable environment variables, which have the possibility to be manipulated by miners (SWC-120). This is extremley unlikely to occur and would require substantial effort by malicious miners.
    • This project was funded from anonymous sources.

    • Date: December 3rd, 2020.

    We ran over 400,000 transactions interacting with this suite of contracts on a test blockchain to determine these results.
    Date: December 3rd, 2020
    Vulnerability CategoryNotesResult
    Arbitrary Storage WriteN/APASS
    Arbitrary JumpN/APASS
    Delegate Call to Untrusted ContractN/APASS
    Dependence on Predictable VariablesThe randomOracle relies on predictable environment variables. This is not best practice,
    but the probability of miners maliciously changing these variables is extremley low.
    Warning
    Deprecated OpcodesN/APASS
    Ether/Token ThiefN/APASS
    ExceptionsN/APASS
    External CallsN/APASS
    Integer Over/UnderflowN/APASS
    Multiple SendsN/APASS
    OracleThe project uses a pseudo random contract to determine winners of the game as opposed to verifiably random input.
    Chainlink's VRF is the emerging industry standard, but the team's contract will provide randomness.
    Warning
    SuicideN/APASS
    State Change External CallsN/APASS
    Unchecked RetvalN/APASS
    User Supplied AssertionN/APASS
    Critical Solidity CompilerN/APASS
    Overall Contract Safety ----->PASS

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public
    
     +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     +  ERC20 (Context, IERC20)
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Int] _transfer #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _approve #
        - [Int] _burnFrom #
    
     +  ERC20Detailed (IERC20)
        - [Pub]  #
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
    
     + [Lib] Roles 
        - [Int] add #
        - [Int] remove #
        - [Int] has
    
     +  MinterRole (Context)
        - [Int]  #
        - [Pub] isMinter
        - [Pub] renounceMinter #
        - [Int] _addMinter #
        - [Int] _removeMinter #
    
     +  ERC20Mintable (ERC20, MinterRole)
        - [Pub] mint #
           - modifiers: onlyMinter
    
     +  ERC20Capped (ERC20Mintable)
        - [Pub]  #
        - [Pub] cap
        - [Int] _mint #
    
     +  MorpheusToken (ERC20, ERC20Detailed, ERC20Capped)
        - [Pub]  #
           - modifiers: ERC20Detailed,ERC20Capped
        - [Pub] eraseDeployerAddress #
           - modifiers: onlyDeployer
        - [Pub] unlock #
           - modifiers: onlyDeployer
        - [Pub] lock #
           - modifiers: onlyDeployer
        - [Pub] transfer #
        - [Pub] transferFrom #
        - [Pub] setGameControllerAddress #
           - modifiers: onlyDeployer
        - [Pub] burnTokens #
        - [Pub] mintTokensForWinner #
           - modifiers: onlyGameController
    
     + [Int] IERC165 
        - [Ext] supportsInterface
    
     +  IERC721 (IERC165)
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] safeTransferFrom #
        - [Pub] transferFrom #
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] safeTransferFrom #
    
     +  IERC721Receiver 
        - [Pub] onERC721Received #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] toPayable
        - [Int] sendValue #
    
     + [Lib] Counters 
        - [Int] current
        - [Int] increment #
        - [Int] decrement #
    
     +  ERC165 (IERC165)
        - [Int]  #
        - [Ext] supportsInterface
        - [Int] _registerInterface #
    
     +  ERC721 (Context, ERC165, IERC721)
        - [Pub]  #
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] transferFrom #
        - [Pub] safeTransferFrom #
        - [Pub] safeTransferFrom #
        - [Int] _safeTransferFrom #
        - [Int] _exists
        - [Int] _isApprovedOrOwner
        - [Int] _safeMint #
        - [Int] _safeMint #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _burn #
        - [Int] _transferFrom #
        - [Int] _checkOnERC721Received #
        - [Prv] _clearApproval #
    
     +  IERC721Enumerable (IERC721)
        - [Pub] totalSupply
        - [Pub] tokenOfOwnerByIndex
        - [Pub] tokenByIndex
    
     +  ERC721Enumerable (Context, ERC165, ERC721, IERC721Enumerable)
        - [Pub]  #
        - [Pub] tokenOfOwnerByIndex
        - [Pub] totalSupply
        - [Pub] tokenByIndex
        - [Int] _transferFrom #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _tokensOfOwner
        - [Prv] _addTokenToOwnerEnumeration #
        - [Prv] _addTokenToAllTokensEnumeration #
        - [Prv] _removeTokenFromOwnerEnumeration #
        - [Prv] _removeTokenFromAllTokensEnumeration #
    
     +  IERC721Metadata (IERC721)
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
    
     +  ERC721Metadata (Context, ERC165, ERC721, IERC721Metadata)
        - [Pub]  #
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
        - [Int] _setTokenURI #
        - [Int] _setBaseURI #
        - [Ext] baseURI
        - [Int] _burn #
    
     +  ERC721Full (ERC721, ERC721Enumerable, ERC721Metadata)
        - [Pub]  #
           - modifiers: ERC721Metadata
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] isOwner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Int] _transferOwnership #
    
     +  Rabbits (ERC721Full, Ownable)
        - [Pub]  #
           - modifiers: ERC721Full
        - [Pub] setGameAddress #
           - modifiers: onlyOwner
        - [Pub] setFarmingAddress #
           - modifiers: onlyOwner
        - [Pub] mintRabbit #
           - modifiers: onlyFarmingController
        - [Pub] burnRabbitsTrilogy #
           - modifiers: onlyGameController
    
     +  randomOracle 
        - [Pub]  #
        - [Prv] _getRandom #
        - [Ext] getRandom #
           - modifiers: onlyGame
        - [Prv] returnResult #
    
     +  MorpheusGameController (Ownable)
        - [Pub]  #
        - [Pub] setMorpheusToken #
           - modifiers: onlyOwner
        - [Pub] setRabbitsToken #
           - modifiers: onlyOwner
        - [Pub] setMinimumBalanceForClaim #
           - modifiers: onlyOwner
        - [Pub] setStackingValue #
           - modifiers: onlyOwner
        - [Pub] getZionStackersNumber
        - [Pub] becomeZionStacker #
        - [Prv] _eraseZionStackers #
        - [Prv] _isStacker
        - [Pub] getGameData
        - [Pub] getPersonnalData
        - [Pub] choosePils ($)
        - [Ext] callback #
        - [Int] _isPlayerInList
        - [Pub] _getKingOfLoosers
        - [Pub] claimRewards #
        - [Pub] claimMyReward #
        - [Pub] _getClaimerPercentage
        - [Pub] _getBurnPercentage
        - [Prv] _setRewards #
        - [Prv] _deleteAllPlayersFromPeriod #
        - [Prv] _transferToZionStackers #
        - [Prv] _transferToKingOfMountain #
        - [Prv] _transferToKingOfLoosers #
        - [Pub] superClaim #
    
      
    							

    Function Graph

    Smart Contract Graph

    Functions Overview

    
    
      +  randomOracle 
        - [Pub]  #
        - [Prv] _getRandom #
        - [Ext] getRandom #
           - modifiers: onlyGame
        - [Prv] returnResult #
    
    							

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public
    
     +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     +  ERC20 (Context, IERC20)
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Int] _transfer #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _approve #
        - [Int] _burnFrom #
    
     +  ERC20Detailed (IERC20)
        - [Pub]  #
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
    
     + [Lib] Roles 
        - [Int] add #
        - [Int] remove #
        - [Int] has
    
     +  MinterRole (Context)
        - [Int]  #
        - [Pub] isMinter
        - [Pub] renounceMinter #
        - [Int] _addMinter #
        - [Int] _removeMinter #
    
     +  ERC20Mintable (ERC20, MinterRole)
        - [Pub] mint #
           - modifiers: onlyMinter
    
     +  ERC20Capped (ERC20Mintable)
        - [Pub]  #
        - [Pub] cap
        - [Int] _mint #
    
     +  MorpheusToken (ERC20, ERC20Detailed, ERC20Capped)
        - [Pub]  #
           - modifiers: ERC20Detailed,ERC20Capped
        - [Pub] eraseDeployerAddress #
           - modifiers: onlyDeployer
        - [Pub] unlock #
           - modifiers: onlyDeployer
        - [Pub] lock #
           - modifiers: onlyDeployer
        - [Pub] transfer #
        - [Pub] transferFrom #
        - [Pub] setGameControllerAddress #
           - modifiers: onlyDeployer
        - [Pub] burnTokens #
        - [Pub] mintTokensForWinner #
           - modifiers: onlyGameController
    							

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public
    
     +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] toPayable
        - [Int] sendValue #
    
     + [Lib] SafeERC20 
        - [Int] safeTransfer #
        - [Int] safeTransferFrom #
        - [Int] safeApprove #
        - [Int] safeIncreaseAllowance #
        - [Int] safeDecreaseAllowance #
        - [Prv] callOptionalReturn #
    
     +  ReentrancyGuard 
        - [Int]  #
    
     +  Crowdsale (Context, ReentrancyGuard)
        - [Pub]  #
        - [Ext]  ($)
        - [Pub] token
        - [Pub] wallet
        - [Pub] rate
        - [Pub] weiRaised
        - [Pub] buyTokens ($)
           - modifiers: nonReentrant
        - [Int] _preValidatePurchase
        - [Int] _postValidatePurchase
        - [Int] _deliverTokens #
        - [Int] _processPurchase #
        - [Int] _updatePurchasingState #
        - [Int] _getTokenAmount
        - [Int] _forwardFunds #
    
     +  CappedCrowdsale (Crowdsale)
        - [Pub]  #
        - [Pub] cap
        - [Pub] capReached
        - [Int] _preValidatePurchase
    
     +  TimedCrowdsale (Crowdsale)
        - [Pub]  #
        - [Pub] openingTime
        - [Pub] closingTime
        - [Pub] isOpen
        - [Pub] hasClosed
        - [Int] _preValidatePurchase
           - modifiers: onlyWhileOpen
        - [Int] _extendTime #
    
     +  ERC20 (Context, IERC20)
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Int] _transfer #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _approve #
        - [Int] _burnFrom #
    
     +  ERC20Detailed (IERC20)
        - [Pub]  #
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
    
     + [Lib] Roles 
        - [Int] add #
        - [Int] remove #
        - [Int] has
    
     +  MinterRole (Context)
        - [Int]  #
        - [Pub] isMinter
        - [Pub] renounceMinter #
        - [Int] _addMinter #
        - [Int] _removeMinter #
    
     +  ERC20Mintable (ERC20, MinterRole)
        - [Pub] mint #
           - modifiers: onlyMinter
    
     +  ERC20Capped (ERC20Mintable)
        - [Pub]  #
        - [Pub] cap
        - [Int] _mint #
    
     +  MorpheusToken (ERC20, ERC20Detailed, ERC20Capped)
        - [Pub]  #
           - modifiers: ERC20Detailed,ERC20Capped
        - [Pub] eraseDeployerAddress #
           - modifiers: onlyDeployer
        - [Pub] unlock #
           - modifiers: onlyDeployer
        - [Pub] lock #
           - modifiers: onlyDeployer
        - [Pub] transfer #
        - [Pub] transferFrom #
        - [Pub] setGameControllerAddress #
           - modifiers: onlyDeployer
        - [Pub] burnTokens #
        - [Pub] mintTokensForWinner #
           - modifiers: onlyGameController
    
     +  MintedCrowdsale (Crowdsale)
        - [Int] _deliverTokens #
    
     +  MGTCrowdsale (Crowdsale, TimedCrowdsale, CappedCrowdsale, MintedCrowdsale)
        - [Pub]  #
           - modifiers: Crowdsale,TimedCrowdsale,CappedCrowdsale
    							

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public
    
      +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] isOwner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Int] _transferOwnership #
    
     + [Int] IERC165 
        - [Ext] supportsInterface
    
     +  IERC721 (IERC165)
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] safeTransferFrom #
        - [Pub] transferFrom #
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] safeTransferFrom #
    
     +  IERC721Receiver 
        - [Pub] onERC721Received #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] toPayable
        - [Int] sendValue #
    
     + [Lib] Counters 
        - [Int] current
        - [Int] increment #
        - [Int] decrement #
    
     +  ERC165 (IERC165)
        - [Int]  #
        - [Ext] supportsInterface
        - [Int] _registerInterface #
    
     +  ERC721 (Context, ERC165, IERC721)
        - [Pub]  #
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] transferFrom #
        - [Pub] safeTransferFrom #
        - [Pub] safeTransferFrom #
        - [Int] _safeTransferFrom #
        - [Int] _exists
        - [Int] _isApprovedOrOwner
        - [Int] _safeMint #
        - [Int] _safeMint #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _burn #
        - [Int] _transferFrom #
        - [Int] _checkOnERC721Received #
        - [Prv] _clearApproval #
    
     +  IERC721Enumerable (IERC721)
        - [Pub] totalSupply
        - [Pub] tokenOfOwnerByIndex
        - [Pub] tokenByIndex
    
     +  ERC721Enumerable (Context, ERC165, ERC721, IERC721Enumerable)
        - [Pub]  #
        - [Pub] tokenOfOwnerByIndex
        - [Pub] totalSupply
        - [Pub] tokenByIndex
        - [Int] _transferFrom #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _tokensOfOwner
        - [Prv] _addTokenToOwnerEnumeration #
        - [Prv] _addTokenToAllTokensEnumeration #
        - [Prv] _removeTokenFromOwnerEnumeration #
        - [Prv] _removeTokenFromAllTokensEnumeration #
    
     +  IERC721Metadata (IERC721)
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
    
     +  ERC721Metadata (Context, ERC165, ERC721, IERC721Metadata)
        - [Pub]  #
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
        - [Int] _setTokenURI #
        - [Int] _setBaseURI #
        - [Ext] baseURI
        - [Int] _burn #
    
     +  ERC721Full (ERC721, ERC721Enumerable, ERC721Metadata)
        - [Pub]  #
           - modifiers: ERC721Metadata
    
     +  Rabbits (ERC721Full, Ownable)
        - [Pub]  #
           - modifiers: ERC721Full
        - [Pub] setGameAddress #
           - modifiers: onlyOwner
        - [Pub] setFarmingAddress #
           - modifiers: onlyOwner
        - [Pub] mintRabbit #
           - modifiers: onlyFarmingController
        - [Pub] burnRabbitsTrilogy #
           - modifiers: onlyGameController
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     +  ERC20 (Context, IERC20)
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Int] _transfer #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _approve #
        - [Int] _burnFrom #
    
     +  ERC20Detailed (IERC20)
        - [Pub]  #
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
    
     + [Lib] Roles 
        - [Int] add #
        - [Int] remove #
        - [Int] has
    
     +  MinterRole (Context)
        - [Int]  #
        - [Pub] isMinter
        - [Pub] renounceMinter #
        - [Int] _addMinter #
        - [Int] _removeMinter #
    
     +  ERC20Mintable (ERC20, MinterRole)
        - [Pub] mint #
           - modifiers: onlyMinter
    
     +  ERC20Capped (ERC20Mintable)
        - [Pub]  #
        - [Pub] cap
        - [Int] _mint #
    
     +  MorpheusToken (ERC20, ERC20Detailed, ERC20Capped)
        - [Pub]  #
           - modifiers: ERC20Detailed,ERC20Capped
        - [Pub] eraseDeployerAddress #
           - modifiers: onlyDeployer
        - [Pub] unlock #
           - modifiers: onlyDeployer
        - [Pub] lock #
           - modifiers: onlyDeployer
        - [Pub] transfer #
        - [Pub] transferFrom #
        - [Pub] setGameControllerAddress #
           - modifiers: onlyDeployer
        - [Pub] burnTokens #
        - [Pub] mintTokensForWinner #
           - modifiers: onlyGameController
    
     +  MarketPlace (Ownable)
        - [Pub]  #
        - [Pub] setRabbitsToken #
           - modifiers: onlyOwner
        - [Pub] setMorpheusToken #
           - modifiers: onlyOwner
        - [Pub] sellingMyRabbit #
        - [Pub] cancelMySellingInstance #
        - [Pub] buyTheRabbit #
        - [Prv] getSellingIndexOfToken							

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     + [Int] IERC165 
        - [Ext] supportsInterface
    
     +  IERC721 (IERC165)
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] safeTransferFrom #
        - [Pub] transferFrom #
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] safeTransferFrom #
    
     +  IERC721Receiver 
        - [Pub] onERC721Received #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] toPayable
        - [Int] sendValue #
    
     + [Lib] Counters 
        - [Int] current
        - [Int] increment #
        - [Int] decrement #
    
     +  ERC165 (IERC165)
        - [Int]  #
        - [Ext] supportsInterface
        - [Int] _registerInterface #
    
     +  ERC721 (Context, ERC165, IERC721)
        - [Pub]  #
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] transferFrom #
        - [Pub] safeTransferFrom #
        - [Pub] safeTransferFrom #
        - [Int] _safeTransferFrom #
        - [Int] _exists
        - [Int] _isApprovedOrOwner
        - [Int] _safeMint #
        - [Int] _safeMint #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _burn #
        - [Int] _transferFrom #
        - [Int] _checkOnERC721Received #
        - [Prv] _clearApproval #
    
     +  IERC721Enumerable (IERC721)
        - [Pub] totalSupply
        - [Pub] tokenOfOwnerByIndex
        - [Pub] tokenByIndex
    
     +  ERC721Enumerable (Context, ERC165, ERC721, IERC721Enumerable)
        - [Pub]  #
        - [Pub] tokenOfOwnerByIndex
        - [Pub] totalSupply
        - [Pub] tokenByIndex
        - [Int] _transferFrom #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _tokensOfOwner
        - [Prv] _addTokenToOwnerEnumeration #
        - [Prv] _addTokenToAllTokensEnumeration #
        - [Prv] _removeTokenFromOwnerEnumeration #
        - [Prv] _removeTokenFromAllTokensEnumeration #
    
     +  IERC721Metadata (IERC721)
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
    
     +  ERC721Metadata (Context, ERC165, ERC721, IERC721Metadata)
        - [Pub]  #
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
        - [Int] _setTokenURI #
        - [Int] _setBaseURI #
        - [Ext] baseURI
        - [Int] _burn #
    
     +  ERC721Full (ERC721, ERC721Enumerable, ERC721Metadata)
        - [Pub]  #
           - modifiers: ERC721Metadata
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] isOwner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Int] _transferOwnership #
    
     +  Rabbits (ERC721Full, Ownable)
        - [Pub]  #
           - modifiers: ERC721Full
        - [Pub] setGameAddress #
           - modifiers: onlyOwner
        - [Pub] setFarmingAddress #
           - modifiers: onlyOwner
        - [Pub] mintRabbit #
           - modifiers: onlyFarmingController
        - [Pub] burnRabbitsTrilogy #
           - modifiers: onlyGameController							

    Function Graph

    Smart Contract Graph

    Inheritence Chart

    Smart Contract Inheritance

    Functions Overview

    
    
     ($) = payable function
     # = non-constant function
     
     Int = Internal
     Ext = External
     Pub = Public
    
      +  Context 
        - [Int]  #
        - [Int] _msgSender
        - [Int] _msgData
    
     +  Ownable (Context)
        - [Int]  #
        - [Pub] owner
        - [Pub] isOwner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Int] _transferOwnership #
    
     + [Int] IERC165 
        - [Ext] supportsInterface
    
     +  IERC721 (IERC165)
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] safeTransferFrom #
        - [Pub] transferFrom #
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] safeTransferFrom #
    
     +  IERC721Receiver 
        - [Pub] onERC721Received #
    
     + [Lib] SafeMath 
        - [Int] add
        - [Int] sub
        - [Int] sub
        - [Int] mul
        - [Int] div
        - [Int] div
        - [Int] mod
        - [Int] mod
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] toPayable
        - [Int] sendValue #
    
     + [Lib] Counters 
        - [Int] current
        - [Int] increment #
        - [Int] decrement #
    
     +  ERC165 (IERC165)
        - [Int]  #
        - [Ext] supportsInterface
        - [Int] _registerInterface #
    
     +  ERC721 (Context, ERC165, IERC721)
        - [Pub]  #
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] transferFrom #
        - [Pub] safeTransferFrom #
        - [Pub] safeTransferFrom #
        - [Int] _safeTransferFrom #
        - [Int] _exists
        - [Int] _isApprovedOrOwner
        - [Int] _safeMint #
        - [Int] _safeMint #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _burn #
        - [Int] _transferFrom #
        - [Int] _checkOnERC721Received #
        - [Prv] _clearApproval #
    
     +  IERC721Enumerable (IERC721)
        - [Pub] totalSupply
        - [Pub] tokenOfOwnerByIndex
        - [Pub] tokenByIndex
    
     +  ERC721Enumerable (Context, ERC165, ERC721, IERC721Enumerable)
        - [Pub]  #
        - [Pub] tokenOfOwnerByIndex
        - [Pub] totalSupply
        - [Pub] tokenByIndex
        - [Int] _transferFrom #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _tokensOfOwner
        - [Prv] _addTokenToOwnerEnumeration #
        - [Prv] _addTokenToAllTokensEnumeration #
        - [Prv] _removeTokenFromOwnerEnumeration #
        - [Prv] _removeTokenFromAllTokensEnumeration #
    
     +  IERC721Metadata (IERC721)
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
    
     +  ERC721Metadata (Context, ERC165, ERC721, IERC721Metadata)
        - [Pub]  #
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
        - [Int] _setTokenURI #
        - [Int] _setBaseURI #
        - [Ext] baseURI
        - [Int] _burn #
    
     +  ERC721Full (ERC721, ERC721Enumerable, ERC721Metadata)
        - [Pub]  #
           - modifiers: ERC721Metadata
    
     +  Rabbits (ERC721Full, Ownable)
        - [Pub]  #
           - modifiers: ERC721Full
        - [Pub] setGameAddress #
           - modifiers: onlyOwner
        - [Pub] setFarmingAddress #
           - modifiers: onlyOwner
        - [Pub] mintRabbit #
           - modifiers: onlyFarmingController
        - [Pub] burnRabbitsTrilogy #
           - modifiers: onlyGameController
    
     + [Int] IERC20 
        - [Ext] totalSupply
        - [Ext] balanceOf
        - [Ext] transfer #
        - [Ext] allowance
        - [Ext] approve #
        - [Ext] transferFrom #
    
     +  ERC20 (Context, IERC20)
        - [Pub] totalSupply
        - [Pub] balanceOf
        - [Pub] transfer #
        - [Pub] allowance
        - [Pub] approve #
        - [Pub] transferFrom #
        - [Pub] increaseAllowance #
        - [Pub] decreaseAllowance #
        - [Int] _transfer #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _approve #
        - [Int] _burnFrom #
    
     +  ERC20Detailed (IERC20)
        - [Pub]  #
        - [Pub] name
        - [Pub] symbol
        - [Pub] decimals
    
     + [Lib] Roles 
        - [Int] add #
        - [Int] remove #
        - [Int] has
    
     +  MinterRole (Context)
        - [Int]  #
        - [Pub] isMinter
        - [Pub] renounceMinter #
        - [Int] _addMinter #
        - [Int] _removeMinter #
    
     +  ERC20Mintable (ERC20, MinterRole)
        - [Pub] mint #
           - modifiers: onlyMinter
    
     +  ERC20Capped (ERC20Mintable)
        - [Pub]  #
        - [Pub] cap
        - [Int] _mint #
    
     +  MorpheusToken (ERC20, ERC20Detailed, ERC20Capped)
        - [Pub]  #
           - modifiers: ERC20Detailed,ERC20Capped
        - [Pub] eraseDeployerAddress #
           - modifiers: onlyDeployer
        - [Pub] unlock #
           - modifiers: onlyDeployer
        - [Pub] lock #
           - modifiers: onlyDeployer
        - [Pub] transfer #
        - [Pub] transferFrom #
        - [Pub] setGameControllerAddress #
           - modifiers: onlyDeployer
        - [Pub] burnTokens #
        - [Pub] mintTokensForWinner #
           - modifiers: onlyGameController
    
     +  RabbitsFarming (Ownable)
        - [Pub]  #
        - [Pub] setRabbitsToken #
           - modifiers: onlyOwner
        - [Pub] setMorpheusToken #
           - modifiers: onlyOwner
        - [Pub] setFarmingTimeWhiteRabbits #
           - modifiers: onlyOwner
        - [Pub] setFarmingTimeBlueRabbits #
           - modifiers: onlyOwner
        - [Pub] setFarmingTimeRedRabbits #
           - modifiers: onlyOwner
        - [Pub] setAmountForFarmingWhiteRabbit #
           - modifiers: onlyOwner
        - [Pub] setAmountForFarmingBlueRabbit #
           - modifiers: onlyOwner
        - [Pub] setAmountForFarmingRedRabbit #
           - modifiers: onlyOwner
        - [Pub] setRabbitIdCanBeFarmed #
           - modifiers: onlyOwner
        - [Pub] farmingRabbit #
        - [Pub] renounceFarming #
        - [Pub] claimRabbit #
        - [Prv] _rabbitAmount
        - [Prv] _rabbitDuration
        - [Prv] _getSpotIndex
        - [Pub] rabbitsSpot
        - [Pub] mintRabbitFor #
           - modifiers: onlyOwner