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

Overview

ETH Balance

1 ETH

Eth Value

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

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Value
Withdraw57427852018-06-06 15:38:441809 days 7 hrs ago1528299524IN
0x5a50C7...31F85604
0 ETH0.000311589
Transfer57268802018-06-03 19:48:141812 days 3 hrs ago1528055294IN
0x5a50C7...31F85604
0 ETH0.000335039
Transfer57242052018-06-03 8:29:181812 days 14 hrs ago1528014558IN
0x5a50C7...31F85604
0 ETH0.0009065141
Transfer57126552018-06-01 7:23:431814 days 15 hrs ago1527837823IN
0x5a50C7...31F85604
0 ETH0.0007445220
Transfer57113362018-06-01 1:36:361814 days 21 hrs ago1527816996IN
0x5a50C7...31F85604
0 ETH0.0007072919
Transfer57113242018-06-01 1:32:511814 days 21 hrs ago1527816771IN
0x5a50C7...31F85604
0 ETH0.00049419
Transfer57014092018-05-30 7:13:501816 days 15 hrs ago1527664430IN
0x5a50C7...31F85604
0 ETH0.0003722610
Transfer56993572018-05-29 22:32:501817 days 36 mins ago1527633170IN
0x5a50C7...31F85604
0 ETH0.0004467112
Transfer56991912018-05-29 21:52:591817 days 1 hr ago1527630779IN
0x5a50C7...31F85604
0 ETH0.000884440
Transfer56988942018-05-29 20:33:331817 days 2 hrs ago1527626013IN
0x5a50C7...31F85604
0 ETH0.0015262641
Transfer56977702018-05-29 15:47:571817 days 7 hrs ago1527608877IN
0x5a50C7...31F85604
0 ETH0.0004467112
Buy Tokens56976552018-05-29 15:18:481817 days 7 hrs ago1527607128IN
0x5a50C7...31F85604
0 ETH0.0011234112
Transfer56976432018-05-29 15:16:161817 days 7 hrs ago1527606976IN
0x5a50C7...31F85604
0 ETH0.0007445220
Transfer56963672018-05-29 9:41:241817 days 13 hrs ago1527586884IN
0x5a50C7...31F85604
0 ETH0.0005211614
Transfer56960472018-05-29 8:16:321817 days 14 hrs ago1527581792IN
0x5a50C7...31F85604
0 ETH0.0005211614
Transfer56953962018-05-29 5:44:151817 days 17 hrs ago1527572655IN
0x5a50C7...31F85604
0 ETH0.0005211614
Transfer56934652018-05-28 21:27:171818 days 1 hr ago1527542837IN
0x5a50C7...31F85604
0 ETH0.0004094811
Transfer56933262018-05-28 20:53:381818 days 2 hrs ago1527540818IN
0x5a50C7...31F85604
0 ETH0.0004094811
Transfer56932092018-05-28 20:28:341818 days 2 hrs ago1527539314IN
0x5a50C7...31F85604
0 ETH0.000316428.5
Transfer56931502018-05-28 20:12:471818 days 2 hrs ago1527538367IN
0x5a50C7...31F85604
0 ETH0.0004839313
Transfer56930152018-05-28 19:34:111818 days 3 hrs ago1527536051IN
0x5a50C7...31F85604
0 ETH0.0004839313
Transfer56928722018-05-28 18:59:371818 days 4 hrs ago1527533977IN
0x5a50C7...31F85604
0 ETH0.0004839313
Transfer56928622018-05-28 18:57:111818 days 4 hrs ago1527533831IN
0x5a50C7...31F85604
0 ETH0.0004839313
Transfer56928382018-05-28 18:51:331818 days 4 hrs ago1527533493IN
0x5a50C7...31F85604
0 ETH0.0004839313
Transfer56927762018-05-28 18:37:101818 days 4 hrs ago1527532630IN
0x5a50C7...31F85604
0 ETH0.0004839313
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
57427852018-06-06 15:38:441809 days 7 hrs ago1528299524
0x5a50C7...31F85604
0.201 ETH
56976552018-05-29 15:18:481817 days 7 hrs ago1527607128
0x5a50C7...31F85604
10 ETH
56900372018-05-28 7:01:221818 days 16 hrs ago1527490882
0x5a50C7...31F85604
0.3 ETH
56876882018-05-27 21:13:111819 days 1 hr ago1527455591
0x5a50C7...31F85604
0.4 ETH
56872772018-05-27 19:33:181819 days 3 hrs ago1527449598
0x5a50C7...31F85604
0.2 ETH
56870182018-05-27 18:29:311819 days 4 hrs ago1527445771
0x5a50C7...31F85604
0.2 ETH
56859272018-05-27 13:47:491819 days 9 hrs ago1527428869
0x5a50C7...31F85604
0.2 ETH
56856272018-05-27 12:27:461819 days 10 hrs ago1527424066
0x5a50C7...31F85604
0.21 ETH
56847202018-05-27 8:43:201819 days 14 hrs ago1527410600
0x5a50C7...31F85604
2 ETH
56846712018-05-27 8:32:111819 days 14 hrs ago1527409931
0x5a50C7...31F85604
0.2 ETH
56845152018-05-27 7:46:371819 days 15 hrs ago1527407197
0x5a50C7...31F85604
0.203717 ETH
56822152018-05-26 21:54:351820 days 1 hr ago1527371675
0x5a50C7...31F85604
0.2 ETH
56820682018-05-26 21:13:251820 days 1 hr ago1527369205
0x5a50C7...31F85604
0.23 ETH
56820592018-05-26 21:10:581820 days 1 hr ago1527369058
0x5a50C7...31F85604
1.5 ETH
56807262018-05-26 15:31:021820 days 7 hrs ago1527348662
0x5a50C7...31F85604
0.2 ETH
56803212018-05-26 13:48:021820 days 9 hrs ago1527342482
0x5a50C7...31F85604
0.36832325 ETH
56766252018-05-25 22:20:291821 days 49 mins ago1527286829
0x5a50C7...31F85604
0.2 ETH
56761572018-05-25 20:23:071821 days 2 hrs ago1527279787
0x5a50C7...31F85604
0.5 ETH
56736532018-05-25 9:35:321821 days 13 hrs ago1527240932
0x5a50C7...31F85604
0.2 ETH
56735682018-05-25 9:10:131821 days 13 hrs ago1527239413
0x5a50C7...31F85604
1 ETH
56733892018-05-25 8:31:051821 days 14 hrs ago1527237065
0x5a50C7...31F85604
0.2 ETH
56706582018-05-24 21:01:431822 days 2 hrs ago1527195703
0x5a50C7...31F85604
0.25 ETH
56702142018-05-24 19:03:011822 days 4 hrs ago1527188581
0x5a50C7...31F85604
1 ETH
56702042018-05-24 18:59:391822 days 4 hrs ago1527188379
0x5a50C7...31F85604
0.5 ETH
56691932018-05-24 14:44:581822 days 8 hrs ago1527173098
0x5a50C7...31F85604
1.85 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RC

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

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":"address"}],"name":"isKycSigner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oneTokenInFiatWei","outputs":[{"name":"","type":"uint256"}],"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":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":"_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":"valueTokenInUsdWei","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"}]

