ETH Price: $2,123.85 (+2.34%)

Transaction Decoder

Block:
6117769 at Aug-09-2018 06:12:16 PM +UTC
Transaction Fee:
0 ETH $0.00
Gas Used:
210,000 Gas / 0 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x272A64C2...49B8e7716
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 0

Execution Trace

0x87c9ea70f72ad55a12bc6155a30e047cf2acd798.a9059cbb( )
  • QMQCoin.transferFrom( _from=0x2Ddc2a2FCE7b781028bB3D91F6523001416243b4, _to=0x8EB5b6e2Ca3a117E9bBa61f7a47e357F8d37712B, _amount=100000000000 ) => ( success=True )
    pragma solidity ^0.4.18;
    
    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) {
        uint256 c = a / b;
        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;
      }
    }
    
    contract ForeignToken {
        function balanceOf(address _owner) constant public returns (uint256);
        function transfer(address _to, uint256 _value) public returns (bool);
    }
    
    contract ERC20Basic {
        uint256 public totalSupply;
        function balanceOf(address who) public constant returns (uint256);
        function transfer(address to, uint256 value) public returns (bool);
        event Transfer(address indexed from, address indexed to, uint256 value);
    }
    
    contract ERC20 is ERC20Basic {
        function allowance(address owner, address spender) public constant 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);
    }
    
    interface Token { 
        function distr(address _to, uint256 _value) public returns (bool);
        function totalSupply() constant public returns (uint256 supply);
        function balanceOf(address _owner) constant public returns (uint256 balance);
    }
    
    contract QMQCoin is ERC20 {
        
        using SafeMath for uint256;
        address owner = msg.sender;
    
        mapping (address => uint256) balances;
        mapping (address => mapping (address => uint256)) allowed;
        mapping (address => bool) public blacklist;
    
        string public constant name = "QMQCoin";
        string public constant symbol = "QMQ";
        uint public constant decimals = 8;
        
        uint256 public totalSupply = 1000000000e8;
        uint256 public totalDistributed = 300000000e8;
        uint256 public totalRemaining = totalSupply.sub(totalDistributed);
        uint256 public value;
    
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
        event Approval(address indexed _owner, address indexed _spender, uint256 _value);
        
        event Distr(address indexed to, uint256 amount);
        event DistrFinished();
        
        event Burn(address indexed burner, uint256 value);
    
        bool public distributionFinished = false;
        
        modifier canDistr() {
            require(!distributionFinished);
            _;
        }
        
        modifier onlyOwner() {
            require(msg.sender == owner);
            _;
        }
        
        modifier onlyWhitelist() {
            require(blacklist[msg.sender] == false);
            _;
        }
        
        function QMQCoin () public {
            owner = msg.sender;
            value = 5000e8;
            distr(owner, totalDistributed);
        }
        
        function transferOwnership(address newOwner) onlyOwner public {
            if (newOwner != address(0)) {
                owner = newOwner;
            }
        }
        
        function enableWhitelist(address[] addresses) onlyOwner public {
            for (uint i = 0; i < addresses.length; i++) {
                blacklist[addresses[i]] = false;
            }
        }
    
        function disableWhitelist(address[] addresses) onlyOwner public {
            for (uint i = 0; i < addresses.length; i++) {
                blacklist[addresses[i]] = true;
            }
        }
    
        function finishDistribution() onlyOwner canDistr public returns (bool) {
            distributionFinished = true;
            DistrFinished();
            return true;
        }
        
        function distr(address _to, uint256 _amount) canDistr private returns (bool) {
            totalDistributed = totalDistributed.add(_amount);
            totalRemaining = totalRemaining.sub(_amount);
            balances[_to] = balances[_to].add(_amount);
            Distr(_to, _amount);
            Transfer(address(0), _to, _amount);
            return true;
            
            if (totalDistributed >= totalSupply) {
                distributionFinished = true;
            }
        }
        
        function airdrop(address[] addresses) onlyOwner canDistr public {
            
            require(addresses.length <= 255);
            require(value <= totalRemaining);
            
            for (uint i = 0; i < addresses.length; i++) {
                require(value <= totalRemaining);
                distr(addresses[i], value);
            }
    	
            if (totalDistributed >= totalSupply) {
                distributionFinished = true;
            }
        }
        
        function distribution(address[] addresses, uint256 amount) onlyOwner canDistr public {
            
            require(addresses.length <= 255);
            require(amount <= totalRemaining);
            
            for (uint i = 0; i < addresses.length; i++) {
                require(amount <= totalRemaining);
                distr(addresses[i], amount);
            }
    	
            if (totalDistributed >= totalSupply) {
                distributionFinished = true;
            }
        }
        
        function distributeAmounts(address[] addresses, uint256[] amounts) onlyOwner canDistr public {
    
            require(addresses.length <= 255);
            require(addresses.length == amounts.length);
            
            for (uint8 i = 0; i < addresses.length; i++) {
                require(amounts[i] <= totalRemaining);
                distr(addresses[i], amounts[i]);
                
                if (totalDistributed >= totalSupply) {
                    distributionFinished = true;
                }
            }
        }
        
        function () external payable {
                getTokens();
         }
        
        function getTokens() payable canDistr onlyWhitelist public {
            
            if (value > totalRemaining) {
                value = totalRemaining;
            }
            
            require(value <= totalRemaining);
            
            address investor = msg.sender;
            uint256 toGive = value;
            
            distr(investor, toGive);
            
            if (toGive > 0) {
                blacklist[investor] = true;
            }
    
            if (totalDistributed >= totalSupply) {
                distributionFinished = true;
            }
            
            value = value.div(100000).mul(99999);
        }
    
        function balanceOf(address _owner) constant public returns (uint256) {
    	    return balances[_owner];
        }
    
        // mitigates the ERC20 short address attack
        modifier onlyPayloadSize(uint size) {
            assert(msg.data.length >= size + 4);
            _;
        }
        
        function transfer(address _to, uint256 _amount) onlyPayloadSize(2 * 32) public returns (bool success) {
    
            require(_to != address(0));
            require(_amount <= balances[msg.sender]);
            
            balances[msg.sender] = balances[msg.sender].sub(_amount);
            balances[_to] = balances[_to].add(_amount);
            Transfer(msg.sender, _to, _amount);
            return true;
        }
        
        function transferFrom(address _from, address _to, uint256 _amount) onlyPayloadSize(3 * 32) public returns (bool success) {
    
            require(_to != address(0));
            require(_amount <= balances[_from]);
            require(_amount <= allowed[_from][msg.sender]);
            
            balances[_from] = balances[_from].sub(_amount);
            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);
            balances[_to] = balances[_to].add(_amount);
            Transfer(_from, _to, _amount);
            return true;
        }
        
        function approve(address _spender, uint256 _value) public returns (bool success) {
            allowed[msg.sender][_spender] = _value;
            Approval(msg.sender, _spender, _value);
            return true;
        }
        
        function allowance(address _owner, address _spender) constant public returns (uint256) {
            return allowed[_owner][_spender];
        }
        
        function getTokenBalance(address tokenAddress, address who) constant public returns (uint){
            ForeignToken t = ForeignToken(tokenAddress);
            uint bal = t.balanceOf(who);
            return bal;
        }
        
        function withdraw() onlyOwner public {
            uint256 etherBalance = this.balance;
            owner.transfer(etherBalance);
        }
        
        function burn(uint256 _value) onlyOwner public {
            require(_value <= balances[msg.sender]);
    
            address burner = msg.sender;
            balances[burner] = balances[burner].sub(_value);
            totalSupply = totalSupply.sub(_value);
            totalDistributed = totalDistributed.sub(_value);
            Burn(burner, _value);
        }
        
        function withdrawForeignTokens(address _tokenContract) onlyOwner public returns (bool) {
            ForeignToken token = ForeignToken(_tokenContract);
            uint256 amount = token.balanceOf(address(this));
            return token.transfer(owner, amount);
        }
        
        function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
            allowed[msg.sender][_spender] = _value;
            Approval(msg.sender, _spender, _value);
            
            require(_spender.call(bytes4(bytes32(keccak256("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData));
            return true;
        }
    
    }