ETH Price: $1,817.90 (+0.29%)
Gas: 32 Gwei
 

Overview

ETH Balance

4.57 ETH

Eth Value

$8,307.80 (@ $1,817.90/ETH)

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Value
Buy Tokens60356172018-07-26 21:46:101759 days 1 hr ago1532641570IN
0x07c1C8...1615CE54
0 ETH0.000113221.21
Withdraw59802452018-07-17 11:11:021768 days 11 hrs ago1531825862IN
0x07c1C8...1615CE54
0 ETH0.000069312
Buy Tokens59332222018-07-09 12:51:331776 days 10 hrs ago1531140693IN
0x07c1C8...1615CE54
0 ETH0.0018740820
Buy Tokens57410702018-06-06 8:19:551809 days 14 hrs ago1528273195IN
0x07c1C8...1615CE54
0 ETH0.0020614822
Buy Tokens57190152018-06-02 10:19:481813 days 12 hrs ago1527934788IN
0x07c1C8...1615CE54
0 ETH0.001171312.5
Buy Tokens57034122018-05-30 16:00:541816 days 7 hrs ago1527696054IN
0x07c1C8...1615CE54
0 ETH0.0020146321.5
Buy Tokens57032822018-05-30 15:25:281816 days 7 hrs ago1527693928IN
0x07c1C8...1615CE54
0 ETH0.0018740820
Buy Tokens56769762018-05-25 23:53:261820 days 23 hrs ago1527292406IN
0x07c1C8...1615CE54
0 ETH0.000655927
Buy Tokens56762242018-05-25 20:38:291821 days 2 hrs ago1527280709IN
0x07c1C8...1615CE54
0 ETH0.000754318.05
Buy Tokens56746862018-05-25 14:00:471821 days 9 hrs ago1527256847IN
0x07c1C8...1615CE54
0 ETH0.0013886614.84
Buy Tokens56717902018-05-25 1:38:281821 days 21 hrs ago1527212308IN
0x07c1C8...1615CE54
0 ETH0.000374814
Buy Tokens56683542018-05-24 11:09:231822 days 12 hrs ago1527160163IN
0x07c1C8...1615CE54
0 ETH0.0012910613.7875
Buy Tokens56652062018-05-23 21:37:511823 days 1 hr ago1527111471IN
0x07c1C8...1615CE54
0 ETH0.000468525
Buy Tokens56618922018-05-23 7:32:551823 days 15 hrs ago1527060775IN
0x07c1C8...1615CE54
0 ETH0.0013118514
Buy Tokens56590292018-05-22 19:14:081824 days 3 hrs ago1527016448IN
0x07c1C8...1615CE54
0 ETH0.0013118514
Transfer56590012018-05-22 19:05:411824 days 4 hrs ago1527015941IN
0x07c1C8...1615CE54
1.00672475 ETH0.0012222914
Buy Tokens56585382018-05-22 17:02:191824 days 6 hrs ago1527008539IN
0x07c1C8...1615CE54
0 ETH0.0012156513
Transfer56582372018-05-22 15:45:581824 days 7 hrs ago1527003958IN
0x07c1C8...1615CE54
1.0793 ETH0.0013445215.4
Buy Tokens56578792018-05-22 14:06:591824 days 9 hrs ago1526998019IN
0x07c1C8...1615CE54
0 ETH0.0012087812.9
Transfer56574822018-05-22 12:31:011824 days 10 hrs ago1526992261IN
0x07c1C8...1615CE54
1.01464956 ETH0.0010564112.1
Transfer56571472018-05-22 11:01:431824 days 12 hrs ago1526986903IN
0x07c1C8...1615CE54
1.18930094 ETH0.0008022914
Transfer56570582018-05-22 10:39:461824 days 12 hrs ago1526985586IN
0x07c1C8...1615CE54
6.68999918 ETH0.0012896214.77112217
Transfer56569162018-05-22 10:05:041824 days 13 hrs ago1526983504IN
0x07c1C8...1615CE54
3.03395643 ETH0.0024445928
Transfer56568192018-05-22 9:39:461824 days 13 hrs ago1526981986IN
0x07c1C8...1615CE54
6.63 ETH0.0010476812
Transfer56563932018-05-22 7:51:581824 days 15 hrs ago1526975518IN
0x07c1C8...1615CE54
2.47 ETH0.0010476812
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
60356172018-07-26 21:46:101759 days 1 hr ago1532641570
0x07c1C8...1615CE54
1.01 ETH
59802452018-07-17 11:11:021768 days 11 hrs ago1531825862
0x07c1C8...1615CE54
1.1643 ETH
59332222018-07-09 12:51:331776 days 10 hrs ago1531140693
0x07c1C8...1615CE54
6.68999918 ETH
57410702018-06-06 8:19:551809 days 14 hrs ago1528273195
0x07c1C8...1615CE54
2 ETH
57190152018-06-02 10:19:481813 days 12 hrs ago1527934788
0x07c1C8...1615CE54
1.05 ETH
57034122018-05-30 16:00:541816 days 7 hrs ago1527696054
0x07c1C8...1615CE54
1.62295956 ETH
57032822018-05-30 15:25:281816 days 7 hrs ago1527693928
0x07c1C8...1615CE54
1.00672475 ETH
56769762018-05-25 23:53:261820 days 23 hrs ago1527292406
0x07c1C8...1615CE54
3.31 ETH
56762242018-05-25 20:38:291821 days 2 hrs ago1527280709
0x07c1C8...1615CE54
6.63 ETH
56746862018-05-25 14:00:471821 days 9 hrs ago1527256847
0x07c1C8...1615CE54
1.01464956 ETH
56717902018-05-25 1:38:281821 days 21 hrs ago1527212308
0x07c1C8...1615CE54
1.07798 ETH
56683542018-05-24 11:09:231822 days 12 hrs ago1527160163
0x07c1C8...1615CE54
2.34202894 ETH
56652062018-05-23 21:37:511823 days 1 hr ago1527111471
0x07c1C8...1615CE54
1.35287284 ETH
56618922018-05-23 7:32:551823 days 15 hrs ago1527060775
0x07c1C8...1615CE54
3.03395643 ETH
56590292018-05-22 19:14:081824 days 3 hrs ago1527016448
0x07c1C8...1615CE54
1 ETH
56585382018-05-22 17:02:191824 days 6 hrs ago1527008539
0x07c1C8...1615CE54
1.0793 ETH
56578792018-05-22 14:06:591824 days 9 hrs ago1526998019
0x07c1C8...1615CE54
1.7 ETH
56541152018-05-21 22:08:551825 days 1 hr ago1526940535
0x07c1C8...1615CE54
2.44763593 ETH
56539782018-05-21 21:35:391825 days 1 hr ago1526938539
0x07c1C8...1615CE54
10.16 ETH
56479652018-05-20 20:06:331826 days 3 hrs ago1526846793
0x07c1C8...1615CE54
1.02502802 ETH
56453172018-05-20 9:00:161826 days 14 hrs ago1526806816
0x07c1C8...1615CE54
1 ETH
56391102018-05-19 6:22:161827 days 16 hrs ago1526710936
0x07c1C8...1615CE54
10.35950731 ETH
56374422018-05-18 23:16:341827 days 23 hrs ago1526685394
0x07c1C8...1615CE54
1 ETH
56370132018-05-18 21:35:351828 days 1 hr ago1526679335
0x07c1C8...1615CE54
1.01 ETH
56359322018-05-18 17:05:071828 days 6 hrs ago1526663107
0x07c1C8...1615CE54
1 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xF7a110...5726Ae20