60806040523480156200001157600080fd5b506040516200183c3803806200183c83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151610100890151969895969495939492939182019290820191018260005b8151811015620000c357600160008084848151811015156200008857fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790556001016200006a565b5050600160a060020a0389161515620000db57600080fd5b871515620000e857600080fd5b861515620000f557600080fd5b815115156200010357600080fd5b80518251146200011257600080fd5b80516200012790600d9060208401906200036e565b5081516200013d90600c9060208501906200036e565b5060028054600160a060020a031916600160a060020a038b81169190911791829055604080517f66b52b93000000000000000000000000000000000000000000000000000000008152905192909116916366b52b939160048082019260009290919082900301818387803b158015620001b557600080fd5b505af1158015620001ca573d6000803e3d6000fd5b505060006006555050600787905560088890556005869055620001f7858564010000000062000206810204565b505050505050505050620003de565b811515620002b257600260009054906101000a9004600160a060020a0316600160a060020a03166378e979256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200027b57600080fd5b505af115801562000290573d6000803e3d6000fd5b505050506040513d6020811015620002a757600080fd5b5051600355620002b8565b60038290555b8015156200036457600260009054906101000a9004600160a060020a0316600160a060020a0316633197cbb66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200032d57600080fd5b505af115801562000342573d6000803e3d6000fd5b505050506040513d60208110156200035957600080fd5b50516004556200036a565b60048190555b5050565b828054828255906000526020600020908101928215620003ac579160200282015b82811115620003ac5782518255916020019190600101906200038f565b50620003ba929150620003be565b5090565b620003db91905b80821115620003ba5760008155600101620003c5565b90565b61144e80620003ee6000396000f3006080604052600436106101245763ffffffff60e060020a6000350416630103c92b81146101555780630570d5681461019457806312ade015146101c957806312fa6feb146101f05780631f2698ab146102055780631f378b8a1461021a5780632a513dd91461023b5780633197cbb61461025357806334323d32146102685780635ed9ebfc14610289578063675cef141461029e57806378e97925146102b35780637e1c0c09146102c8578063924669b2146102dd5780639a359d8e146102fe578063a0355eca14610320578063a035b1fe1461033b578063a6f8fd1314610350578063ae45783514610368578063bb9dea0414610398578063bf583903146103b0578063ce1ff67e146103c5578063dee4b246146103e6578063f3fef3a31461040a575b600354421161013257600080fd5b60045442101561014a576101453361042e565b610153565b6101533361083c565b005b34801561016157600080fd5b50610176600160a060020a03600435166109f9565b60408051938452602084019290925282820152519081900360600190f35b3480156101a057600080fd5b506101b5600160a060020a0360043516610a2b565b604080519115158252519081900360200190f35b3480156101d557600080fd5b506101de610a40565b60408051918252519081900360200190f35b3480156101fc57600080fd5b506101b5610a46565b34801561021157600080fd5b506101b5610a5d565b34801561022657600080fd5b50610153600160a060020a0360043516610a72565b34801561024757600080fd5b50610153600435610b6d565b34801561025f57600080fd5b506101de610c05565b34801561027457600080fd5b506101de600160a060020a0360043516610c0b565b34801561029557600080fd5b506101de610c1d565b3480156102aa57600080fd5b506101de610c23565b3480156102bf57600080fd5b506101de610c29565b3480156102d457600080fd5b506101de610c2f565b3480156102e957600080fd5b506101de600160a060020a0360043516610c48565b34801561030a57600080fd5b506101de67ffffffffffffffff60043516610c5a565b34801561032c57600080fd5b50610153600435602435610c6c565b34801561034757600080fd5b506101de610d1b565b34801561035c57600080fd5b506101de600435610ddf565b6101b5600160a060020a036004351667ffffffffffffffff6024351660443560ff6064351660843560a435610dfe565b3480156103a457600080fd5b506101de600435610e2d565b3480156103bc57600080fd5b506101de610e3b565b3480156103d157600080fd5b506101de600160a060020a0360043516610e41565b6101b567ffffffffffffffff6004351660243560ff60443516606435608435610e53565b34801561041657600080fd5b50610153600160a060020a0360043516602435610e6d565b60008060008060006003544211151561044657600080fd5b600454421061045457600080fd5b60055434101561046357600080fd5b60075460001061047257600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104c557600080fd5b505af11580156104d9573d6000803e3d6000fd5b505050506040513d60208110156104ef57600080fd5b5051600254600854604080517f7b413985000000000000000000000000000000000000000000000000000000008152600481019290925251600a9390930a9750600160a060020a0390911691637b413985916024808201926020929091908290030181600087803b15801561056357600080fd5b505af1158015610577573d6000803e3d6000fd5b505050506040513d602081101561058d57600080fd5b505193506105b1846105a5348863ffffffff610f3b16565b9063ffffffff610f6616565b9250600260009054906101000a9004600160a060020a0316600160a060020a03166355a373d66040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561060657600080fd5b505af115801561061a573d6000803e3d6000fd5b505050506040513d602081101561063057600080fd5b5051600254604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b15801561069a57600080fd5b505af11580156106ae573d6000803e3d6000fd5b505050506040513d60208110156106c457600080fd5b50516007549092508211156106d95760075491505b50600082821015610746576106fa856105a58486038763ffffffff610f3b16565b9050819250600060078190555085600160a060020a03166108fc829081150290604051600060405180830381858888f19350505050158015610740573d6000803e3d6000fd5b5061075d565b600754610759908463ffffffff610f7d16565b6007555b610795610770348363ffffffff610f7d16565b600160a060020a0388166000908152600960205260409020549063ffffffff610f8f16565b600160a060020a038716600090815260096020908152604080832093909355600a905220546107ca908463ffffffff610f8f16565b600160a060020a0387166000818152600a60209081526040918290209390935560085481519283523493830193909352818101869052606082019290925290517fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d9181900360800190a1505050505050565b60008060006004544211151561085157600080fd5b600160a060020a0384166000908152600b60205260408120541161087457600080fd5b60009250600091505b600c548210156108d057600c80548390811061089557fe5b906000526020600020015460065411156108c557600d8054839081106108b757fe5b906000526020600020015492505b60019091019061087d565b600083116108dd57600080fd5b600160a060020a0384166000908152600b602052604090205461090d906064906105a5908663ffffffff610f3b16565b600160a060020a038086166000818152600b6020908152604080832083905560025481517faad3ec9600000000000000000000000000000000000000000000000000000000815260048101959095526024850187905290519596509093169363aad3ec96936044808501949193918390030190829087803b15801561099157600080fd5b505af11580156109a5573d6000803e3d6000fd5b505050506040513d60208110156109bb57600080fd5b5050604051600160a060020a038516903480156108fc02916000818181858888f193505050501580156109f2573d6000803e3d6000fd5b5050505050565b600160a060020a03166000908152600a6020908152604080832054600b83528184205460099093529220549192909190565b60006020819052908152604090205460ff1681565b60085481565b6000600454421180610a585750600754155b905090565b6000600354421180610a585750506007541590565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b505050506040513d6020811015610aef57600080fd5b5051600160a060020a03163314610b0557600080fd5b600160a060020a03811660008181526009602052604080822054905181156108fc0292818181858888f19350505050158015610b45573d6000803e3d6000fd5b50600160a060020a03166000908152600960209081526040808320839055600a909152812055565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610bc057600080fd5b505af1158015610bd4573d6000803e3d6000fd5b505050506040513d6020811015610bea57600080fd5b5051600160a060020a03163314610c0057600080fd5b600555565b60045490565b600a6020526000908152604090205481565b60065481565b60055481565b60035490565b6000610a58600654600754610f8f90919063ffffffff16565b60096020526000908152604090205481565b60016020526000908152604090205481565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b505050506040513d6020811015610ce957600080fd5b5051600160a060020a03163314610cff57600080fd5b8115610d0b5760038290555b8015610d175760048190555b5050565b600254600854604080517f7b413985000000000000000000000000000000000000000000000000000000008152600481019290925251600092670de0b6b3a764000092610dd992600160a060020a0390921691637b4139859160248082019260209290919082900301818987803b158015610d9557600080fd5b505af1158015610da9573d6000803e3d6000fd5b505050506040513d6020811015610dbf57600080fd5b50516105a583670de0b6b3a764000063ffffffff610f3b16565b91505090565b600c805482908110610ded57fe5b600091825260209091200154905081565b6000610e0987610f9e565b1515610e1457600080fd5b610e22878787878787610faf565b979650505050505050565b600d805482908110610ded57fe5b60075490565b600b6020526000908152604090205481565b6000610e63338787878787610faf565b9695505050505050565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b505050506040513d6020811015610eea57600080fd5b5051600160a060020a03163314610f0057600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610f36573d6000803e3d6000fd5b505050565b6000828202831580610f575750828482811515610f5457fe5b04145b1515610f5f57fe5b9392505050565b6000808284811515610f7457fe5b04949350505050565b600082821115610f8957fe5b50900390565b600082820183811015610f5f57fe5b600160a060020a0381163314919050565b604080517f4569646f6f2069636f656e67696e6520617574686f72697a6174696f6e00000081526000601d8201819052600160a060020a0389166c01000000000000000000000000026031830152780100000000000000000000000000000000000000000000000067ffffffffffffffff8916026045830152604d82018790529151829182918291600291606d808301926020929190829003018186865af115801561105f573d6000803e3d6000fd5b5050506040513d602081101561107457600080fd5b5051604080516000808252602082810180855285905260ff8c1683850152606083018b9052608083018a9052925193965060019360a08084019493601f19830193908390039091019190865af11580156110d2573d6000803e3d6000fd5b505060408051601f190151600160a060020a03811660009081526020819052919091205490935060ff161515905061110957600080fd5b67ffffffffffffffff8916600090815260016020526040902054611133903463ffffffff610f8f16565b90508781111561114257600080fd5b67ffffffffffffffff89166000818152600160209081526040918290208490558151600160a060020a038e81168252918101939093528282018b90529051908416917f74e336db80b339721548db3209451cf01bd48e4a996e1bcea7f1a2abf8b06070919081900360600190a26111b88a6111c6565b9a9950505050505050505050565b6000803411156111d9576111d98261042e565b6111e2826111ea565b506001919050565b600160a060020a0381166000908152600a60205260408120541161120d57600080fd5b600160a060020a0381166000908152600a6020908152604080832054600b909252909120546112419163ffffffff610f8f16565b600160a060020a038083166000818152600b6020908152604080832095909555600254600a82528583205486517faad3ec96000000000000000000000000000000000000000000000000000000008152600481019590955260248501529451949093169363aad3ec96936044808501949193918390030190829087803b1580156112ca57600080fd5b505af11580156112de573d6000803e3d6000fd5b505050506040513d60208110156112f457600080fd5b5050600160a060020a0381166000908152600a60205260409020546006546113219163ffffffff610f8f16565b600655600160a060020a038082166000908152600a6020908152604080832083905560025481517f521eb273000000000000000000000000000000000000000000000000000000008152915194169363521eb27393600480840194938390030190829087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b505050506040513d60208110156113bd57600080fd5b5051600160a060020a03828116600090815260096020526040808220549051929093169280156108fc02929091818181858888f19350505050158015611407573d6000803e3d6000fd5b50600160a060020a03166000908152600960205260408120555600a165627a7a7230582072e8697bf510f099cc83493224c15de7a8d4cde5f6efc6173d9ef43f0b46cadd0029000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e340000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000002116545850052128000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b0b2a5f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d005200000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab86000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030bda62ce07a7af0000000000000000000000000000000000000000000000000617b3e790a414e7c000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000023

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e340000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000002116545850052128000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b0b2a5f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d005200000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab86000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030bda62ce07a7af0000000000000000000000000000000000000000000000000617b3e790a414e7c000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000023

