ETH Price: $1,817.90 (+0.29%)
Gas: 32 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
Buy Tokens57588902018-06-09 12:16:541806 days 10 hrs ago1528546614IN
0x340DbA...D9b02Fdb
0 ETH0.004685250
Buy Tokens56979072018-05-29 16:21:551817 days 6 hrs ago1527610915IN
0x340DbA...D9b02Fdb
0 ETH0.0019664421
Buy Tokens56676992018-05-24 8:06:371822 days 15 hrs ago1527149197IN
0x340DbA...D9b02Fdb
0 ETH0.0038418641
Buy Tokens56579302018-05-22 14:20:541824 days 8 hrs ago1526998854IN
0x340DbA...D9b02Fdb
0 ETH0.0010300411
Transfer56577572018-05-22 13:38:201824 days 9 hrs ago1526996300IN
0x340DbA...D9b02Fdb
13.5 ETH0.0018437521
Buy Tokens56569622018-05-22 10:18:461824 days 12 hrs ago1526984326IN
0x340DbA...D9b02Fdb
0 ETH0.0013118514
Transfer56569592018-05-22 10:17:281824 days 12 hrs ago1526984248IN
0x340DbA...D9b02Fdb
0 ETH0.0004662821
Transfer56565442018-05-22 8:29:331824 days 14 hrs ago1526977773IN
0x340DbA...D9b02Fdb
1 ETH0.0035795841
Buy Tokens56564012018-05-22 7:53:391824 days 15 hrs ago1526975619IN
0x340DbA...D9b02Fdb
0 ETH0.0028072830
Buy Tokens56536192018-05-21 20:01:171825 days 3 hrs ago1526932877IN
0x340DbA...D9b02Fdb
0 ETH0.0009351210
Buy Tokens56531412018-05-21 18:00:271825 days 5 hrs ago1526925627IN
0x340DbA...D9b02Fdb
0 ETH0.0038366141
Transfer56529752018-05-21 17:15:351825 days 5 hrs ago1526922935IN
0x340DbA...D9b02Fdb
10 ETH0.0035997141
Transfer56525122018-05-21 15:20:451825 days 7 hrs ago1526916045IN
0x340DbA...D9b02Fdb
1.5 ETH0.000785769
Transfer56517302018-05-21 12:03:521825 days 11 hrs ago1526904232IN
0x340DbA...D9b02Fdb
1.5 ETH0.0012222914
Transfer56507732018-05-21 7:57:581825 days 15 hrs ago1526889478IN
0x340DbA...D9b02Fdb
1.02 ETH0.0026192130
Transfer56482952018-05-20 21:28:021826 days 1 hr ago1526851682IN
0x340DbA...D9b02Fdb
1 ETH0.000698458
Transfer56471662018-05-20 16:42:011826 days 6 hrs ago1526834521IN
0x340DbA...D9b02Fdb
1 ETH0.0018334421
Buy Tokens56471392018-05-20 16:35:161826 days 6 hrs ago1526834116IN
0x340DbA...D9b02Fdb
0 ETH0.001086410
Transfer56466182018-05-20 14:25:061826 days 8 hrs ago1526826306IN
0x340DbA...D9b02Fdb
1 ETH0.0043653550
Transfer56409222018-05-19 14:24:001827 days 8 hrs ago1526739840IN
0x340DbA...D9b02Fdb
1 ETH0.0008730710
0x6080604056357132018-05-18 16:08:321828 days 7 hrs ago1526659712IN
 Create: RCpro
0 ETH0.0266253714.225

Latest 9 internal transactions

Advanced mode:
Parent Txn Hash Block From To Value
57588902018-06-09 12:16:541806 days 10 hrs ago1528546614
0x340DbA...D9b02Fdb
1 ETH
56979072018-05-29 16:21:551817 days 6 hrs ago1527610915
0x340DbA...D9b02Fdb
13.5 ETH
56676992018-05-24 8:06:371822 days 15 hrs ago1527149197
0x340DbA...D9b02Fdb
1 ETH
56579302018-05-22 14:20:541824 days 8 hrs ago1526998854
0x340DbA...D9b02Fdb
1.5 ETH
56569622018-05-22 10:18:461824 days 12 hrs ago1526984326
0x340DbA...D9b02Fdb
1.5 ETH
56564012018-05-22 7:53:391824 days 15 hrs ago1526975619
0x340DbA...D9b02Fdb
1.02 ETH
56536192018-05-21 20:01:171825 days 3 hrs ago1526932877
0x340DbA...D9b02Fdb
1 ETH
56531412018-05-21 18:00:271825 days 5 hrs ago1526925627
0x340DbA...D9b02Fdb
10 ETH
56471392018-05-20 16:35:161826 days 6 hrs ago1526834116
0x340DbA...D9b02Fdb
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RCpro

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":"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"}]