Contract Name:
RCpro

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-11
*/

pragma solidity ^0.4.19;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
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) {
    // 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 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;
  }
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;
  
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() internal {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}

contract tokenInterface {
	function balanceOf(address _owner) public constant returns (uint256 balance);
	function transfer(address _to, uint256 _value) public returns (bool);
}

contract rateInterface {
    function readRate(string _currency) public view returns (uint256 oneEtherValue);
}

contract ICOEngineInterface {

    // false if the ico is not started, true if the ico is started and running, true if the ico is completed
    function started() public view returns(bool);

    // false if the ico is not started, false if the ico is started and running, true if the ico is completed
    function ended() public view returns(bool);

    // time stamp of the starting time of the ico, must return 0 if it depends on the block number
    function startTime() public view returns(uint);

    // time stamp of the ending time of the ico, must retrun 0 if it depends on the block number
    function endTime() public view returns(uint);

    // Optional function, can be implemented in place of startTime
    // Returns the starting block number of the ico, must return 0 if it depends on the time stamp
    // function startBlock() public view returns(uint);

    // Optional function, can be implemented in place of endTime
    // Returns theending block number of the ico, must retrun 0 if it depends on the time stamp
    // function endBlock() public view returns(uint);

    // returns the total number of the tokens available for the sale, must not change when the ico is started
    function totalTokens() public view returns(uint);

    // returns the number of the tokens available for the ico. At the moment that the ico starts it must be equal to totalTokens(),
    // then it will decrease. It is used to calculate the percentage of sold tokens as remainingTokens() / totalTokens()
    function remainingTokens() public view returns(uint);

    // return the price as number of tokens released for each ether
    function price() public view returns(uint);
}

contract KYCBase {
    using SafeMath for uint256;

    mapping (address => bool) public isKycSigner;
    mapping (uint64 => uint256) public alreadyPayed;

    event KycVerified(address indexed signer, address buyerAddress, uint64 buyerId, uint maxAmount);

    function KYCBase(address [] kycSigners) internal {
        for (uint i = 0; i < kycSigners.length; i++) {
            isKycSigner[kycSigners[i]] = true;
        }
    }

    // Must be implemented in descending contract to assign tokens to the buyers. Called after the KYC verification is passed
    function releaseTokensTo(address buyer) internal returns(bool);

    // This method can be overridden to enable some sender to buy token for a different address
    function senderAllowedFor(address buyer)
        internal view returns(bool)
    {
        return buyer == msg.sender;
    }

    function buyTokensFor(address buyerAddress, uint64 buyerId, uint maxAmount, uint8 v, bytes32 r, bytes32 s)
        public payable returns (bool)
    {
        require(senderAllowedFor(buyerAddress));
        return buyImplementation(buyerAddress, buyerId, maxAmount, v, r, s);
    }

    function buyTokens(uint64 buyerId, uint maxAmount, uint8 v, bytes32 r, bytes32 s)
        public payable returns (bool)
    {
        return buyImplementation(msg.sender, buyerId, maxAmount, v, r, s);
    }

    function buyImplementation(address buyerAddress, uint64 buyerId, uint maxAmount, uint8 v, bytes32 r, bytes32 s)
        private returns (bool)
    {
        // check the signature
        bytes32 hash = sha256("Eidoo icoengine authorization", address(0), buyerAddress, buyerId, maxAmount); //replaced this with address(0);
        address signer = ecrecover(hash, v, r, s);
        if (!isKycSigner[signer]) {
            revert();
        } else {
            uint256 totalPayed = alreadyPayed[buyerId].add(msg.value);
            require(totalPayed <= maxAmount);
            alreadyPayed[buyerId] = totalPayed;
            emit KycVerified(signer, buyerAddress, buyerId, maxAmount);
            return releaseTokensTo(buyerAddress);
        }
    }
}

