ETH Price: $1,991.52 (-1.39%)

Transaction Decoder

Block:
9698096 at Mar-18-2020 09:43:04 PM +UTC
Transaction Fee:
0.0000519465 ETH $0.10
Gas Used:
34,631 Gas / 1.5 Gwei

Emitted Events:

34 HuntToken.Transfer( from=0x61c1c54386932918Dd8BC32ab9732715b8A13976, to=[Sender] 0x1418651aa256b92bdcb024cc66a22a886156fb8a, value=136000000000000000000 )
35 0x8169471a2c85bc748c3b17f11cfea7d372fe77ee.0xa64da754fccf55aa65a1f0128a648633fade3884b236e879ee9f64c78df5d5d7( 0xa64da754fccf55aa65a1f0128a648633fade3884b236e879ee9f64c78df5d5d7, 0x00000000000000000000000061c1c54386932918dd8bc32ab9732715b8a13976, 0x0000000000000000000000001418651aa256b92bdcb024cc66a22a886156fb8a, 0x0000000000000000000000009aab071b4129b083b01cb5a0cb513ce7eca26fa5, 0000000000000000000000000000000000000000000000075f610f70ed200000 )

Account State Difference:

  Address   Before After State Difference Code
0x1418651a...86156fB8a
264.455797885872676861 Eth
Nonce: 16765
264.455745939372676861 Eth
Nonce: 16766
0.0000519465
0x9AAb071B...7ecA26fa5
(Ethermine)
861.594819868301497033 Eth861.594871814801497033 Eth0.0000519465

Execution Trace

