ETH Price: $2,063.91 (-4.11%)

Transaction Decoder

Block:
6760842 at Nov-24-2018 12:29:12 AM +UTC
Transaction Fee:
0.001065025 ETH $2.20
Gas Used:
42,601 Gas / 25 Gwei

Emitted Events:

23 HAND.Transfer( _from=[Sender] 0x1e20d9a528414e64c65e8c586f95ce104830f439, _to=[Receiver] Exchange, _value=52741724 )
24 Exchange.Deposit( token=HAND, user=[Sender] 0x1e20d9a528414e64c65e8c586f95ce104830f439, amount=52741724, balance=52741724 )

Account State Difference:

  Address   Before After State Difference Code
0x1E20d9A5...04830f439
0.017777085 Eth
Nonce: 10
0.01671206 Eth
Nonce: 11
0.001065025
0x2a0c0DBE...44050c208
(IDEX)
0x48C1B2f3...0a08cdBB7
(Ethermine)
782.146096676964082773 Eth782.147161701964082773 Eth0.001065025

Execution Trace

Exchange.depositToken( token=0x48C1B2f3eFA85fbafb2ab951bF4Ba860a08cdBB7, amount=52741724 )
  • HAND.transferFrom( _from=0x1E20d9A528414E64C65E8c586f95CE104830f439, _to=0x2a0c0DBEcC7E4D658f48E01e3fA353F44050c208, _value=52741724 ) => ( success=True )
    File 1 of 2: Exchange
    pragma solidity ^0.4.16;
    
    contract Token {
        bytes32 public standard;
        bytes32 public name;
        bytes32 public symbol;
        uint256 public totalSupply;
        uint8 public decimals;
        bool public allowTransactions;
        mapping (address => uint256) public balanceOf;
        mapping (address => mapping (address => uint256)) public allowance;
        function transfer(address _to, uint256 _value) returns (bool success);
        function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success);
        function approve(address _spender, uint256 _value) returns (bool success);
        function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
    }
    
    contract Exchange {
      function assert(bool assertion) {
        if (!assertion) throw;
      }
      function safeMul(uint a, uint b) returns (uint) {
        uint c = a * b;
        assert(a == 0 || c / a == b);
        return c;
      }
    
      function safeSub(uint a, uint b) returns (uint) {
        assert(b <= a);
        return a - b;
      }
    
      function safeAdd(uint a, uint b) returns (uint) {
        uint c = a + b;
        assert(c>=a && c>=b);
        return c;
      }
      address public owner;
      mapping (address => uint256) public invalidOrder;
      event SetOwner(address indexed previousOwner, address indexed newOwner);
      modifier onlyOwner {
        assert(msg.sender == owner);
        _;
      }
      function setOwner(address newOwner) onlyOwner {
        SetOwner(owner, newOwner);
        owner = newOwner;
      }
      function getOwner() returns (address out) {
        return owner;
      }
      function invalidateOrdersBefore(address user, uint256 nonce) onlyAdmin {
        if (nonce < invalidOrder[user]) throw;
        invalidOrder[user] = nonce;
      }
    
      mapping (address => mapping (address => uint256)) public tokens; //mapping of token addresses to mapping of account balances
    
      mapping (address => bool) public admins;
      mapping (address => uint256) public lastActiveTransaction;
      mapping (bytes32 => uint256) public orderFills;
      address public feeAccount;
      uint256 public inactivityReleasePeriod;
      mapping (bytes32 => bool) public traded;
      mapping (bytes32 => bool) public withdrawn;
      event Order(address tokenBuy, uint256 amountBuy, address tokenSell, uint256 amountSell, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s);
      event Cancel(address tokenBuy, uint256 amountBuy, address tokenSell, uint256 amountSell, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s);
      event Trade(address tokenBuy, uint256 amountBuy, address tokenSell, uint256 amountSell, address get, address give);
      event Deposit(address token, address user, uint256 amount, uint256 balance);
      event Withdraw(address token, address user, uint256 amount, uint256 balance);
    
      function setInactivityReleasePeriod(uint256 expiry) onlyAdmin returns (bool success) {
        if (expiry > 1000000) throw;
        inactivityReleasePeriod = expiry;
        return true;
      }
    
      function Exchange(address feeAccount_) {
        owner = msg.sender;
        feeAccount = feeAccount_;
        inactivityReleasePeriod = 100000;
      }
    
      function setAdmin(address admin, bool isAdmin) onlyOwner {
        admins[admin] = isAdmin;
      }
    
      modifier onlyAdmin {
        if (msg.sender != owner && !admins[msg.sender]) throw;
        _;
      }
    
      function() external {
        throw;
      }
    
      function depositToken(address token, uint256 amount) {
        tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount);
        lastActiveTransaction[msg.sender] = block.number;
        if (!Token(token).transferFrom(msg.sender, this, amount)) throw;
        Deposit(token, msg.sender, amount, tokens[token][msg.sender]);
      }
    
      function deposit() payable {
        tokens[address(0)][msg.sender] = safeAdd(tokens[address(0)][msg.sender], msg.value);
        lastActiveTransaction[msg.sender] = block.number;
        Deposit(address(0), msg.sender, msg.value, tokens[address(0)][msg.sender]);
      }
    
      function withdraw(address token, uint256 amount) returns (bool success) {
        if (safeSub(block.number, lastActiveTransaction[msg.sender]) < inactivityReleasePeriod) throw;
        if (tokens[token][msg.sender] < amount) throw;
        tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
        if (token == address(0)) {
          if (!msg.sender.send(amount)) throw;
        } else {
          if (!Token(token).transfer(msg.sender, amount)) throw;
        }
        Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
      }
    
      function adminWithdraw(address token, uint256 amount, address user, uint256 nonce, uint8 v, bytes32 r, bytes32 s, uint256 feeWithdrawal) onlyAdmin returns (bool success) {
        bytes32 hash = keccak256(this, token, amount, user, nonce);
        if (withdrawn[hash]) throw;
        withdrawn[hash] = true;
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw;
        if (feeWithdrawal > 50 finney) feeWithdrawal = 50 finney;
        if (tokens[token][user] < amount) throw;
        tokens[token][user] = safeSub(tokens[token][user], amount);
        tokens[token][feeAccount] = safeAdd(tokens[token][feeAccount], safeMul(feeWithdrawal, amount) / 1 ether);
        amount = safeMul((1 ether - feeWithdrawal), amount) / 1 ether;
        if (token == address(0)) {
          if (!user.send(amount)) throw;
        } else {
          if (!Token(token).transfer(user, amount)) throw;
        }
        lastActiveTransaction[user] = block.number;
        Withdraw(token, user, amount, tokens[token][user]);
      }
    
      function balanceOf(address token, address user) constant returns (uint256) {
        return tokens[token][user];
      }
    
      function trade(uint256[8] tradeValues, address[4] tradeAddresses, uint8[2] v, bytes32[4] rs) onlyAdmin returns (bool success) {
        /* amount is in amountBuy terms */
        /* tradeValues
           [0] amountBuy
           [1] amountSell
           [2] expires
           [3] nonce
           [4] amount
           [5] tradeNonce
           [6] feeMake
           [7] feeTake
         tradeAddressses
           [0] tokenBuy
           [1] tokenSell
           [2] maker
           [3] taker
         */
        if (invalidOrder[tradeAddresses[2]] > tradeValues[3]) throw;
        bytes32 orderHash = keccak256(this, tradeAddresses[0], tradeValues[0], tradeAddresses[1], tradeValues[1], tradeValues[2], tradeValues[3], tradeAddresses[2]);
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", orderHash), v[0], rs[0], rs[1]) != tradeAddresses[2]) throw;
        bytes32 tradeHash = keccak256(orderHash, tradeValues[4], tradeAddresses[3], tradeValues[5]); 
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", tradeHash), v[1], rs[2], rs[3]) != tradeAddresses[3]) throw;
        if (traded[tradeHash]) throw;
        traded[tradeHash] = true;
        if (tradeValues[6] > 100 finney) tradeValues[6] = 100 finney;
        if (tradeValues[7] > 100 finney) tradeValues[7] = 100 finney;
        if (safeAdd(orderFills[orderHash], tradeValues[4]) > tradeValues[0]) throw;
        if (tokens[tradeAddresses[0]][tradeAddresses[3]] < tradeValues[4]) throw;
        if (tokens[tradeAddresses[1]][tradeAddresses[2]] < (safeMul(tradeValues[1], tradeValues[4]) / tradeValues[0])) throw;
        tokens[tradeAddresses[0]][tradeAddresses[3]] = safeSub(tokens[tradeAddresses[0]][tradeAddresses[3]], tradeValues[4]);
        tokens[tradeAddresses[0]][tradeAddresses[2]] = safeAdd(tokens[tradeAddresses[0]][tradeAddresses[2]], safeMul(tradeValues[4], ((1 ether) - tradeValues[6])) / (1 ether));
        tokens[tradeAddresses[0]][feeAccount] = safeAdd(tokens[tradeAddresses[0]][feeAccount], safeMul(tradeValues[4], tradeValues[6]) / (1 ether));
        tokens[tradeAddresses[1]][tradeAddresses[2]] = safeSub(tokens[tradeAddresses[1]][tradeAddresses[2]], safeMul(tradeValues[1], tradeValues[4]) / tradeValues[0]);
        tokens[tradeAddresses[1]][tradeAddresses[3]] = safeAdd(tokens[tradeAddresses[1]][tradeAddresses[3]], safeMul(safeMul(((1 ether) - tradeValues[7]), tradeValues[1]), tradeValues[4]) / tradeValues[0] / (1 ether));
        tokens[tradeAddresses[1]][feeAccount] = safeAdd(tokens[tradeAddresses[1]][feeAccount], safeMul(safeMul(tradeValues[7], tradeValues[1]), tradeValues[4]) / tradeValues[0] / (1 ether));
        orderFills[orderHash] = safeAdd(orderFills[orderHash], tradeValues[4]);
        lastActiveTransaction[tradeAddresses[2]] = block.number;
        lastActiveTransaction[tradeAddresses[3]] = block.number;
      }
    }

    File 2 of 2: HAND
    pragma solidity ^0.4.19;
    library SafeMath {
      function mul(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
      }
    
      function div(uint256 a, uint256 b) internal constant returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        return c;
      }
    
      function sub(uint256 a, uint256 b) internal constant returns (uint256) {
        assert(b <= a);
        return a - b;
      }
    
      function add(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
      }
    }
    contract HAND{
        using SafeMath for uint256;
    
        uint256 constant MAX_UINT256 = 2**256 - 1;
        uint256 _initialAmount = 0;
        uint256 public publicToken = 4*10**11;                // 40% of total, for public sale
        uint256 public maxSupply = 10**12;
        address  public contract_owner;
        uint256 public exchangeRate = 3900000;                    // exchangeRate for public sale, token per ETH
        bool public icoOpen = false;                           // whether ICO is open and accept public investment
    
    
        address privateSaleAdd = 0x85e4FE33c590b8A5812fBF926a0f9fe64E6d8b35;
        
        mapping (address => uint256) balances;
        mapping (address => mapping (address => uint256)) allowed;
    
        
          
        // lock struct for founder
        struct founderLock {
            uint256 amount;
            uint256 startTime;
            uint remainRound;
            uint totalRound;
            uint256 period;
        }
        
        mapping (address => founderLock) public founderLockance;
        mapping (address => bool) isFreezed;
        
    
        
        // uint256 totalSupply;
        event Transfer(address indexed _from, address indexed _to, uint256 _value); 
        event Approval(address indexed _owner, address indexed _spender, uint256 _value);
        event FounderUnlock(address _sender, uint256 _amount);
                
        /*
        NOTE:
        The following variables are OPTIONAL vanities. One does not have to include them.
        */
        string public name = "ShowHand";               //fancy name: eg Simon Bucks
        uint8 public decimals = 0;                     //How many decimals to show.
        string public symbol = "HAND";                 //An identifier: eg SBX
    
        /**
          * @dev Fix for the ERC20 short address attack.
          */
          modifier onlyPayloadSize(uint size) {
              require(msg.data.length >= size + 4);
              _;
          }
          modifier  onlyOwner() { 
              require(msg.sender == contract_owner); 
              _; 
          }
          modifier inIco() { 
              require(icoOpen==true); 
              _; 
          }
          
          
        // token distribution, 60% in this part
            address address1 = 0x85e4FE33c590b8A5812fBF926a0f9fe64E6d8b35;
            address address2 = 0x5af6353F2BB222DF6FCD82065ed2e6db1bB12291;
            address address3 = 0x6c24A6EfdfF15230EE284E2E72D86656ac752e48;
            address address4 = 0xCB946d83617eDb6fbCa19148AD83e17Ea7B67294;
            address address5 = 0x76360A75dC6e4bC5c6C0a20A4B74b8823fAFad8C;
            address address6 = 0x356399eE0ebCB6AfB13dF33168fD2CC54Ba219C2;
            address address7 = 0x8b46b43cA5412311A5Dfa08EF1149B5942B5FE22;
            address address8 = 0xA51551B57CB4e37Ea20B3226ceA61ebc7135a11a;
            address address9 = 0x174bC643442bE89265500E6C2c236D32248A4FaE;
            address address10 = 0x0D78E82ECEd57aC3CE65fE3B828f4d52fF712f31;
            address address11 = 0xe31062592358Cd489Bdc09e8217543C8cc3D5C1C;
            address address12 = 0x0DB8c855C4BB0efd5a1c32de2362c5ABCFa4CA33;
            address address13 = 0xF25A3ccDC54A746d56A90197d911d9a1f27cF512;
            address address14 = 0x102d36210d312FB9A9Cf5f5c3A293a8f6598BD50;
    
            address address15 = 0x8Dd1cDD513b05D07726a6F8C75b57602991a9c34;
            address address16 = 0x9d566BCc1BDda779a00a1D44E0b4cA07FB68EFEF;
            address address17 = 0x1cfCe9A13aBC3381100e85BFA21160C98f8B103D;
            address address18 = 0x61F0c924C0F91f4d17c82C534cfaF716A7893c13;
            address address19 = 0xE76c0618Dd52403ad1907D3BCbF930226bFEa46B;
            address address20 = 0xeF2f04dbd3E3aD126979646383c94Fd29E29de9F;
    
        function HAND() public {
            // set sender as contract_owner
            contract_owner = msg.sender;
            _initialAmount += publicToken;
    
            
    
            setFounderLock(address1, 800*10**8, 4, 180 days);
            setFounderLock(address2, 40*10**8, 4, 180 days);
            setFounderLock(address3, 5*10**8, 4, 180 days);
            setFounderLock(address4, 5*10**8, 4, 180 days);
            setFounderLock(address5, 300*10**8, 4, 180 days);
            setFounderLock(address6, 200*10**8, 4, 180 days);
            setFounderLock(address7, 100*10**8, 4, 180 days);
            setFounderLock(address8, 50*10**8, 4, 180 days);
            setFounderLock(address9, 600*10**8, 4, 180 days);
            setFounderLock(address10, 150*10**8, 4, 180 days);
            setFounderLock(address11, 100*10**8, 4, 180 days);
            setFounderLock(address12, 800*10**8, 4, 180 days);
            setFounderLock(address13, 2400*10**8, 4, 180 days);
            setFounderLock(address14, 100*10**8, 4, 180 days);
    
            setFounderLock(address15, 135*10**8, 4, 180 days);
            setFounderLock(address16, 25*10**8, 4, 180 days);
            setFounderLock(address17, 20*10**8, 4, 180 days);
            setFounderLock(address18, 40*10**8, 4, 180 days);
            setFounderLock(address19, 20*10**8, 4, 180 days);
            setFounderLock(address20, 110*10**8, 4, 180 days);
        }
        function totalSupply() constant returns (uint256 _totalSupply){
            _totalSupply = _initialAmount;
          }
        function transfer(address _to, uint256 _value) public returns (bool success) {
            //Default assumes totalSupply can't be over max (2^256 - 1).
            //If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap.
            //Replace the if with this one instead.
            //require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
            require(balances[msg.sender] >= _value);
            require(isFreezed[msg.sender]==false);
            balances[msg.sender] -= _value;
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
            }
        function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
            //same as above. Replace this line with the following if you want to protect against wrapping uints.
            //require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]);
            uint256 allowance = allowed[_from][msg.sender];
            require(balances[_from] >= _value && allowance >= _value);
            balances[_to] += _value;
            balances[_from] -= _value;
            if (allowance < MAX_UINT256) {
                allowed[_from][msg.sender] -= _value;
            }
            Transfer(_from, _to, _value);
            return true;
            }
    
        function balanceOf(address _owner) view public returns (uint256 balance) {
            return balances[_owner];
            }
    
        function approve(address _spender, uint256 _value) public returns (bool success) {
            require(isFreezed[msg.sender]==false);
            allowed[msg.sender][_spender] = _value;
            Approval(msg.sender, _spender, _value);
            return true;
            }
    
        function allowance(address _owner, address _spender)
        view public returns (uint256 remaining) {
          return allowed[_owner][_spender];
            }
    
        function multisend(address[] addrs,  uint256 _value)
        {
            uint length = addrs.length;
            require(_value * length <= balances[msg.sender]);
            uint i = 0;
            while (i < length) {
               transfer(addrs[i], _value);
               i ++;
            }
            
          }
        
        
        
        // lock token of founder for periodically release
        // _address: founder address; 
        // _value: totoal locked token; 
        // _round: rounds founder could withdraw; 
        // _period: interval time between two rounds
        function setFounderLock(address _address, uint256 _value, uint _round, uint256 _period)  internal onlyOwner{
            founderLockance[_address].amount = _value;
            founderLockance[_address].startTime = now;
            founderLockance[_address].remainRound = _round;
            founderLockance[_address].totalRound = _round;
            founderLockance[_address].period = _period;
        }
        
        
        // allow locked token to be obtained for founder 
        function unlockFounder () {
            require(now >= founderLockance[msg.sender].startTime + (founderLockance[msg.sender].totalRound - founderLockance[msg.sender].remainRound + 1) * founderLockance[msg.sender].period);
            require(founderLockance[msg.sender].remainRound > 0);
            uint256 changeAmount = founderLockance[msg.sender].amount.div(founderLockance[msg.sender].remainRound);
            balances[msg.sender] += changeAmount;
            founderLockance[msg.sender].amount -= changeAmount;
            _initialAmount += changeAmount;
            founderLockance[msg.sender].remainRound --;
            FounderUnlock(msg.sender, changeAmount);
        }
        
        function freezeAccount (address _target) onlyOwner {
            isFreezed[_target] = true;
        }
        function unfreezeAccount (address _target) onlyOwner {
            isFreezed[_target] = false;
        }
        function ownerUnlock (address _target, uint256 _value) onlyOwner {
            require(founderLockance[_target].amount >= _value);
            founderLockance[_target].amount -= _value;
            balances[_target] += _value;
            _initialAmount += _value;
        }
        
        // starts ICO
        function openIco () onlyOwner{
            icoOpen = true;
          }
        // ends ICO 
        function closeIco () onlyOwner inIco{
            icoOpen = false;
          }
    
        // transfer all unsold token to bounty balance;
        function weAreClosed () onlyOwner{
            balances[contract_owner] += publicToken;
            transfer(privateSaleAdd, publicToken);
            publicToken = 0;
        }
        // change rate of public sale
        function changeRate (uint256 _rate) onlyOwner{
            exchangeRate = _rate;
        }    
        
        //  withdraw ETH from contract
        function withdraw() onlyOwner{
            contract_owner.transfer(this.balance);
          }
        // fallback function for receive ETH during ICO
        function () payable inIco{
            require(msg.value >= 10**18);
            uint256 tokenChange = (msg.value * exchangeRate).div(10**18);
            require(tokenChange <= publicToken);
            balances[msg.sender] += tokenChange;
            publicToken = publicToken.sub(tokenChange);
          }
    }