contract RC is ICOEngineInterface, KYCBase {
    using SafeMath for uint256;
    TokenSale tokenSaleContract;
    uint256 public startTime;
    uint256 public endTime;
    
    uint256 public etherMinimum;
    uint256 public soldTokens;
    uint256 public remainingTokens;
    
    uint256 public oneTokenInFiatWei;
	
	
	mapping(address => uint256) public etherUser; // address => ether amount
	mapping(address => uint256) public pendingTokenUser; // address => token amount that will be claimed
	mapping(address => uint256) public tokenUser; // address => token amount owned
	uint256[] public tokenThreshold; // array of token threshold reached in wei of token
    uint256[] public bonusThreshold; // array of bonus of each tokenThreshold reached - 20% = 20

    function RC(address _tokenSaleContract, uint256 _oneTokenInFiatWei, uint256 _remainingTokens, uint256 _etherMinimum, uint256 _startTime , uint256 _endTime, address [] kycSigner, uint256[] _tokenThreshold, uint256[] _bonusThreshold ) public KYCBase(kycSigner) {
        require ( _tokenSaleContract != 0 );
        require ( _oneTokenInFiatWei != 0 );
        require( _remainingTokens != 0 );
        require ( _tokenThreshold.length != 0 );
        require ( _tokenThreshold.length == _bonusThreshold.length );
        bonusThreshold = _bonusThreshold;
        tokenThreshold = _tokenThreshold;
        
        
        tokenSaleContract = TokenSale(_tokenSaleContract);
        
        tokenSaleContract.addMeByRC();
        
        soldTokens = 0;
        remainingTokens = _remainingTokens;
        oneTokenInFiatWei = _oneTokenInFiatWei;
        etherMinimum = _etherMinimum;
        
        setTimeRC( _startTime, _endTime );
    }
    
    function setTimeRC(uint256 _startTime, uint256 _endTime ) internal {
        if( _startTime == 0 ) {
            startTime = tokenSaleContract.startTime();
        } else {
            startTime = _startTime;
        }
        if( _endTime == 0 ) {
            endTime = tokenSaleContract.endTime();
        } else {
            endTime = _endTime;
        }
    }
    
    modifier onlyTokenSaleOwner() {
        require(msg.sender == tokenSaleContract.owner() );
        _;
    }
    
    function setTime(uint256 _newStart, uint256 _newEnd) public onlyTokenSaleOwner {
        if ( _newStart != 0 ) startTime = _newStart;
        if ( _newEnd != 0 ) endTime = _newEnd;
    }
    
    function changeMinimum(uint256 _newEtherMinimum) public onlyTokenSaleOwner {
        etherMinimum = _newEtherMinimum;
    }
    
    function releaseTokensTo(address buyer) internal returns(bool) {
        if( msg.value > 0 ) takeEther(buyer);
        giveToken(buyer);
        return true;
    }
    
    function started() public view returns(bool) {
        return now > startTime || remainingTokens == 0;
    }
    
    function ended() public view returns(bool) {
        return now > endTime || remainingTokens == 0;
    }
    
    function startTime() public view returns(uint) {
        return startTime;
    }
    
    function endTime() public view returns(uint) {
        return endTime;
    }
    
    function totalTokens() public view returns(uint) {
        return remainingTokens.add(soldTokens);
    }
    
    function remainingTokens() public view returns(uint) {
        return remainingTokens;
    }
    
    function price() public view returns(uint) {
        uint256 oneEther = 10**18;
        return oneEther.mul(10**18).div( tokenSaleContract.tokenValueInEther(oneTokenInFiatWei) );
    }
	
	function () public payable{
	    require( now > startTime );
	    if(now < endTime) {
	        takeEther(msg.sender);
	    } else {
	        claimTokenBonus(msg.sender);
	    }

	}
	
	event Buy(address buyer, uint256 value, uint256 soldToken, uint256 valueTokenInUsdWei );
	
	function takeEther(address _buyer) internal {
	    require( now > startTime );
        require( now < endTime );
        require( msg.value >= etherMinimum); 
        require( remainingTokens > 0 );
        
        uint256 oneToken = 10 ** uint256(tokenSaleContract.decimals());
        uint256 tokenValue = tokenSaleContract.tokenValueInEther(oneTokenInFiatWei);
        uint256 tokenAmount = msg.value.mul(oneToken).div(tokenValue);
        
        uint256 unboughtTokens = tokenInterface(tokenSaleContract.tokenContract()).balanceOf(tokenSaleContract);
        if ( unboughtTokens > remainingTokens ) {
            unboughtTokens = remainingTokens;
        }
        
        uint256 refund = 0;
        if ( unboughtTokens < tokenAmount ) {
            refund = (tokenAmount - unboughtTokens).mul(tokenValue).div(oneToken);
            tokenAmount = unboughtTokens;
			remainingTokens = 0; // set remaining token to 0
            _buyer.transfer(refund);
        } else {
			remainingTokens = remainingTokens.sub(tokenAmount); // update remaining token without bonus
        }
        
        etherUser[_buyer] = etherUser[_buyer].add(msg.value.sub(refund));
        pendingTokenUser[_buyer] = pendingTokenUser[_buyer].add(tokenAmount);	
        
        emit Buy( _buyer, msg.value, tokenAmount, oneTokenInFiatWei );
	}
	
	function giveToken(address _buyer) internal {
	    require( pendingTokenUser[_buyer] > 0 );

		tokenUser[_buyer] = tokenUser[_buyer].add(pendingTokenUser[_buyer]);
	
		tokenSaleContract.claim(_buyer, pendingTokenUser[_buyer]);
		soldTokens = soldTokens.add(pendingTokenUser[_buyer]);
		pendingTokenUser[_buyer] = 0;
		
		tokenSaleContract.wallet().transfer(etherUser[_buyer]);
		etherUser[_buyer] = 0;
	}

    function claimTokenBonus(address _buyer) internal {
        require( now > endTime );
        require( tokenUser[_buyer] > 0 );
        uint256 bonusApplied = 0;
        for (uint i = 0; i < tokenThreshold.length; i++) {
            if ( soldTokens > tokenThreshold[i] ) {
                bonusApplied = bonusThreshold[i];
			}
		}    
		require( bonusApplied > 0 );
		
		uint256 addTokenAmount = tokenUser[_buyer].mul( bonusApplied ).div(10**2);
		tokenUser[_buyer] = 0; 
		
		tokenSaleContract.claim(_buyer, addTokenAmount);
		_buyer.transfer(msg.value);
    }
    
    function refundEther(address to) public onlyTokenSaleOwner {
        to.transfer(etherUser[to]);
        etherUser[to] = 0;
        pendingTokenUser[to] = 0;
    }
    
    function withdraw(address to, uint256 value) public onlyTokenSaleOwner { 
        to.transfer(value);
    }
	
	function userBalance(address _user) public view returns( uint256 _pendingTokenUser, uint256 _tokenUser, uint256 _etherUser ) {
		return (pendingTokenUser[_user], tokenUser[_user], etherUser[_user]);
	}
}

