ETH Price: $2,089.44 (-1.41%)

Transaction Decoder

Block:
12262490 at Apr-18-2021 06:27:12 AM +UTC
Transaction Fee:
0.009970572 ETH $20.83
Gas Used:
47,031 Gas / 212 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
(zhizhu.top)
2,266.977868820071940366 Eth2,266.987839392071940366 Eth0.009970572
0x04abEdA2...c74ddC74C
0xfbc865A4...ae048aEDb
(Bidesk 42)
95.486454188699072006 Eth
Nonce: 33073
95.476483616699072006 Eth
Nonce: 33074
0.009970572

Execution Trace

IBNEST.transfer( _to=0xc2BA04E89016f417e1219Af7eF82a5B6A9214793, _value=1500000000000000000000000 ) => ( True )
  • IterableMapping.4c5e1cae( )
  • IterableMapping.4c5e1cae( )
  • IterableMapping.ab517b4f( )
  • IterableMapping.4c5e1cae( )
  • IterableMapping.ab517b4f( )
    File 1 of 2: IBNEST
    pragma solidity ^0.5.1;
    
    library IterableMapping {
      struct itmap
      {
        mapping(address => IndexValue) data;
        KeyFlag[] keys;
        uint size;
      }
      struct IndexValue { uint keyIndex; uint value; }
      struct KeyFlag { address key; bool deleted; }
      function insert(itmap storage self, address key, uint value) public returns (bool replaced)
      {
        uint keyIndex = self.data[key].keyIndex;
        self.data[key].value = value;
        if (keyIndex > 0)
          return true;
        else
        {
          keyIndex = self.keys.length++;
          self.data[key].keyIndex = keyIndex + 1;
          self.keys[keyIndex].key = key;
          self.size++;
          return false;
        }
      }
      function remove(itmap storage self, address key) public returns (bool success)
      {
        uint keyIndex = self.data[key].keyIndex;
        if (keyIndex == 0)
          return false;
        delete self.data[key];
        self.keys[keyIndex - 1].deleted = true;
        self.size --;
      }
      function contains(itmap storage self, address key) public view returns (bool)
      {
        return self.data[key].keyIndex > 0;
      }
      function iterate_start(itmap storage self) public view returns (uint keyIndex)
      {
        return iterate_next(self, uint(-1));
      }
      function iterate_valid(itmap storage self, uint keyIndex) public view returns (bool)
      {
        return keyIndex < self.keys.length;
      }
      function iterate_next(itmap storage self, uint keyIndex) public view returns (uint r_keyIndex)
      {
        keyIndex++;
        while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
          keyIndex++;
        return keyIndex;
      }
      function iterate_get(itmap storage self, uint keyIndex) public view returns (address key, uint value)
      {
        key = self.keys[keyIndex].key;
        value = self.data[key].value;
      }
      function iterate_getValue(itmap storage self, address key) public view returns (uint value) {
          return self.data[key].value;
      }
    }
    
    /**
     * @title SafeMath
     * @dev Math operations with safety checks that throw on error
     */
    library SafeMath {
    
      /**
      * @dev Multiplies two numbers, throws on overflow.
      */
      function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting '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;
        }
    
        c = _a * _b;
        assert(c / _a == _b);
        return c;
      }
    
      /**
      * @dev Integer division of two numbers, truncating the quotient.
      */
      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 _a / _b;
      }
    
      /**
      * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
      */
      function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
        assert(_b <= _a);
        return _a - _b;
      }
    
      /**
      * @dev Adds two numbers, throws on overflow.
      */
      function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
        c = _a + _b;
        assert(c >= _a);
        return c;
      }
    }
    
    /**
     * @title ERC20Basic
     * @dev Simpler version of ERC20 interface
     * See https://github.com/ethereum/EIPs/issues/179
     */
    contract ERC20Basic {
      function totalSupply() public view returns (uint256);
      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;
      IterableMapping.itmap balances;
    
      uint256 internal totalSupply_;
    
      /**
      * @dev Total number of tokens in existence
      */
      function totalSupply() public view returns (uint256) {
        return totalSupply_;
      }
    
      /**
      * @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(_value <= IterableMapping.iterate_getValue(balances, msg.sender));
        require(_to != address(0));
        
        IterableMapping.insert(balances, msg.sender, IterableMapping.iterate_getValue(balances, msg.sender).sub(_value));
        IterableMapping.insert(balances, _to, IterableMapping.iterate_getValue(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) {
          return IterableMapping.iterate_getValue(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.
     * https://github.com/ethereum/EIPs/issues/20
     * 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(_value <= IterableMapping.iterate_getValue(balances, _from));
    
        require(_value <= allowed[_from][msg.sender]);
        require(_to != address(0));
    
        IterableMapping.insert(balances, _from, IterableMapping.iterate_getValue(balances, _from).sub(_value));
        IterableMapping.insert(balances, _to, IterableMapping.iterate_getValue(balances, _to).add(_value));
    
        allowed[_from][msg.sender] = allowed[_from][msg.sender].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)
      {
        return allowed[_owner][_spender];
      }
    
      /**
       * @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
       * @param _spender The address which will spend the funds.
       * @param _addedValue The amount of tokens to increase the allowance by.
       */
      function increaseApproval(
        address _spender,
        uint256 _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;
      }
    
      /**
       * @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
       * @param _spender The address which will spend the funds.
       * @param _subtractedValue The amount of tokens to decrease the allowance by.
       */
      function decreaseApproval(
        address _spender,
        uint256 _subtractedValue
      )
        public
        returns (bool)
      {
        uint256 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;
      }
    
    }
    
    contract IBNEST is StandardToken {
        
        string public name = "NEST";
        string public symbol = "NEST";
        uint8 public decimals = 18;
        uint256 public INITIAL_SUPPLY = 10000000000 ether;
    
        constructor () public {
        	totalSupply_ = INITIAL_SUPPLY;
        	IterableMapping.insert(balances, tx.origin, INITIAL_SUPPLY);
        }
        
        function balancesStart() public view returns(uint256) {
            return IterableMapping.iterate_start(balances);
        }
        
        function balancesGetBool(uint256 num) public view returns(bool){
            return IterableMapping.iterate_valid(balances, num);
        }
        
        function balancesGetNext(uint256 num) public view returns(uint256) {
            return IterableMapping.iterate_next(balances, num);
        }
        
        function balancesGetValue(uint256 num) public view returns(address, uint256) {
            address key;                           
            uint256 value;                         
            (key, value) = IterableMapping.iterate_get(balances, num);
            return (key, value);
        }
        
    }

    File 2 of 2: IterableMapping
    library IterableMapping {
      struct itmap
      {
        mapping(address => IndexValue) data;
        KeyFlag[] keys;
        uint size;
      }
      struct IndexValue { uint keyIndex; uint value; }
      struct KeyFlag { address key; bool deleted; }
      function insert(itmap storage self, address key, uint value) public returns (bool replaced)
      {
        uint keyIndex = self.data[key].keyIndex;
        self.data[key].value = value;
        if (keyIndex > 0)
          return true;
        else
        {
          keyIndex = self.keys.length++;
          self.data[key].keyIndex = keyIndex + 1;
          self.keys[keyIndex].key = key;
          self.size++;
          return false;
        }
      }
      function remove(itmap storage self, address key) public returns (bool success)
      {
        uint keyIndex = self.data[key].keyIndex;
        if (keyIndex == 0)
          return false;
        delete self.data[key];
        self.keys[keyIndex - 1].deleted = true;
        self.size --;
      }
      function contains(itmap storage self, address key) public view returns (bool)
      {
        return self.data[key].keyIndex > 0;
      }
      function iterate_start(itmap storage self) public view returns (uint keyIndex)
      {
        return iterate_next(self, uint(-1));
      }
      function iterate_valid(itmap storage self, uint keyIndex) public view returns (bool)
      {
        return keyIndex < self.keys.length;
      }
      function iterate_next(itmap storage self, uint keyIndex) public view returns (uint r_keyIndex)
      {
        keyIndex++;
        while (keyIndex < self.keys.length && self.keys[keyIndex].deleted)
          keyIndex++;
        return keyIndex;
      }
      function iterate_get(itmap storage self, uint keyIndex) public view returns (address key, uint value)
      {
        key = self.keys[keyIndex].key;
        value = self.data[key].value;
      }
      function iterate_getValue(itmap storage self, address key) public view returns (uint value) {
          return self.data[key].value;
      }
    }