Transaction Hash:
Block:
5850498 at Jun-25-2018 07:01:44 AM +UTC
Transaction Fee:
0.00076751 ETH
$1.46
Gas Used:
76,751 Gas / 10 Gwei
Emitted Events:
63 |
Tablow.Transfer( _from=[Receiver] Tablow, _to=[Sender] 0x5a22e5e3c07fbf0db1981c9256a21eb22dd75c2d, _value=300000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x5a22E5e3...22DD75c2d |
0.0161680293 Eth
Nonce: 5
|
0.0154005193 Eth
Nonce: 6
| 0.00076751 | ||
0x829BD824...93333A830
Miner
| (F2Pool Old) | 3,506.822369223512150602 Eth | 3,506.823136733512150602 Eth | 0.00076751 | |
0xC5903FE7...0D7E89fae |
Execution Trace
Tablow.CALL( )

-
0x1c4513c776323c2ee7c5c2518271562b58411417.CALL( )
[Tablow (ln:118)]
revert[Tablow (ln:121)]
send[Tablow (ln:122)]
revert[Tablow (ln:122)]
Transfer[Tablow (ln:128)]
Transfer[Tablow (ln:151)]
revert[Tablow (ln:157)]
pragma solidity ^0.4.10; /** * Math operations with safety checks */ library SafeMath { function mul(uint a, uint b) internal returns (uint) { uint c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint a, uint b) internal returns (uint) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint a, uint b) internal returns (uint) { assert(b <= a); return a - b; } function add(uint a, uint b) internal returns (uint) { uint c = a + b; assert(c >= a); return c; } function max64(uint64 a, uint64 b) internal constant returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal constant returns (uint64) { return a < b ? a : b; } function max256(uint256 a, uint256 b) internal constant returns (uint256) { return a >= b ? a : b; } function min256(uint256 a, uint256 b) internal constant returns (uint256) { return a < b ? a : b; } function assert(bool assertion) internal { if (!assertion) { throw; } } } contract ERC223ReceivingContract { /** * @dev Standard ERC223 function that will handle incoming token transfers. * * @param _from Token sender address. * @param _value Amount of tokens. * @param _data Transaction metadata. */ function tokenFallback(address _from, uint _value, bytes _data); } contract ERC223 { function balanceOf(address who) constant returns (uint); event Transfer(address indexed from, address indexed to, uint value, bytes data); } contract ForeignToken { function balanceOf(address _owner) constant public returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); } contract Tablow is ERC223 { using SafeMath for uint; string public symbol = "TC"; string public name = "Tablow Club"; uint8 public constant decimals = 18; uint256 _totalSupply = 0; uint256 _MaxDistribPublicSupply = 0; uint256 _OwnerDistribSupply = 0; uint256 _CurrentDistribPublicSupply = 0; uint256 _FreeTokens = 0; uint256 _Multiplier1 = 2; uint256 _Multiplier2 = 3; uint256 _LimitMultiplier1 = 4e15; uint256 _LimitMultiplier2 = 8e15; uint256 _HighDonateLimit = 5e16; uint256 _BonusTokensPerETHdonated = 0; address _DistribFundsReceiverAddress = 0; address _remainingTokensReceiverAddress = 0; address owner = 0; bool setupDone = false; bool IsDistribRunning = false; bool DistribStarted = false; event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); event Burn(address indexed _owner, uint256 _value); mapping(address => uint256) balances; mapping(address => mapping(address => uint256)) allowed; mapping(address => bool) public Claimed; modifier onlyOwner() { require(msg.sender == owner); _; } function Tablow() public { owner = msg.sender; } function() public payable { if (IsDistribRunning) { uint256 _amount; if (((_CurrentDistribPublicSupply + _amount) > _MaxDistribPublicSupply) && _MaxDistribPublicSupply > 0) revert(); if (!_DistribFundsReceiverAddress.send(msg.value)) revert(); if (Claimed[msg.sender] == false) { _amount = _FreeTokens * 1e18; _CurrentDistribPublicSupply += _amount; balances[msg.sender] += _amount; _totalSupply += _amount; Transfer(this, msg.sender, _amount); Claimed[msg.sender] = true; } require(msg.value <= _HighDonateLimit); if (msg.value >= 1e15) { if (msg.value >= _LimitMultiplier2) { _amount = msg.value * _BonusTokensPerETHdonated * _Multiplier2; } else { if (msg.value >= _LimitMultiplier1) { _amount = msg.value * _BonusTokensPerETHdonated * _Multiplier1; } else { _amount = msg.value * _BonusTokensPerETHdonated; } } _CurrentDistribPublicSupply += _amount; balances[msg.sender] += _amount; _totalSupply += _amount; Transfer(this, msg.sender, _amount); } } else { revert(); } } function SetupToken(string tokenName, string tokenSymbol, uint256 BonusTokensPerETHdonated, uint256 MaxDistribPublicSupply, uint256 OwnerDistribSupply, address remainingTokensReceiverAddress, address DistribFundsReceiverAddress, uint256 FreeTokens) public { if (msg.sender == owner && !setupDone) { symbol = tokenSymbol; name = tokenName; _FreeTokens = FreeTokens; _BonusTokensPerETHdonated = BonusTokensPerETHdonated; _MaxDistribPublicSupply = MaxDistribPublicSupply * 1e18; if (OwnerDistribSupply > 0) { _OwnerDistribSupply = OwnerDistribSupply * 1e18; _totalSupply = _OwnerDistribSupply; balances[owner] = _totalSupply; _CurrentDistribPublicSupply += _totalSupply; Transfer(this, owner, _totalSupply); } _DistribFundsReceiverAddress = DistribFundsReceiverAddress; if (_DistribFundsReceiverAddress == 0) _DistribFundsReceiverAddress = owner; _remainingTokensReceiverAddress = remainingTokensReceiverAddress; setupDone = true; } } function SetupMultipliers(uint256 Multiplier1inX, uint256 Multiplier2inX, uint256 LimitMultiplier1inWei, uint256 LimitMultiplier2inWei, uint256 HighDonateLimitInWei) onlyOwner public { _Multiplier1 = Multiplier1inX; _Multiplier2 = Multiplier2inX; _LimitMultiplier1 = LimitMultiplier1inWei; _LimitMultiplier2 = LimitMultiplier2inWei; _HighDonateLimit = HighDonateLimitInWei; } function SetBonus(uint256 BonusTokensPerETHdonated) onlyOwner public { _BonusTokensPerETHdonated = BonusTokensPerETHdonated; } function SetFreeTokens(uint256 FreeTokens) onlyOwner public { _FreeTokens = FreeTokens; } function StartDistrib() public returns(bool success) { if (msg.sender == owner && !DistribStarted && setupDone) { DistribStarted = true; IsDistribRunning = true; } else { revert(); } return true; } function StopDistrib() public returns(bool success) { if (msg.sender == owner && IsDistribRunning) { if (_remainingTokensReceiverAddress != 0 && _MaxDistribPublicSupply > 0) { uint256 _remainingAmount = _MaxDistribPublicSupply - _CurrentDistribPublicSupply; if (_remainingAmount > 0) { balances[_remainingTokensReceiverAddress] += _remainingAmount; _totalSupply += _remainingAmount; Transfer(this, _remainingTokensReceiverAddress, _remainingAmount); } } DistribStarted = false; IsDistribRunning = false; } else { revert(); } return true; } function distribution(address[] addresses, uint256 _amount) onlyOwner public { uint256 _remainingAmount = _MaxDistribPublicSupply - _CurrentDistribPublicSupply; require(addresses.length <= 255); require(_amount <= _remainingAmount); _amount = _amount * 1e18; for (uint i = 0; i < addresses.length; i++) { require(_amount <= _remainingAmount); _CurrentDistribPublicSupply += _amount; balances[addresses[i]] += _amount; _totalSupply += _amount; Transfer(this, addresses[i], _amount); } if (_CurrentDistribPublicSupply >= _MaxDistribPublicSupply) { DistribStarted = false; IsDistribRunning = false; } } function distributeAmounts(address[] addresses, uint256[] amounts) onlyOwner public { uint256 _remainingAmount = _MaxDistribPublicSupply - _CurrentDistribPublicSupply; uint256 _amount; require(addresses.length <= 255); require(addresses.length == amounts.length); for (uint8 i = 0; i < addresses.length; i++) { _amount = amounts[i] * 1e18; require(_amount <= _remainingAmount); _CurrentDistribPublicSupply += _amount; balances[addresses[i]] += _amount; _totalSupply += _amount; Transfer(this, addresses[i], _amount); if (_CurrentDistribPublicSupply >= _MaxDistribPublicSupply) { DistribStarted = false; IsDistribRunning = false; } } } function BurnTokens(uint256 amount) public returns(bool success) { uint256 _amount = amount * 1e18; if (balances[msg.sender] >= _amount) { balances[msg.sender] -= _amount; _totalSupply -= _amount; Burn(msg.sender, _amount); Transfer(msg.sender, 0, _amount); } else { revert(); } return true; } function totalSupply() public constant returns(uint256 totalSupplyValue) { return _totalSupply; } function MaxDistribPublicSupply_() public constant returns(uint256 MaxDistribPublicSupply) { return _MaxDistribPublicSupply; } function OwnerDistribSupply_() public constant returns(uint256 OwnerDistribSupply) { return _OwnerDistribSupply; } function CurrentDistribPublicSupply_() public constant returns(uint256 CurrentDistribPublicSupply) { return _CurrentDistribPublicSupply; } function RemainingTokensReceiverAddress() public constant returns(address remainingTokensReceiverAddress) { return _remainingTokensReceiverAddress; } function DistribFundsReceiverAddress() public constant returns(address DistribfundsReceiver) { return _DistribFundsReceiverAddress; } function Owner() public constant returns(address ownerAddress) { return owner; } function SetupDone() public constant returns(bool setupDoneFlag) { return setupDone; } function IsDistribRunningFalg_() public constant returns(bool IsDistribRunningFalg) { return IsDistribRunning; } function IsDistribStarted() public constant returns(bool IsDistribStartedFlag) { return DistribStarted; } /** * @dev Transfer the specified amount of tokens to the specified address. * This function works the same with the previous one * but doesn't contain `_data` param. * Added due to backwards compatibility reasons. * * @param _to Receiver address. * @param _value Amount of tokens that will be transferred. */ function transfer(address _to, uint _value) returns (bool success) { if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) { bytes memory empty; if(isContract(_to)) { return transferToContract(_to, _value, empty); } else { return transferToAddress(_to, _value, empty); } } else { return false; } } /* Withdraws to address _to form the address _from up to the amount _value */ function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) { balances[_from] -= _value; allowed[_from][msg.sender] -= _value; balances[_to] += _value; Transfer(_from, _to, _value); return true; } else { return false; } } /* Allows _spender to withdraw the _allowance amount form sender */ function approve(address _spender, uint256 _allowance) returns (bool success) { if (_allowance <= _totalSupply) { allowed[msg.sender][_spender] = _allowance; Approval(msg.sender, _spender, _allowance); return true; } else { return false; } } /* Checks how much _spender can withdraw from _owner */ function allowance(address _owner, address _spender) constant returns (uint256 remaining) { return allowed[_owner][_spender]; } function transfer(address _to, uint _value, bytes _data) returns (bool success) { if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) { if(isContract(_to)) { return transferToContract(_to, _value, _data); } else { return transferToAddress(_to, _value, _data); } } else { return false; } } /* Transfer function when _to represents a regular address */ function transferToAddress(address _to, uint _value, bytes _data) internal returns (bool success) { balances[msg.sender] -= _value; balances[_to] += _value; Transfer(msg.sender, _to, _value); Transfer(msg.sender, _to, _value, _data); return true; } /* Transfer function when _to represents a contract address, with the caveat that the contract needs to implement the tokenFallback function in order to receive tokens */ function transferToContract(address _to, uint _value, bytes _data) internal returns (bool success) { balances[msg.sender] -= _value; balances[_to] += _value; ERC223ReceivingContract receiver = ERC223ReceivingContract(_to); receiver.tokenFallback(msg.sender, _value, _data); Transfer(msg.sender, _to, _value); Transfer(msg.sender, _to, _value, _data); return true; } /* Infers if whether _address is a contract based on the presence of bytecode */ function isContract(address _address) internal returns (bool is_contract) { uint length; if (_address == 0) return false; assembly { length := extcodesize(_address) } if(length > 0) { return true; } else { return false; } } function withdrawForeignTokens(address _tokenContract) onlyOwner public returns (bool) { ForeignToken token = ForeignToken(_tokenContract); uint256 amount = token.balanceOf(address(this)); return token.transfer(owner, amount); } function balanceOf(address _owner) public constant returns(uint256 balance) { return balances[_owner]; } }