contract RCpro is ICOEngineInterface, KYCBase {
    using SafeMath for uint256;
    TokenSale tokenSaleContract;
    uint256 public startTime;
    uint256 public endTime;
    
    uint256 public etherMinimum;
    uint256 public soldTokens;
    uint256 public remainingTokens;
    
    uint256[] public oneTokenInFiatWei;
    uint256[] public sendThreshold;
	
	
	mapping(address => uint256) public etherUser; // address => ether amount
	mapping(address => uint256) public pendingTokenUser; // address => token amount that will be claimed
	mapping(address => uint256) public tokenUser; // address => token amount owned
	uint256[] public tokenThreshold; // array of token threshold reached in wei of token
    uint256[] public bonusThreshold; // array of bonus of each tokenThreshold reached - 20% = 20

    function RCpro(address _tokenSaleContract, uint256[] _oneTokenInFiatWei, uint256[] _sendThreshold, uint256 _remainingTokens, uint256 _etherMinimum, uint256 _startTime , uint256 _endTime, address [] kycSigner, uint256[] _tokenThreshold, uint256[] _bonusThreshold ) public KYCBase(kycSigner) {
        require ( _tokenSaleContract != 0 );
        require ( _oneTokenInFiatWei[0] != 0 );
        require ( _oneTokenInFiatWei.length == _sendThreshold.length );
        require( _remainingTokens != 0 );
        require ( _tokenThreshold.length != 0 );
        require ( _tokenThreshold.length == _bonusThreshold.length );
        bonusThreshold = _bonusThreshold;
        tokenThreshold = _tokenThreshold;
        
        
        tokenSaleContract = TokenSale(_tokenSaleContract);
        
        tokenSaleContract.addMeByRC();
        
        soldTokens = 0;
        remainingTokens = _remainingTokens;
        oneTokenInFiatWei = _oneTokenInFiatWei;
        sendThreshold = _sendThreshold;
        etherMinimum = _etherMinimum;
        
        setTimeRC( _startTime, _endTime );
    }
    
    function setTimeRC(uint256 _startTime, uint256 _endTime ) internal {
        if( _startTime == 0 ) {
            startTime = tokenSaleContract.startTime();
        } else {
            startTime = _startTime;
        }
        if( _endTime == 0 ) {
            endTime = tokenSaleContract.endTime();
        } else {
            endTime = _endTime;
        }
    }
    
    modifier onlyTokenSaleOwner() {
        require(msg.sender == tokenSaleContract.owner() );
        _;
    }
    
    function setTime(uint256 _newStart, uint256 _newEnd) public onlyTokenSaleOwner {
        if ( _newStart != 0 ) startTime = _newStart;
        if ( _newEnd != 0 ) endTime = _newEnd;
    }
    
    function changeMinimum(uint256 _newEtherMinimum) public onlyTokenSaleOwner {
        etherMinimum = _newEtherMinimum;
    }
    
    function releaseTokensTo(address buyer) internal returns(bool) {
        if( msg.value > 0 ) takeEther(buyer);
        giveToken(buyer);
        return true;
    }
    
    function started() public view returns(bool) {
        return now > startTime || remainingTokens == 0;
    }
    
    function ended() public view returns(bool) {
        return now > endTime || remainingTokens == 0;
    }
    
    function startTime() public view returns(uint) {
        return startTime;
    }
    
    function endTime() public view returns(uint) {
        return endTime;
    }
    
    function totalTokens() public view returns(uint) {
        return remainingTokens.add(soldTokens);
    }
    
    function remainingTokens() public view returns(uint) {
        return remainingTokens;
    }
    
    function price() public view returns(uint) {
        uint256 oneEther = 10**18;
        return oneEther.mul(10**18).div( tokenSaleContract.tokenValueInEther(oneTokenInFiatWei[0]) );
    }
	
	function () public payable{
	    require( now > startTime );
	    if(now < endTime) {
	        takeEther(msg.sender);
	    } else {
	        claimTokenBonus(msg.sender);
	    }

	}
	
	event Buy(address buyer, uint256 value, uint256 soldToken, uint256 valueTokenInFiatWei );
	
	function takeEther(address _buyer) internal {
	    require( now > startTime );
        require( now < endTime );
        require( msg.value >= etherMinimum); 
        require( remainingTokens > 0 );
        
        uint256 oneToken = 10 ** uint256(tokenSaleContract.decimals());
		
		uint256 tknPriceApplied = 0;
        for (uint i = 0; i < sendThreshold.length; i++) {
            if ( msg.value >= sendThreshold[i] ) {
                tknPriceApplied = oneTokenInFiatWei[i];
			}
		}    
		require( tknPriceApplied > 0 );
		
        uint256 tokenValue = tokenSaleContract.tokenValueInEther(tknPriceApplied);
        uint256 tokenAmount = msg.value.mul(oneToken).div(tokenValue);
        
        uint256 unboughtTokens = tokenInterface(tokenSaleContract.tokenContract()).balanceOf(tokenSaleContract);
        if ( unboughtTokens > remainingTokens ) {
            unboughtTokens = remainingTokens;
        }
        
        uint256 refund = 0;
        if ( unboughtTokens < tokenAmount ) {
            refund = (tokenAmount - unboughtTokens).mul(tokenValue).div(oneToken);
            tokenAmount = unboughtTokens;
			remainingTokens = 0; // set remaining token to 0
            _buyer.transfer(refund);
        } else {
			remainingTokens = remainingTokens.sub(tokenAmount); // update remaining token without bonus
        }
        
        etherUser[_buyer] = etherUser[_buyer].add(msg.value.sub(refund));
        pendingTokenUser[_buyer] = pendingTokenUser[_buyer].add(tokenAmount);	
        
        emit Buy( _buyer, msg.value, tokenAmount, tknPriceApplied );
	}
	
	function giveToken(address _buyer) internal {
	    require( pendingTokenUser[_buyer] > 0 );

		tokenUser[_buyer] = tokenUser[_buyer].add(pendingTokenUser[_buyer]);
	
		tokenSaleContract.claim(_buyer, pendingTokenUser[_buyer]);
		soldTokens = soldTokens.add(pendingTokenUser[_buyer]);
		pendingTokenUser[_buyer] = 0;
		
		tokenSaleContract.wallet().transfer(etherUser[_buyer]);
		etherUser[_buyer] = 0;
	}

    function claimTokenBonus(address _buyer) internal {
        require( now > endTime );
        require( tokenUser[_buyer] > 0 );
        uint256 bonusApplied = 0;
        for (uint i = 0; i < tokenThreshold.length; i++) {
            if ( soldTokens > tokenThreshold[i] ) {
                bonusApplied = bonusThreshold[i];
			}
		}    
		require( bonusApplied > 0 );
		
		uint256 addTokenAmount = tokenUser[_buyer].mul( bonusApplied ).div(10**2);
		tokenUser[_buyer] = 0; 
		
		tokenSaleContract.claim(_buyer, addTokenAmount);
		_buyer.transfer(msg.value);
    }
    
    function refundEther(address to) public onlyTokenSaleOwner {
        to.transfer(etherUser[to]);
        etherUser[to] = 0;
        pendingTokenUser[to] = 0;
    }
    
    function withdraw(address to, uint256 value) public onlyTokenSaleOwner { 
        to.transfer(value);
    }
	
	function userBalance(address _user) public view returns( uint256 _pendingTokenUser, uint256 _tokenUser, uint256 _etherUser ) {
		return (pendingTokenUser[_user], tokenUser[_user], etherUser[_user]);
	}
}

