contract ERC20Interface
{
  /* Structs */

  /* State Valiables */

  /* Events */
  // Triggered when tokens are transferred.
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 _value);

  // Triggered whenever approve(address _spender, uint256 _value) is called.
  event Approval(
    address indexed _owner,
    address indexed _spender,
    uint256 _value);

  /* Modifiers */

  /* Function Abstracts */

  /// @return The total supply of tokens
  function totalSupply() public constant returns (uint256);

  /// @param _addr The address of a token holder
  /// @return The amount of tokens held by `_addr`
  function balanceOf(address _addr) public constant returns (uint256);

  /// @param _owner The address of a token holder
  /// @param _spender the address of a third-party
  /// @return The amount of tokens the `_spender` is allowed to transfer
  function allowance(address _owner, address _spender) public constant
  returns (uint256);

  /// @notice Send `_amount` of tokens from `msg.sender` to `_to`
  /// @param _to The address of the recipient
  /// @param _amount The amount of tokens to transfer
  function transfer(address _to, uint256 _amount) public returns (bool);

  /// @notice Send `_amount` of tokens from `_from` to `_to` on the condition
  /// it is approved by `_from`
  /// @param _from The address of the sender
  /// @param _to The address of the recipient
  /// @param _amount The amount of tokens to transfer
  function transferFrom(address _from, address _to, uint256 _amount)
  public returns (bool);

  /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on
  /// its behalf
  /// @param _spender The address of the approved spender
  /// @param _amount The amount of tokens to transfer
  function approve(address _spender, uint256 _amount) public returns (bool);
}
// ERC20 Standard Token Interface with safe maths and reentry protection
function totalSupply() public constant returns (uint256);

/// @return The total supply of tokens