60806040523480156200001157600080fd5b50604051620019373803806200193783398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01519799988901989687019795969495939492939183019290810191018260005b8151811015620000d157600160008084848151811015156200009657fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560010162000078565b5050600160a060020a038a161515620000e957600080fd5b886000815181101515620000f957fe5b6020908102909101015115156200010f57600080fd5b87518951146200011e57600080fd5b8615156200012b57600080fd5b815115156200013957600080fd5b80518251146200014857600080fd5b80516200015d90600e906020840190620003cc565b5081516200017390600d906020850190620003cc565b5060028054600160a060020a031916600160a060020a038c81169190911791829055604080517f66b52b93000000000000000000000000000000000000000000000000000000008152905192909116916366b52b939160048082019260009290919082900301818387803b158015620001eb57600080fd5b505af115801562000200573d6000803e3d6000fd5b50506000600655505060078790558851620002239060089060208c0190620003cc565b508751620002399060099060208b0190620003cc565b50600586905562000254858564010000000062000264810204565b505050505050505050506200043c565b8115156200031057600260009054906101000a9004600160a060020a0316600160a060020a03166378e979256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620002d957600080fd5b505af1158015620002ee573d6000803e3d6000fd5b505050506040513d60208110156200030557600080fd5b505160035562000316565b60038290555b801515620003c257600260009054906101000a9004600160a060020a0316600160a060020a0316633197cbb66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200038b57600080fd5b505af1158015620003a0573d6000803e3d6000fd5b505050506040513d6020811015620003b757600080fd5b5051600455620003c8565b60048190555b5050565b8280548282559060005260206000209081019282156200040a579160200282015b828111156200040a578251825591602001919060010190620003ed565b50620004189291506200041c565b5090565b6200043991905b8082111562000418576000815560010162000423565b90565b6114eb806200044c6000396000f30060806040526004361061012f5763ffffffff60e060020a6000350416630103c92b8114610160578063045351721461019f5780630570d568146101c957806312fa6feb146101fe5780631f2698ab146102135780631f378b8a146102285780632a513dd9146102495780633197cbb61461026157806334323d32146102765780635ed9ebfc14610297578063675cef14146102ac57806378e97925146102c15780637e1c0c09146102d6578063924669b2146102eb5780639a359d8e1461030c578063a0355eca1461032e578063a035b1fe14610349578063a6f8fd131461035e578063ae45783514610376578063bb9dea04146103a6578063bf583903146103be578063ce1ff67e146103d3578063dadddf94146103f4578063dee4b2461461040c578063f3fef3a314610430575b600354421161013d57600080fd5b6004544210156101555761015033610454565b61015e565b61015e336108c4565b005b34801561016c57600080fd5b50610181600160a060020a0360043516610a81565b60408051938452602084019290925282820152519081900360600190f35b3480156101ab57600080fd5b506101b7600435610ab3565b60408051918252519081900360200190f35b3480156101d557600080fd5b506101ea600160a060020a0360043516610ad2565b604080519115158252519081900360200190f35b34801561020a57600080fd5b506101ea610ae7565b34801561021f57600080fd5b506101ea610afe565b34801561023457600080fd5b5061015e600160a060020a0360043516610b13565b34801561025557600080fd5b5061015e600435610c0e565b34801561026d57600080fd5b506101b7610ca6565b34801561028257600080fd5b506101b7600160a060020a0360043516610cac565b3480156102a357600080fd5b506101b7610cbe565b3480156102b857600080fd5b506101b7610cc4565b3480156102cd57600080fd5b506101b7610cca565b3480156102e257600080fd5b506101b7610cd0565b3480156102f757600080fd5b506101b7600160a060020a0360043516610ce9565b34801561031857600080fd5b506101b767ffffffffffffffff60043516610cfb565b34801561033a57600080fd5b5061015e600435602435610d0d565b34801561035557600080fd5b506101b7610dbc565b34801561036a57600080fd5b506101b7600435610e7f565b6101ea600160a060020a036004351667ffffffffffffffff6024351660443560ff6064351660843560a435610e8d565b3480156103b257600080fd5b506101b7600435610ebc565b3480156103ca57600080fd5b506101b7610eca565b3480156103df57600080fd5b506101b7600160a060020a0360043516610ed0565b34801561040057600080fd5b506101b7600435610ee2565b6101ea67ffffffffffffffff6004351660243560ff60443516606435608435610ef0565b34801561043c57600080fd5b5061015e600160a060020a0360043516602435610f0a565b60008060008060008060006003544211151561046f57600080fd5b600454421061047d57600080fd5b60055434101561048c57600080fd5b60075460001061049b57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104ee57600080fd5b505af1158015610502573d6000803e3d6000fd5b505050506040513d602081101561051857600080fd5b5051600a0a9650600095508594505b60095485101561057957600980548690811061053f57fe5b90600052602060002001543410151561056e57600880548690811061056057fe5b906000526020600020015495505b600190940193610527565b6000861161058657600080fd5b600254604080517f7b413985000000000000000000000000000000000000000000000000000000008152600481018990529051600160a060020a0390921691637b413985916024808201926020929091908290030181600087803b1580156105ed57600080fd5b505af1158015610601573d6000803e3d6000fd5b505050506040513d602081101561061757600080fd5b5051935061063b8461062f348a63ffffffff610fd816565b9063ffffffff61100316565b9250600260009054906101000a9004600160a060020a0316600160a060020a03166355a373d66040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561069057600080fd5b505af11580156106a4573d6000803e3d6000fd5b505050506040513d60208110156106ba57600080fd5b5051600254604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b50516007549092508211156107635760075491505b506000828210156107d0576107848761062f8486038763ffffffff610fd816565b9050819250600060078190555087600160a060020a03166108fc829081150290604051600060405180830381858888f193505050501580156107ca573d6000803e3d6000fd5b506107e7565b6007546107e3908463ffffffff61101a16565b6007555b61081f6107fa348363ffffffff61101a16565b600160a060020a038a166000908152600a60205260409020549063ffffffff61102c16565b600160a060020a0389166000908152600a6020908152604080832093909355600b90522054610854908463ffffffff61102c16565b600160a060020a0389166000818152600b602090815260409182902093909355805191825234928201929092528082018590526060810188905290517fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d9181900360800190a15050505050505050565b6000806000600454421115156108d957600080fd5b600160a060020a0384166000908152600c6020526040812054116108fc57600080fd5b60009250600091505b600d5482101561095857600d80548390811061091d57fe5b9060005260206000200154600654111561094d57600e80548390811061093f57fe5b906000526020600020015492505b600190910190610905565b6000831161096557600080fd5b600160a060020a0384166000908152600c60205260409020546109959060649061062f908663ffffffff610fd816565b600160a060020a038086166000818152600c6020908152604080832083905560025481517faad3ec9600000000000000000000000000000000000000000000000000000000815260048101959095526024850187905290519596509093169363aad3ec96936044808501949193918390030190829087803b158015610a1957600080fd5b505af1158015610a2d573d6000803e3d6000fd5b505050506040513d6020811015610a4357600080fd5b5050604051600160a060020a038516903480156108fc02916000818181858888f19350505050158015610a7a573d6000803e3d6000fd5b5050505050565b600160a060020a03166000908152600b6020908152604080832054600c835281842054600a9093529220549192909190565b6009805482908110610ac157fe5b600091825260209091200154905081565b60006020819052908152604090205460ff1681565b6000600454421180610af95750600754155b905090565b6000600354421180610af95750506007541590565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b6657600080fd5b505af1158015610b7a573d6000803e3d6000fd5b505050506040513d6020811015610b9057600080fd5b5051600160a060020a03163314610ba657600080fd5b600160a060020a0381166000818152600a602052604080822054905181156108fc0292818181858888f19350505050158015610be6573d6000803e3d6000fd5b50600160a060020a03166000908152600a60209081526040808320839055600b909152812055565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b505050506040513d6020811015610c8b57600080fd5b5051600160a060020a03163314610ca157600080fd5b600555565b60045490565b600b6020526000908152604090205481565b60065481565b60055481565b60035490565b6000610af960065460075461102c90919063ffffffff16565b600a6020526000908152604090205481565b60016020526000908152604090205481565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d6057600080fd5b505af1158015610d74573d6000803e3d6000fd5b505050506040513d6020811015610d8a57600080fd5b5051600160a060020a03163314610da057600080fd5b8115610dac5760038290555b8015610db85760048190555b5050565b60025460088054600092670de0b6b3a764000092610e7992600160a060020a0390921691637b413985919086908110610df157fe5b90600052602060002001546040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b505050506040513d6020811015610e5f57600080fd5b505161062f83670de0b6b3a764000063ffffffff610fd816565b91505090565b600d805482908110610ac157fe5b6000610e988761103b565b1515610ea357600080fd5b610eb187878787878761104c565b979650505050505050565b600e805482908110610ac157fe5b60075490565b600c6020526000908152604090205481565b6008805482908110610ac157fe5b6000610f0033878787878761104c565b9695505050505050565b600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d6020811015610f8757600080fd5b5051600160a060020a03163314610f9d57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610fd3573d6000803e3d6000fd5b505050565b6000828202831580610ff45750828482811515610ff157fe5b04145b1515610ffc57fe5b9392505050565b600080828481151561101157fe5b04949350505050565b60008282111561102657fe5b50900390565b600082820183811015610ffc57fe5b600160a060020a0381163314919050565b604080517f4569646f6f2069636f656e67696e6520617574686f72697a6174696f6e00000081526000601d8201819052600160a060020a0389166c01000000000000000000000000026031830152780100000000000000000000000000000000000000000000000067ffffffffffffffff8916026045830152604d82018790529151829182918291600291606d808301926020929190829003018186865af11580156110fc573d6000803e3d6000fd5b5050506040513d602081101561111157600080fd5b5051604080516000808252602082810180855285905260ff8c1683850152606083018b9052608083018a9052925193965060019360a08084019493601f19830193908390039091019190865af115801561116f573d6000803e3d6000fd5b505060408051601f190151600160a060020a03811660009081526020819052919091205490935060ff16151590506111a657600080fd5b67ffffffffffffffff89166000908152600160205260409020546111d0903463ffffffff61102c16565b9050878111156111df57600080fd5b67ffffffffffffffff89166000818152600160209081526040918290208490558151600160a060020a038e81168252918101939093528282018b90529051908416917f74e336db80b339721548db3209451cf01bd48e4a996e1bcea7f1a2abf8b06070919081900360600190a26112558a611263565b9a9950505050505050505050565b6000803411156112765761127682610454565b61127f82611287565b506001919050565b600160a060020a0381166000908152600b6020526040812054116112aa57600080fd5b600160a060020a0381166000908152600b6020908152604080832054600c909252909120546112de9163ffffffff61102c16565b600160a060020a038083166000818152600c6020908152604080832095909555600254600b82528583205486517faad3ec96000000000000000000000000000000000000000000000000000000008152600481019590955260248501529451949093169363aad3ec96936044808501949193918390030190829087803b15801561136757600080fd5b505af115801561137b573d6000803e3d6000fd5b505050506040513d602081101561139157600080fd5b5050600160a060020a0381166000908152600b60205260409020546006546113be9163ffffffff61102c16565b600655600160a060020a038082166000908152600b6020908152604080832083905560025481517f521eb273000000000000000000000000000000000000000000000000000000008152915194169363521eb27393600480840194938390030190829087803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b505050506040513d602081101561145a57600080fd5b5051600160a060020a038281166000908152600a6020526040808220549051929093169280156108fc02929091818181858888f193505050501580156114a4573d6000803e3d6000fd5b50600160a060020a03166000908152600a60205260408120555600a165627a7a7230582026390bbe55fee0699afa268c1cfb0fd60c9d82286739cacb49bd47a819764da00029000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e34000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000002116545850052128000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000030d98d59a960000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d005200000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab860000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e34000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000002116545850052128000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000030d98d59a960000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d005200000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab860000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenSaleContract (address): 0xc1cF194C1449713Bf811a93F4E1A6211C1713E34
Arg [1] : _oneTokenInFiatWei (uint256[]): 250000000000000000,220000000000000000
Arg [2] : _sendThreshold (uint256[]): 0,10000000000000000000
Arg [3] : _remainingTokens (uint256): 2500000000000000000000000
Arg [4] : _etherMinimum (uint256): 1000000000000000000
Arg [5] : _startTime (uint256): 0
Arg [6] : _endTime (uint256): 0
Arg [7] : kycSigner (address[]): 0xDd5EcEFCaA0Cb5D75F7b72dC9D2CE446D6d00520,0x4E315e5De2abbf7b745d9628ee60E4355C0fab86
Arg [8] : _tokenThreshold (uint256[]): 0
Arg [9] : _bonusThreshold (uint256[]): 0

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 000000000000000000000000c1cf194c1449713bf811a93f4e1a6211c1713e34
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000211654585005212800000
Arg [4] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [9] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 00000000000000000000000000000000000000000000000003782dace9d90000
Arg [12] : 000000000000000000000000000000000000000000000000030d98d59a960000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [17] : 000000000000000000000000dd5ecefcaa0cb5d75f7b72dc9d2ce446d6d00520
Arg [18] : 0000000000000000000000004e315e5de2abbf7b745d9628ee60e4355c0fab86
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://26390bbe55fee0699afa268c1cfb0fd60c9d82286739cacb49bd47a819764da0

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.