contract TokenSale is Ownable {
    using SafeMath for uint256;
    tokenInterface public tokenContract;
    rateInterface public rateContract;
    
    address public wallet;
    address public advisor;
    uint256 public advisorFee; // 1 = 0,1%
    
	uint256 public constant decimals = 18;
    
    uint256 public endTime;  // seconds from 1970-01-01T00:00:00Z
    uint256 public startTime;  // seconds from 1970-01-01T00:00:00Z

    mapping(address => bool) public rc;


    function TokenSale(address _tokenAddress, address _rateAddress, uint256 _startTime, uint256 _endTime) public {
        tokenContract = tokenInterface(_tokenAddress);
        rateContract = rateInterface(_rateAddress);
        setTime(_startTime, _endTime); 
        wallet = msg.sender;
        advisor = msg.sender;
        advisorFee = 0 * 10**3;
    }
    
    function tokenValueInEther(uint256 _oneTokenInFiatWei) public view returns(uint256 tknValue) {
        uint256 oneEtherInUsd = rateContract.readRate("usd");
        tknValue = _oneTokenInFiatWei.mul(10 ** uint256(decimals)).div(oneEtherInUsd);
        return tknValue;
    } 
    
    modifier isBuyable() {
        require( now > startTime ); // check if started
        require( now < endTime ); // check if ended
        require( msg.value > 0 );
		
		uint256 remainingTokens = tokenContract.balanceOf(this);
        require( remainingTokens > 0 ); // Check if there are any remaining tokens 
        _;
    }
    
    event Buy(address buyer, uint256 value, address indexed ambassador);
    
    modifier onlyRC() {
        require( rc[msg.sender] ); //check if is an authorized rcContract
        _;
    }
    
    function buyFromRC(address _buyer, uint256 _rcTokenValue, uint256 _remainingTokens) onlyRC isBuyable public payable returns(uint256) {
        uint256 oneToken = 10 ** uint256(decimals);
        uint256 tokenValue = tokenValueInEther(_rcTokenValue);
        uint256 tokenAmount = msg.value.mul(oneToken).div(tokenValue);
        address _ambassador = msg.sender;
        
        
        uint256 remainingTokens = tokenContract.balanceOf(this);
        if ( _remainingTokens < remainingTokens ) {
            remainingTokens = _remainingTokens;
        }
        
        if ( remainingTokens < tokenAmount ) {
            uint256 refund = (tokenAmount - remainingTokens).mul(tokenValue).div(oneToken);
            tokenAmount = remainingTokens;
            forward(msg.value-refund);
			remainingTokens = 0; // set remaining token to 0
             _buyer.transfer(refund);
        } else {
			remainingTokens = remainingTokens.sub(tokenAmount); // update remaining token without bonus
            forward(msg.value);
        }
        
        tokenContract.transfer(_buyer, tokenAmount);
        emit Buy(_buyer, tokenAmount, _ambassador);
		
        return tokenAmount; 
    }
    
    function forward(uint256 _amount) internal {
        uint256 advisorAmount = _amount.mul(advisorFee).div(10**3);
        uint256 walletAmount = _amount - advisorAmount;
        advisor.transfer(advisorAmount);
        wallet.transfer(walletAmount);
    }

    event NewRC(address contr);
    
    function addMeByRC() public {
        require(tx.origin == owner);
        
        rc[ msg.sender ]  = true;
        
        emit NewRC(msg.sender);
    }
    
    function setTime(uint256 _newStart, uint256 _newEnd) public onlyOwner {
        if ( _newStart != 0 ) startTime = _newStart;
        if ( _newEnd != 0 ) endTime = _newEnd;
    }

    function withdraw(address to, uint256 value) public onlyOwner {
        to.transfer(value);
    }
    
    function withdrawTokens(address to, uint256 value) public onlyOwner returns (bool) {
        return tokenContract.transfer(to, value);
    }
    
    function setTokenContract(address _tokenContract) public onlyOwner {
        tokenContract = tokenInterface(_tokenContract);
    }

    function setWalletAddress(address _wallet) public onlyOwner {
        wallet = _wallet;
    }
    
    function setAdvisorAddress(address _advisor) public onlyOwner {
            advisor = _advisor;
    }
    
    function setAdvisorFee(uint256 _advisorFee) public onlyOwner {
            advisorFee = _advisorFee;
    }
    
    function setRateContract(address _rateAddress) public onlyOwner {
        rateContract = rateInterface(_rateAddress);
    }
	
	function claim(address _buyer, uint256 _amount) onlyRC public returns(bool) {
        return tokenContract.transfer(_buyer, _amount);
    }

    function () public payable {
        revert();
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"userBalance","outputs":[{"name":"_pendingTokenUser","type":"uint256"},{"name":"_tokenUser","type":"uint256"},{"name":"_etherUser","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sendThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isKycSigner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ended","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"started","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"refundEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newEtherMinimum","type":"uint256"}],"name":"changeMinimum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pendingTokenUser","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"soldTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"etherMinimum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherUser","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint64"}],"name":"alreadyPayed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newStart","type":"uint256"},{"name":"_newEnd","type":"uint256"}],"name":"setTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyerAddress","type":"address"},{"name":"buyerId","type":"uint64"},{"name":"maxAmount","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"buyTokensFor","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"bonusThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"remainingTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenUser","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"oneTokenInFiatWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyerId","type":"uint64"},{"name":"maxAmount","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"buyTokens","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_tokenSaleContract","type":"address"},{"name":"_oneTokenInFiatWei","type":"uint256[]"},{"name":"_sendThreshold","type":"uint256[]"},{"name":"_remainingTokens","type":"uint256"},{"name":"_etherMinimum","type":"uint256"},{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"kycSigner","type":"address[]"},{"name":"_tokenThreshold","type":"uint256[]"},{"name":"_bonusThreshold","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"soldToken","type":"uint256"},{"indexed":false,"name":"valueTokenInFiatWei","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signer","type":"address"},{"indexed":false,"name":"buyerAddress","type":"address"},{"indexed":false,"name":"buyerId","type":"uint64"},{"indexed":false,"name":"maxAmount","type":"uint256"}],"name":"KycVerified","type":"event"}]

