DogeArmy - Audit Report

Summary

DogeArmy is a new protocol that allows users to purchase NFTs.

For this audit, we reviewed the DogeArmy contract using code that was provided to us by the team.

Notes on the Contract:
  • The maximum supply is set to 10,000 DogeArmy NFTs.
  • Any user can mint up to 20 DogeArmy NFTs per transaction in exchange for ETH. The standard price per NFT can be modified by the owner at any time.
  • The owner can enable a Presale mode in the contract which allows users to purchase each NFT for 0.1 ether. A user must own a minimum token balance (determined by the owner) of $SHIBDOGE in order for a purchase to successfully occur. A user cannot purchase more than 10 NFTs total during Presale mode.
  • Users must exercise caution as to enter the exact amount of ETH required for purchasing their desired amount of NFTs. Any excess ETH will be accepted and sent directly to the project team.
  • As the contract is implemented with Solidity v0.8.11, it is protected from overflows/underflows.
Ownership Controls:
  • The owner can modify the standard price per NFT to any value at any time.
  • The owner can modify the minimum amount of $SHIBDOGE tokens a user must hold in order to purchase NFTs in Presale mode.
  • The owner can enable/disable both Presale mode and Standard mode of the contract at any time. If both modes are disabled, all purchasing is essentially paused.
  • The owner can mint up to 100 NFTs total (10 per transaction) to any address at any time at no cost.
  • The owner can withdraw all of the ETH from the contract address at any time.
  • The owner can update the BaseURI of any NFT that has not been frozen by the owner. Once an NFT has been frozen by the owner it cannot be un-frozen.
Audit Findings Summary
  • No external threats were identified.
  • Users must exercise caution as to enter the exact amount of ETH required for purchasing their desired amount of NFTs. Any excess ETH will be accepted and sent directly to the project team.
  • Please ensure trust in the team as they will receive the ETH from NFT purchases.
  • Date: January 10th, 2022

Audit Results

Vulnerability CategoryNotesResult
Arbitrary Storage WriteN/APASS
Arbitrary JumpN/APASS
Centralization of Control
  • The owner can set the standard price per NFT to any value at any time.
  • The owner can pause all purchasing at any time.
  • PASS
    Delegate Call to Untrusted ContractN/APASS
    Dependence on Predictable VariablesN/APASS
    Deprecated OpcodesN/APASS
    Ether ThiefN/APASS
    ExceptionsN/APASS
    External CallsN/APASS
    Flash LoansN/APASS
    Integer Over/UnderflowN/APASS
    Multiple SendsN/APASS
    OraclesN/APASS
    SuicideN/APASS
    State Change External CallsN/APASS
    Unchecked RetvalN/APASS
    User Supplied AssertionN/APASS
    Critical Solidity CompilerN/APASS
    Overall Contract Safety PASS

    ERC20 Token Graph

    Multi-file Token

    
     ($) = payable function
     # = non-constant function
     
     +  Context 
        - [Int] _msgSender
        - [Int] _msgData
    
     +  Ownable (Context)
        - [Pub]  #
        - [Pub] owner
        - [Pub] renounceOwnership #
           - modifiers: onlyOwner
        - [Pub] transferOwnership #
           - modifiers: onlyOwner
        - [Int] _transferOwnership #
    
     + [Int] IERC165 
        - [Ext] supportsInterface
    
     + [Int] IERC721 (IERC165)
        - [Ext] balanceOf
        - [Ext] ownerOf
        - [Ext] safeTransferFrom #
        - [Ext] transferFrom #
        - [Ext] approve #
        - [Ext] getApproved
        - [Ext] setApprovalForAll #
        - [Ext] isApprovedForAll
        - [Ext] safeTransferFrom #
    
     + [Int] IERC721Receiver 
        - [Ext] onERC721Received #
    
     + [Int] IERC721Metadata (IERC721)
        - [Ext] name
        - [Ext] symbol
        - [Ext] tokenURI
    
     + [Lib] Address 
        - [Int] isContract
        - [Int] sendValue #
        - [Int] functionCall #
        - [Int] functionCall #
        - [Int] functionCallWithValue #
        - [Int] functionCallWithValue #
        - [Int] functionStaticCall
        - [Int] functionStaticCall
        - [Int] functionDelegateCall #
        - [Int] functionDelegateCall #
        - [Int] verifyCallResult
    
     + [Lib] Strings 
        - [Int] toString
        - [Int] toHexString
        - [Int] toHexString
    
     +  ERC165 (IERC165)
        - [Pub] supportsInterface
    
     +  ERC721 (Context, ERC165, IERC721, IERC721Metadata)
        - [Pub]  #
        - [Pub] supportsInterface
        - [Pub] balanceOf
        - [Pub] ownerOf
        - [Pub] name
        - [Pub] symbol
        - [Pub] tokenURI
        - [Int] _baseURI
        - [Pub] approve #
        - [Pub] getApproved
        - [Pub] setApprovalForAll #
        - [Pub] isApprovedForAll
        - [Pub] transferFrom #
        - [Pub] safeTransferFrom #
        - [Pub] safeTransferFrom #
        - [Int] _safeTransfer #
        - [Int] _exists
        - [Int] _isApprovedOrOwner
        - [Int] _safeMint #
        - [Int] _safeMint #
        - [Int] _mint #
        - [Int] _burn #
        - [Int] _transfer #
        - [Int] _approve #
        - [Int] _setApprovalForAll #
        - [Prv] _checkOnERC721Received #
        - [Int] _beforeTokenTransfer #
        - [Int] _afterTokenTransfer #
    
     + [Int] ERC20 
        - [Ext] balanceOf
    
     +  DogeArmy (ERC721, Ownable)
        - [Pub]  #
           - modifiers: ERC721
        - [Pub] mint ($)
        - [Pub] mintPresale ($)
        - [Ext] reserve #
           - modifiers: onlyOwner
        - [Ext] setMinTokenThreshold #
           - modifiers: onlyOwner
        - [Ext] setPublicPrice #
           - modifiers: onlyOwner
        - [Ext] togglePreSale #
           - modifiers: onlyOwner
        - [Ext] togglePublicSale #
           - modifiers: onlyOwner
        - [Ext] freezeURI #
           - modifiers: onlyOwner
        - [Ext] withdraw #
           - modifiers: onlyOwner
        - [Ext] reveal #
           - modifiers: onlyOwner
        - [Ext] setUnrevealedURI #
           - modifiers: onlyOwner
        - [Ext] setBaseURI #
           - modifiers: onlyOwner
        - [Pub] tokenURI
        - [Int] _baseURI