0x8169471a2c85bc748c3b17f11cfea7d372fe77ee.258836fe( )
  • 0x61c1c54386932918dd8bc32ab9732715b8a13976.b8dc491b( )
    • HuntToken.balanceOf( owner=0x61c1c54386932918Dd8BC32ab9732715b8A13976 ) => ( 136000000000000000000 )
    • HuntToken.transfer( to=0x1418651aa256B92bDCb024Cc66a22a886156fB8a, value=136000000000000000000 ) => ( True )
      pragma solidity ^0.5.0;
      
      /**
       * @title ERC20 interface
       * @dev see https://github.com/ethereum/EIPs/issues/20
       */
      interface IERC20 {
          function transfer(address to, uint256 value) external returns (bool);
      
          function approve(address spender, uint256 value) external returns (bool);
      
          function transferFrom(address from, address to, uint256 value) external returns (bool);
      
          function totalSupply() external view returns (uint256);
      
          function balanceOf(address who) external view returns (uint256);
      
          function allowance(address owner, address spender) external view returns (uint256);
      
          event Transfer(address indexed from, address indexed to, uint256 value);
      
          event Approval(address indexed owner, address indexed spender, uint256 value);
      }
      
      
      
      /**
       * @title SafeMath
       * @dev Unsigned math operations with safety checks that revert on error
       */
      library SafeMath {
          /**
          * @dev Multiplies two unsigned integers, reverts on overflow.
          */
          function mul(uint256 a, uint256 b) internal pure returns (uint256) {
              // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
              // benefit is lost if 'b' is also tested.
              // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
              if (a == 0) {
                  return 0;
              }
      
              uint256 c = a * b;
              require(c / a == b);
      
              return c;
          }
      
          /**
          * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
          */
          function div(uint256 a, uint256 b) internal pure returns (uint256) {
              // Solidity only automatically asserts when dividing by 0
              require(b > 0);
              uint256 c = a / b;
              // assert(a == b * c + a % b); // There is no case in which this doesn't hold
      
              return c;
          }
      
          /**
          * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
          */
          function sub(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b <= a);
              uint256 c = a - b;
      
              return c;
          }
      
          /**
          * @dev Adds two unsigned integers, reverts on overflow.
          */
          function add(uint256 a, uint256 b) internal pure returns (uint256) {
              uint256 c = a + b;
              require(c >= a);
      
              return c;
          }
      
          /**
          * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
          * reverts when dividing by zero.
          */
          function mod(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b != 0);
              return a % b;
          }
      }
      
      
      /**
       * @title Standard ERC20 token
       *
       * @dev Implementation of the basic standard token.
       * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
       * Originally based on code by FirstBlood:
       * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
       *
       * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
       * all accounts just by listening to said events. Note that this isn't required by the specification, and other
       * compliant implementations may not do it.
       */
      contract ERC20 is IERC20 {
          using SafeMath for uint256;
      
          mapping (address => uint256) private _balances;
      
          mapping (address => mapping (address => uint256)) private _allowed;
      
          uint256 private _totalSupply;
      
          /**
          * @dev Total number of tokens in existence
          */
          function totalSupply() public view returns (uint256) {
              return _totalSupply;
          }
      
          /**
          * @dev Gets the balance of the specified address.
          * @param owner The address to query the balance of.
          * @return An uint256 representing the amount owned by the passed address.
          */
          function balanceOf(address owner) public view returns (uint256) {
              return _balances[owner];
          }
      
          /**
           * @dev Function to check the amount of tokens that an owner allowed to a spender.
           * @param owner address The address which owns the funds.
           * @param spender address The address which will spend the funds.
           * @return A uint256 specifying the amount of tokens still available for the spender.
           */
          function allowance(address owner, address spender) public view returns (uint256) {
              return _allowed[owner][spender];
          }
      
          /**
          * @dev Transfer token for a specified address
          * @param to The address to transfer to.
          * @param value The amount to be transferred.
          */
          function transfer(address to, uint256 value) public returns (bool) {
              _transfer(msg.sender, to, value);
              return true;
          }
      
          /**
           * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
           * Beware that changing an allowance with this method brings the risk that someone may use both the old
           * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
           * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
           * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
           * @param spender The address which will spend the funds.
           * @param value The amount of tokens to be spent.
           */
          function approve(address spender, uint256 value) public returns (bool) {
              require(spender != address(0));
      
              _allowed[msg.sender][spender] = value;
              emit Approval(msg.sender, spender, value);
              return true;
          }
      
          /**
           * @dev Transfer tokens from one address to another.
           * Note that while this function emits an Approval event, this is not required as per the specification,
           * and other compliant implementations may not emit the event.
           * @param from address The address which you want to send tokens from
           * @param to address The address which you want to transfer to
           * @param value uint256 the amount of tokens to be transferred
           */
          function transferFrom(address from, address to, uint256 value) public returns (bool) {
              _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
              _transfer(from, to, value);
              emit Approval(from, msg.sender, _allowed[from][msg.sender]);
              return true;
          }
      
          /**
           * @dev Increase the amount of tokens that an owner allowed to a spender.
           * approve should be called when allowed_[_spender] == 0. To increment
           * allowed value is better to use this function to avoid 2 calls (and wait until
           * the first transaction is mined)
           * From MonolithDAO Token.sol
           * Emits an Approval event.
           * @param spender The address which will spend the funds.
           * @param addedValue The amount of tokens to increase the allowance by.
           */
          function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
              require(spender != address(0));
      
              _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue);
              emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
              return true;
          }
      
          /**
           * @dev Decrease the amount of tokens that an owner allowed to a spender.
           * approve should be called when allowed_[_spender] == 0. To decrement
           * allowed value is better to use this function to avoid 2 calls (and wait until
           * the first transaction is mined)
           * From MonolithDAO Token.sol
           * Emits an Approval event.
           * @param spender The address which will spend the funds.
           * @param subtractedValue The amount of tokens to decrease the allowance by.
           */
          function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
              require(spender != address(0));
      
              _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue);
              emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
              return true;
          }
      
          /**
          * @dev Transfer token for a specified addresses
          * @param from The address to transfer from.
          * @param to The address to transfer to.
          * @param value The amount to be transferred.
          */
          function _transfer(address from, address to, uint256 value) internal {
              require(to != address(0));
      
              _balances[from] = _balances[from].sub(value);
              _balances[to] = _balances[to].add(value);
              emit Transfer(from, to, value);
          }
      
          /**
           * @dev Internal function that mints an amount of the token and assigns it to
           * an account. This encapsulates the modification of balances such that the
           * proper events are emitted.
           * @param account The account that will receive the created tokens.
           * @param value The amount that will be created.
           */
          function _mint(address account, uint256 value) internal {
              require(account != address(0));
      
              _totalSupply = _totalSupply.add(value);
              _balances[account] = _balances[account].add(value);
              emit Transfer(address(0), account, value);
          }
      
          /**
           * @dev Internal function that burns an amount of the token of a given
           * account.
           * @param account The account whose tokens will be burnt.
           * @param value The amount that will be burnt.
           */
          function _burn(address account, uint256 value) internal {
              require(account != address(0));
      
              _totalSupply = _totalSupply.sub(value);
              _balances[account] = _balances[account].sub(value);
              emit Transfer(account, address(0), value);
          }
      
          /**
           * @dev Internal function that burns an amount of the token of a given
           * account, deducting from the sender's allowance for said account. Uses the
           * internal burn function.
           * Emits an Approval event (reflecting the reduced allowance).
           * @param account The account whose tokens will be burnt.
           * @param value The amount that will be burnt.
           */
          function _burnFrom(address account, uint256 value) internal {
              _allowed[account][msg.sender] = _allowed[account][msg.sender].sub(value);
              _burn(account, value);
              emit Approval(account, msg.sender, _allowed[account][msg.sender]);
          }
      }
      
      
      /**
       * @title ERC20Detailed token
       * @dev The decimals are only for visualization purposes.
       * All the operations are done using the smallest and indivisible token unit,
       * just as on Ethereum all the operations are done in wei.
       */
      contract ERC20Detailed is IERC20 {
          string private _name;
          string private _symbol;
          uint8 private _decimals;
      
          constructor (string memory name, string memory symbol, uint8 decimals) public {
              _name = name;
              _symbol = symbol;
              _decimals = decimals;
          }
      
          /**
           * @return the name of the token.
           */
          function name() public view returns (string memory) {
              return _name;
          }
      
          /**
           * @return the symbol of the token.
           */
          function symbol() public view returns (string memory) {
              return _symbol;
          }
      
          /**
           * @return the number of decimals of the token.
           */
          function decimals() public view returns (uint8) {
              return _decimals;
          }
      }
      
      
      
      /**
       * @title Roles
       * @dev Library for managing addresses assigned to a Role.
       */
      library Roles {
          struct Role {
              mapping (address => bool) bearer;
          }
      
          /**
           * @dev give an account access to this role
           */
          function add(Role storage role, address account) internal {
              require(account != address(0));
              require(!has(role, account));
      
              role.bearer[account] = true;
          }
      
          /**
           * @dev remove an account's access to this role
           */
          function remove(Role storage role, address account) internal {
              require(account != address(0));
              require(has(role, account));
      
              role.bearer[account] = false;
          }
      
          /**
           * @dev check if an account has this role
           * @return bool
           */
          function has(Role storage role, address account) internal view returns (bool) {
              require(account != address(0));
              return role.bearer[account];
          }
      }
      
      
      contract MinterRole {
          using Roles for Roles.Role;
      
          event MinterAdded(address indexed account);
          event MinterRemoved(address indexed account);
      
          Roles.Role private _minters;
      
          constructor () internal {
              _addMinter(msg.sender);
          }
      
          modifier onlyMinter() {
              require(isMinter(msg.sender));
              _;
          }
      
          function isMinter(address account) public view returns (bool) {
              return _minters.has(account);
          }
      
          function addMinter(address account) public onlyMinter {
              _addMinter(account);
          }
      
          function renounceMinter() public {
              _removeMinter(msg.sender);
          }
      
          function _addMinter(address account) internal {
              _minters.add(account);
              emit MinterAdded(account);
          }
      
          function _removeMinter(address account) internal {
              _minters.remove(account);
              emit MinterRemoved(account);
          }
      }
      
      
      /**
       * @title ERC20Mintable
       * @dev ERC20 minting logic
       */
      contract ERC20Mintable is ERC20, MinterRole {
          /**
           * @dev Function to mint tokens
           * @param to The address that will receive the minted tokens.
           * @param value The amount of tokens to mint.
           * @return A boolean that indicates if the operation was successful.
           */
          function mint(address to, uint256 value) public onlyMinter returns (bool) {
              _mint(to, value);
              return true;
          }
      }
      
      
      /**
       * @title Burnable Token
       * @dev Token that can be irreversibly burned (destroyed).
       */
      contract ERC20Burnable is ERC20 {
          /**
           * @dev Burns a specific amount of tokens.
           * @param value The amount of token to be burned.
           */
          function burn(uint256 value) public {
              _burn(msg.sender, value);
          }
      
          /**
           * @dev Burns a specific amount of tokens from the target address and decrements allowance
           * @param from address The address which you want to send tokens from
           * @param value uint256 The amount of token to be burned
           */
          function burnFrom(address from, uint256 value) public {
              _burnFrom(from, value);
          }
      }
      
      
      contract HuntToken is ERC20, ERC20Detailed, ERC20Mintable, ERC20Burnable {
        uint private INITIAL_SUPPLY = 500000000e18;
      
        constructor () public
          ERC20Burnable()
          ERC20Mintable()
          ERC20Detailed("HuntToken", "HUNT", 18)
        {
          _mint(msg.sender, INITIAL_SUPPLY);
        }
      }