60806040523480156200001157600080fd5b50604051620019483803806200194883398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01519799988901989687019795969495939492939183019290810191018260005b8151811015620000d157600160008084848151811015156200009657fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560010162000078565b5050600160a060020a038a161515620000e957600080fd5b886000815181101515620000f957fe5b6020908102909101015115156200010f57600080fd5b87518951146200011e57600080fd5b8615156200012b57600080fd5b815115156200013957600080fd5b80518251146200014857600080fd5b80516200015d90600e906020840190620003cc565b5081516200017390600d906020850190620003cc565b5060028054600160a060020a031916600160a060020a038c81169190911791829055604080517f66b52b93000000000000000000000000000000000000000000000000000000008152905192909116916366b52b939160048082019260009290919082900301818387803b158015620001eb57600080fd5b505af115801562000200573d6000803e3d6000fd5b50506000600655505060078790558851620002239060089060208c0190620003cc565b508751620002399060099060208b0190620003cc565b50600586905562000254858564010000000062000264810204565b505050505050505050506200043c565b8115156200031057600260009054906101000a9004600160a060020a0316600160a060020a03166378e979256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620002d957600080fd5b505af1158015620002ee573d6000803e3d6000fd5b505050506040513d60208110156200030557600080fd5b505160035562000316565b60038290555b801515620003c257600260009054906101000a9004600160a060020a0316600160a060020a0316633197cbb66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200038b57600080fd5b505af1158015620003a0573d6000803e3d6000fd5b505050506040513d6020811015620003b757600080fd5b5051600455620003c8565b60048190555b5050565b8280548282559060005260206000209081019282156200040a579160200282015b828111156200040a578251825591602001919060010190620003ed565b50620004189291506200041c565b5090565b6200043991905b8082111562000418576000815560010162000423565b90565b6114fc806200044c6000396000f30060806040526004361061012f5763ffffffff60e060020a6000350416630103c92b8114610160578063045351721461019f5780630570d568146101c957806312fa6feb146101fe5780631f2698ab146102135780631f378b8a146102285780632a513dd9146102495780633197cbb61461026157806334323d32146102765780635ed9ebfc14610297578063675cef14146102ac57806378e97925146102c15780637e1c0c09146102d6578063924669b2146102eb5780639a359d8e1461030c578063a0355eca1461032e578063a035b1fe14610349578063a6f8fd131461035e578063ae45783514610376578063bb9dea04146103a6578063bf583903146103be578063ce1ff67e146103d3578063dadddf94146103f4578063dee4b2461461040c578063f3fef3a314610430575b600354421161013d57600080fd5b6004544210156101555761015033610454565b61015e565b61015e336108c4565b005b34801561016c57600080fd5b50610181600160a060020a0360043516610a81565b60408051938452602084019290925282820152519081900360600190f35b3480156101ab57600080fd5b506101b7600435610ab3565b60408051918252519081900360200190f35b3480156101d557600080fd5b506101ea600160a060020a0360043516610ad2565b604080519115158252519081900360200190f35b34801561020a57600080fd5b506101ea610ae7565b34801561021f57600080fd5b506101ea610afe565b34801561023457600080fd5b5061015e600160a060020a0360043516610b13565b34801561025557600080fd5b5061015e600435610c12565b34801561026d57600080fd5b506101b7610cae565b34801561028257600080fd5b506101b7600160a060020a0360043516610cb4565b3480156102a357600080fd5b506101b7610cc6565b3480156102b857600080fd5b506101b7610ccc565b3480156102cd57600080fd5b506101b7610cd2565b3480156102e257600080fd5b506101b7610cd8565b3480156102f757600080fd5b506101b7600160a060020a0360043516610cf1565b34801561031857600080fd5b506101b767ffffffffffffffff60043516610d03565b34801561033a57600080fd5b5061015e600435602435610d15565b34801561035557600080fd5b506101b7610dc8565b34801561036a57600080fd5b506101b7600435610e8b565b6101ea600160a060020a036004351667ffffffffffffffff6024351660443560ff6064351660843560a435610e99565b3480156103b257600080fd5b506101b7600435610ec8565b3480156103ca57600080fd5b506101b7610ed6565b3480156103df57600080fd5b506101b7600160a060020a0360043516610edc565b34801561040057600080fd5b506101b7600435610eee565b6101ea67ffffffffffffffff6004351660243560ff60443516606435608435610efc565b34801561043c57600080fd5b5061015e600160a060020a0360043516602435610f16565b60008060008060008060006003544211151561046f57600080fd5b600454421061047d57600080fd5b60055434101561048c57600080fd5b60075460001061049b57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104ee57600080fd5b505af1158015610502573d6000803e3d6000fd5b505050506040513d602081101561051857600080fd5b5051600a0a9650600095508594505b60095485101561057957600980548690811061053f57fe5b90600052602060002001543410151561056e57600880548690811061056057fe5b906000526020600020015495505b600190940193610527565b6000861161058657600080fd5b600254604080517f7b413985000000000000000000000000000000000000000000000000000000008152600481018990529051600160a060020a0390921691637b413985916024808201926020929091908290030181600087803b1580156105ed57600080fd5b505af1158015610601573d6000803e3d6000fd5b505050506040513d602081101561061757600080fd5b5051935061063b8461062f348a63ffffffff610fe816565b9063ffffffff61101316565b9250600260009054906101000a9004600160a060020a0316600160a060020a03166355a373d66040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561069057600080fd5b505af11580156106a4573d6000803e3d6000fd5b505050506040513d60208110156106ba57600080fd5b5051600254604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b50516007549092508211156107635760075491505b506000828210156107d0576107848761062f8486038763ffffffff610fe816565b9050819250600060078190555087600160a060020a03166108fc829081150290604051600060405180830381858888f193505050501580156107ca573d6000803e3d6000fd5b506107e7565b6007546107e3908463ffffffff61102a16565b6007555b61081f6107fa348363ffffffff61102a16565b600160a060020a038a166000908152600a60205260409020549063ffffffff61103c16565b600160a060020a0389166000908152600a6020908152604080832093909355600b90522054610854908463ffffffff61103c16565b600160a060020a0389166000818152600b602090815260409182902093909355805191825234928201929092528082018590526060810188905290517fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d9181900360800190a15050505050505050565b6000806000600454421115156108d957600080fd5b600160a060020a0384166000908152600c6020526040812054116108fc57600080fd5b60009250600091505b600d5482101561095857600d80548390811061091d57fe5b9060005260206000200154600654111561094d57600e80548390811061093f57fe5b906000526020600020015492505b600190910190610905565b6000831161096557600080fd5b600160a060020a0384166000908152600c60205260409020546109959060649061062f908663ffffffff610fe816565b600160a060020a038086166000818152600c6020908152604080832083905560025481517faad3ec9600000000000000000000000000000000000000000000000000000000815260048101959095526024850187905290519596509093169363aad3ec96936044808501949193918390030190829087803b158015610a1957600080fd5b505af1158015610a2d573d6000803e3d6000fd5b505050506040513d6020811015610a4357600080fd5b5050604051600160a060020a038516903480156108fc02916000818181858888f19350505050158015610a7a573d6000803e3d6000fd5b5050505050565b600160a060020a03166000908152600b6020908152604080832054600c835281842054600a9093529220549192909190565b6009805482908110610ac157fe5b600091825260209091200154905081565b60006020819052908152604090205460ff1681565b6000600454421180610af95750600754155b905090565b6000600354421180610af95750506007541590565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b505050506040513d6020811015610b9057600080fd5b505133600160a060020a03908116911614610baa57600080fd5b600160a060020a0381166000818152600a602052604080822054905181156108fc0292818181858888f19350505050158015610bea573d6000803e3d6000fd5b50600160a060020a03166000908152600a60209081526040808320839055600b909152812055565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d6020811015610c8f57600080fd5b505133600160a060020a03908116911614610ca957600080fd5b600555565b60045490565b600b6020526000908152604090205481565b60065481565b60055481565b60035490565b6000610af960065460075461103c90919063ffffffff16565b600a6020526000908152604090205481565b60016020526000908152604090205481565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d6857600080fd5b505af1158015610d7c573d6000803e3d6000fd5b505050506040513d6020811015610d9257600080fd5b505133600160a060020a03908116911614610dac57600080fd5b8115610db85760038290555b8015610dc45760048190555b5050565b60025460088054600092670de0b6b3a764000092610e8592600160a060020a0390921691637b413985919086908110610dfd57fe5b90600052602060002001546040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015610e4157600080fd5b505af1158015610e55573d6000803e3d6000fd5b505050506040513d6020811015610e6b57600080fd5b505161062f83670de0b6b3a764000063ffffffff610fe816565b91505090565b600d805482908110610ac157fe5b6000610ea48761104b565b1515610eaf57600080fd5b610ebd87878787878761105d565b979650505050505050565b600e805482908110610ac157fe5b60075490565b600c6020526000908152604090205481565b6008805482908110610ac157fe5b6000610f0c33878787878761105d565b9695505050505050565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f6957600080fd5b505af1158015610f7d573d6000803e3d6000fd5b505050506040513d6020811015610f9357600080fd5b505133600160a060020a03908116911614610fad57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610fe3573d6000803e3d6000fd5b505050565b6000828202831580611004575082848281151561100157fe5b04145b151561100c57fe5b9392505050565b600080828481151561102157fe5b04949350505050565b60008282111561103657fe5b50900390565b60008282018381101561100c57fe5b33600160a060020a0390811691161490565b604080517f4569646f6f2069636f656e67696e6520617574686f72697a6174696f6e00000081526000601d8201819052600160a060020a0389166c01000000000000000000000000026031830152780100000000000000000000000000000000000000000000000067ffffffffffffffff8916026045830152604d82018790529151829182918291600291606d808301926020929190829003018186865af115801561110d573d6000803e3d6000fd5b5050506040513d602081101561112257600080fd5b5051604080516000808252602082810180855285905260ff8c1683850152606083018b9052608083018a9052925193965060019360a08084019493601f19830193908390039091019190865af1158015611180573d6000803e3d6000fd5b505060408051601f190151600160a060020a03811660009081526020819052919091205490935060ff16151590506111b757600080fd5b67ffffffffffffffff89166000908152600160205260409020546111e1903463ffffffff61103c16565b9050878111156111f057600080fd5b67ffffffffffffffff89166000818152600160209081526040918290208490558151600160a060020a038e81168252918101939093528282018b90529051908416917f74e336db80b339721548db3209451cf01bd48e4a996e1bcea7f1a2abf8b06070919081900360600190a26112668a611274565b9a9950505050505050505050565b6000803411156112875761128782610454565b61129082611298565b506001919050565b600160a060020a0381166000908152600b6020526040812054116112bb57600080fd5b600160a060020a0381166000908152600b6020908152604080832054600c909252909120546112ef9163ffffffff61103c16565b600160a060020a038083166000818152600c6020908152604080832095909555600254600b82528583205486517faad3ec96000000000000000000000000000000000000000000000000000000008152600481019590955260248501529451949093169363aad3ec96936044808501949193918390030190829087803b15801561137857600080fd5b505af115801561138c573d6000803e3d6000fd5b505050506040513d60208110156113a257600080fd5b5050600160a060020a0381166000908152600b60205260409020546006546113cf9163ffffffff61103c16565b600655600160a060020a038082166000908152600b6020908152604080832083905560025481517f521eb273000000000000000000000000000000000000000000000000000000008152915194169363521eb27393600480840194938390030190829087803b15801561144157600080fd5b505af1158015611455573d6000803e3d6000fd5b505050506040513d602081101561146b57600080fd5b5051600160a060020a038281166000908152600a6020526040808220549051929093169280156108fc02929091818181858888f193505050501580156114b5573d6000803e3d6000fd5b50600160a060020a03166000908152600a60205260408120555600a165627a7a723058208f4ca234348bc17195595968b83f361155389fba09fa9ed4dafdf61b31548b890029000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e34000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000002116545850052128000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005af21de00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000030d98d59a960000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d005200000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab860000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

Swarm Source

bzzr://8f4ca234348bc17195595968b83f361155389fba09fa9ed4dafdf61b31548b89

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.