-----Decoded View---------------
Arg [0] : _tokenSaleContract (address): 0xc1cF194C1449713Bf811a93F4E1A6211C1713E34
Arg [1] : _oneTokenInFiatWei (uint256): 300000000000000000
Arg [2] : _remainingTokens (uint256): 2500000000000000000000000
Arg [3] : _etherMinimum (uint256): 1000000000000000000
Arg [4] : _startTime (uint256): 0
Arg [5] : _endTime (uint256): 1527458399
Arg [6] : kycSigner (address[]): 0xDd5EcEFCaA0Cb5D75F7b72dC9D2CE446D6d00520,0x4E315e5De2abbf7b745d9628ee60E4355C0fab86
Arg [7] : _tokenThreshold (uint256[]): 0,230172000000000000000000,460343000000000000000000
Arg [8] : _bonusThreshold (uint256[]): 25,30,35

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e34
Arg [1] : 0000000000000000000000000000000000000000000000000429d069189e0000
Arg [2] : 0000000000000000000000000000000000000000000211654585005212800000
Arg [3] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000005b0b2a5f
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d00520
Arg [11] : 0000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab86
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000030bda62ce07a7af00000
Arg [15] : 00000000000000000000000000000000000000000000617b3e790a414e7c0000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [18] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000023


Swarm Source

bzzr://72e8697bf510f099cc83493224c15de7a8d4cde5f6efc6173d9ef43f0b46cadd

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.