Mist Token - Smart Contract Audit Report

Summary

Mist Token Audit Report Mist is a new project aiming to build a game that involves NFTs.

For this audit, we analyzed Mist's token smart contract, provided to us by the team. Please note we have not reviewed the project's upcoming NFT platform.

Notes on the contract:
  • The total supply of the token is 1 billion.
  • When the token is deployed, all of the tokens will be given to the project team.
  • No mint or burn functions are accessible, though the team can send tokens to 0x0...dead to decrease the circulating supply.
  • No ownership-restricted functions are present.
  • The token properly conforms to the ERC20 standard.
  • The contract utilizes SafeMath to prevent overflow issues.
  • Gas can be saved via marking some functions external instead of public; and by marking some variables constant.
Audit Findings Summary
  • No external threats were identified.
  • Upon deployment the team will hold the total supply.
  • As with any presale, ensure trust in the team prior to investing.
  • KYC: No.
  • Date: March 31st, 2021

Vulnerability CategoryNotesResult
Arbitrary Storage WriteN/APASS
Arbitrary JumpN/APASS
Delegate Call to Untrusted ContractN/APASS
Dependence on Predictable VariablesN/APASS
Deprecated OpcodesN/APASS
Ether ThiefN/APASS
ExceptionsN/APASS
External CallsN/APASS
Integer Over/UnderflowN/APASS
Multiple SendsN/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
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Int] ERC20 
    - [Ext] balanceOf
    - [Ext] allowance
    - [Ext] transfer #
    - [Ext] transferFrom #
    - [Ext] approve #

 + [Lib] SafeMath 
    - [Int] mul
    - [Int] div
    - [Int] sub
    - [Int] add

 +  Mist (ERC20)
    - [Pub]  #
    - [Pub] decreaseApproval #
    - [Pub] owner
    - [Pub] balanceOf
    - [Pub] allowance
    - [Pub] transferFrom #
    - [Pub] transfer #
    - [Pub] increaseApproval #
    - [Pub] approve #
							

Click here to download the source code as a .sol file.


pragma solidity ^0.5.1;
interface ERC20 {

    function balanceOf(address _owner) external view returns (uint256);

    function allowance(address _owner, address _spender) external view returns (uint256);

    function transfer(address _to, uint256 _value) external returns (bool);

    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);

    function approve(address _spender, uint256 _value) external returns (bool);

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

    event Approval(address indexed owner, address indexed spender, uint256 value);

}
library SafeMath {

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {

            return 0;

        }

        uint256 c = a * b;

        assert(c / a == b);

        return c;

    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {

        uint256 c = a / b;

        return c;

    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {

        assert(b <= a);

        return a - b;

    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {

        uint256 c = a + b;

        assert(c >= a);

        return c;

    }

}
contract Mist is ERC20 {

    using SafeMath for uint256;

    address private creator;

    uint256 private constant decimalFactor = 10 ** uint256(decimals);

    uint256 public constant totalSupply = 1000000000 * decimalFactor;

    string public name = "Mist";

    string public symbol = "MIST";

    uint8 public constant decimals = 18;

    bool public minted = false;

    mapping (address => uint256) balances;

    mapping (address => mapping (address => uint256)) internal allowed;
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    

    constructor() public {

        creator = msg.sender;

        balances[msg.sender] = totalSupply;

        emit Transfer(address(0), msg.sender, totalSupply);

    }

    

    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {

        uint oldValue = allowed[msg.sender][_spender];

        if (_subtractedValue > oldValue) {

            allowed[msg.sender][_spender] = 0;

        } else {

            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);

        }

        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);

        return true;

    }

    

    function owner() public view returns (address) {

        return creator;

    }

    

    function balanceOf(address _owner) public view returns (uint256 balance) {

        return balances[_owner];

    }
    function allowance(address _owner, address _spender) public view returns (uint256) {

        return allowed[_owner][_spender];

    }
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {

        require(_to != address(0));

        require(_value <= balances[_from]);

        require(_value <= allowed[_from][msg.sender]);
        balances[_from] = balances[_from].sub(_value);

        balances[_to] = balances[_to].add(_value);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);

        emit Transfer(_from, _to, _value);

        return true;

    }
    function transfer(address _to, uint256 _value) public returns (bool) {

        require(_to != address(0));

        require(_value <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(_value);

        balances[_to] = balances[_to].add(_value);

        emit Transfer(msg.sender, _to, _value);

        return true;

    }
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {

        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);

        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);

        return true;

    }
    function approve(address _spender, uint256 _value) public returns (bool) {

        allowed[msg.sender][_spender] = _value;

        emit Approval(msg.sender, _spender, _value);

        return true;

    }

}