ETH Price: $2,002.27 (-1.03%)

Transaction Decoder

Block:
10961167 at Sep-30-2020 02:32:31 AM +UTC
Transaction Fee:
0.00761199999998097 ETH $15.21
Gas Used:
19,030 Gas / 399.999999999 Gwei

Account State Difference:

  Address   Before After State Difference Code
(firepool)
109.038140761726027484 Eth109.045752761726008454 Eth0.00761199999998097
0x8517a89b...2494f5C43
9.922069500920087867 Eth
Nonce: 17565
9.914457500920106897 Eth
Nonce: 17566
0.00761199999998097
0x8Be4DB59...1924495C4
0xD4125613...EfFfB44D0
0 Eth
Nonce: 0
0 Eth
Nonce: 0
From: 0 To: 0

Execution Trace

0x8be4db5926232bc5b02b841dbede8161924495c4.10e542bc( )
  • YFOX.balanceOf( _owner=0x8Be4DB5926232BC5B02b841dbeDe8161924495C4 ) => ( balance=1 )
  • 0xd4125613b3196d0d82c1e035dc8665fefffb44d0.CALL( )
    • 0x8be4db5926232bc5b02b841dbede8161924495c4.SELFDESTRUCT( )
      pragma solidity 0.5.17;
      
          // Telegram News : https://t.me/YFOX_Announcement
          // Twitter : https://twitter.com/yfoxfinance
          // Website : https://yfox.finance
         
      /**
       * @title SafeMath
       * @dev Math operations with safety checks that throw on error
       */
      library SafeMath {
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
          uint256 c = a * b;
          assert(a == 0 || c / a == b);
          return c;
        }
      
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
          // assert(b > 0); // Solidity automatically throws when dividing by 0
          uint256 c = a / b;
          // assert(a == b * c + a % b); // There is no case in which this doesn't hold
          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;
        }
      }
      
      
      /**
       * @title Ownable
       * @dev The Ownable contract has an owner address, and provides basic authorization control
       * functions, this simplifies the implementation of "user permissions".
       */
      contract Ownable {
        address public owner;
      
      
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
      
      
        /**
         * @dev The Ownable constructor sets the original `owner` of the contract to the sender
         * account.
         */
        constructor() public {
          owner = msg.sender;
        }
      
      
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
          require(msg.sender == owner);
          _;
        }
      
      
        /**
         * @dev Allows the current owner to transfer control of the contract to a newOwner.
         * @param newOwner The address to transfer ownership to.
         */
        function transferOwnership(address newOwner) onlyOwner public {
          require(newOwner != address(0));
          emit OwnershipTransferred(owner, newOwner);
          owner = newOwner;
        }
      }
      
      /**
       * @title ERC20Basic
       * @dev Simpler version of ERC20 interface
       * @dev see https://github.com/ethereum/EIPs/issues/179
       */
      contract ERC20Basic {
        uint256 public totalSupply;
        function balanceOf(address who) public view returns (uint256);
        function transfer(address to, uint256 value) public returns (bool);
        event Transfer(address indexed from, address indexed to, uint256 value);
      }
      
      
      /**
       * @title Basic token
       * @dev Basic version of StandardToken, with no allowances.
       */
      contract BasicToken is ERC20Basic {
        using SafeMath for uint256;
      
        mapping(address => uint256) internal balances;
      
        /**
        * @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) {
          require(_to != address(0) && _to != address(this));
      
          // SafeMath.sub will throw if there is not enough balance.
          balances[msg.sender] = balances[msg.sender].sub(_value);
          balances[_to] = balances[_to].add(_value);
          emit Transfer(msg.sender, _to, _value);
          return true;
        }
      
        /**
        * @dev Gets the balance of the specified address.
        * @param _owner The address to query the the balance of.
        * @return An uint256 representing the amount owned by the passed address.
        */
        function balanceOf(address _owner) public view returns (uint256 balance) {
          return balances[_owner];
        }
      }
      
      /**
       * @title ERC20 interface
       * @dev see https://github.com/ethereum/EIPs/issues/20
       */
      contract ERC20 is ERC20Basic {
        function allowance(address owner, address spender) public view returns (uint256);
        function transferFrom(address from, address to, uint256 value) public returns (bool);
        function approve(address spender, uint256 value) public returns (bool);
        event Approval(address indexed owner, address indexed spender, uint256 value);
      }
      
      
      /**
       * @title Standard ERC20 token
       *
       * @dev Implementation of the basic standard token.
       * @dev https://github.com/ethereum/EIPs/issues/20
       * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
       */
      contract StandardToken is ERC20, BasicToken {
      
        mapping (address => mapping (address => uint256)) internal allowed;
      
      
        /**
         * @dev Transfer tokens from one address to another
         * @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) {
          require(_to != address(0) && _to != address(this));
      
          uint256 _allowance = allowed[_from][msg.sender];
      
          // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
          // require (_value <= _allowance);
      
          balances[_from] = balances[_from].sub(_value);
          balances[_to] = balances[_to].add(_value);
          allowed[_from][msg.sender] = _allowance.sub(_value);
          emit Transfer(_from, _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) {
          allowed[msg.sender][_spender] = _value;
          emit Approval(msg.sender, _spender, _value);
          return true;
        }
      
        /**
         * @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 remaining) {
          return allowed[_owner][_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
         */
        function increaseApproval (address _spender, uint _addedValue) public
          returns (bool success) {
          allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
          emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
          return true;
        }
      
        function decreaseApproval (address _spender, uint _subtractedValue) public
          returns (bool success) {
          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;
        }
      }
      
      
      interface tokenRecipient { 
          function receiveApproval(address _from, uint256 _value, bytes calldata _extraData) external;
      }
      
      contract YFOX is StandardToken, Ownable {
      
          string public constant name = "YFOX.FINANCE";
          string public constant symbol = "YFOX";
          uint public constant decimals = 6;
          // there is no problem in using * here instead of .mul()
          uint256 public constant initialSupply = 23000 * (10 ** uint256(decimals));
      
          // Constructors
          constructor () public {
              totalSupply = initialSupply;
              balances[msg.sender] = initialSupply; // Send all tokens to owner
              emit Transfer(address(0), msg.sender, initialSupply);
          }
          
          function approveAndCall(address _spender, uint256 _value, bytes calldata _extraData)
              external
              returns (bool success) 
          {
              tokenRecipient spender = tokenRecipient(_spender);
              if (approve(_spender, _value)) {
                  spender.receiveApproval(msg.sender, _value, _extraData);
                  return true;
              }
          }
          
          function transferAnyERC20Token(address _tokenAddress, address _to, uint _amount) public onlyOwner {
              ERC20(_tokenAddress).transfer(_to, _amount);
          }
          
      }