Transaction Hash:
Block:
10247906 at Jun-12-2020 01:30:13 AM +UTC
Transaction Fee:
0.0010143 ETH
$2.50
Gas Used:
44,100 Gas / 23 Gwei
Emitted Events:
204 |
IBNEST.Approval( owner=[Sender] 0xf7daf58a17327fb3f2be49f291f76479fc1292a7, spender=0x561d0d6c...223fFaeBF, value=190016000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x04abEdA2...c74ddC74C | |||||
0x829BD824...93333A830
Miner
| (F2Pool Old) | 7,076.510504414542334559 Eth | 7,076.511518714542334559 Eth | 0.0010143 | |
0xf7daf58A...9fc1292A7 |
1.7867624 Eth
Nonce: 0
|
1.7857481 Eth
Nonce: 1
| 0.0010143 |
Execution Trace
IBNEST.approve( _spender=0x561d0d6c498a379574eAaA4a5F2532b223fFaeBF, _value=190016000000000000000000 ) => ( True )
approve[ERC20 (ln:185)]
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); } }