ETH Price: $2,353.21 (-5.19%)

Contract

0xd0B6cAF67E3cc44Ea888b12AcFC807Fd258ffb8D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Whitelist71086532019-01-22 11:49:162227 days ago1548157756IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000169337
Update Whitelist71086402019-01-22 11:44:152227 days ago1548157455IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000169337
Transfer65582022018-10-21 19:44:342320 days ago1540151074IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000175038
Set Ops Address65551802018-10-21 7:48:142320 days ago1540108094IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000076795.2
Transfer65423172018-10-19 5:18:222323 days ago1539926302IN
0xd0B6cAF6...d258ffb8D
887.88982867 ETH0.0024487241
Transfer65418362018-10-19 3:29:092323 days ago1539919749IN
0xd0B6cAF6...d258ffb8D
62 ETH0.0027120241
Transfer65417582018-10-19 3:09:022323 days ago1539918542IN
0xd0B6cAF6...d258ffb8D
0.5470756 ETH0.0033073550
Transfer65416862018-10-19 2:51:082323 days ago1539917468IN
0xd0B6cAF6...d258ffb8D
0.21 ETH0.001189150
Transfer65416812018-10-19 2:50:022323 days ago1539917402IN
0xd0B6cAF6...d258ffb8D
0.21 ETH0.001189150
Transfer65416312018-10-19 2:35:222323 days ago1539916522IN
0xd0B6cAF6...d258ffb8D
0.21 ETH0.001189150
Transfer65414842018-10-19 2:03:242323 days ago1539914604IN
0xd0B6cAF6...d258ffb8D
1.1 ETH0.0032458840
Transfer65414792018-10-19 2:02:252323 days ago1539914545IN
0xd0B6cAF6...d258ffb8D
0.56841668 ETH0.0040573550
Update Whitelist65414042018-10-19 1:43:452323 days ago1539913425IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000235215
Update Whitelist65414022018-10-19 1:43:102323 days ago1539913390IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000235215
Transfer65412072018-10-19 0:55:462323 days ago1539910546IN
0xd0B6cAF6...d258ffb8D
11.2 ETH0.0033270241
Transfer65407012018-10-18 22:57:392323 days ago1539903459IN
0xd0B6cAF6...d258ffb8D
2.81 ETH0.0032458840
Transfer65404612018-10-18 21:58:332323 days ago1539899913IN
0xd0B6cAF6...d258ffb8D
349.9 ETH0.0027120241
Transfer65401582018-10-18 20:48:432323 days ago1539895723IN
0xd0B6cAF6...d258ffb8D
289.15 ETH0.0027120241
Transfer65400622018-10-18 20:24:402323 days ago1539894280IN
0xd0B6cAF6...d258ffb8D
0.5 ETH0.0019844130
Transfer65399462018-10-18 19:58:212323 days ago1539892701IN
0xd0B6cAF6...d258ffb8D
0.49 ETH0.00039919
Transfer65399382018-10-18 19:56:012323 days ago1539892561IN
0xd0B6cAF6...d258ffb8D
19.54 ETH0.0033270241
Update Whitelist65398692018-10-18 19:39:262323 days ago1539891566IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000235215
Update Whitelist65398652018-10-18 19:38:352323 days ago1539891515IN
0xd0B6cAF6...d258ffb8D
0 ETH0.000235215
Transfer65397662018-10-18 19:10:212323 days ago1539889821IN
0xd0B6cAF6...d258ffb8D
1.3 ETH0.0010939550
Transfer65395432018-10-18 18:18:092323 days ago1539886689IN
0xd0B6cAF6...d258ffb8D
0.5 ETH0.0010939550
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
65423172018-10-19 5:18:222323 days ago1539926302
0xd0B6cAF6...d258ffb8D
475.34941512 ETH
65423172018-10-19 5:18:222323 days ago1539926302
0xd0B6cAF6...d258ffb8D
412.54041354 ETH
65418362018-10-19 3:29:092323 days ago1539919749
0xd0B6cAF6...d258ffb8D
62 ETH
65417582018-10-19 3:09:022323 days ago1539918542
0xd0B6cAF6...d258ffb8D
0.5470756 ETH
65414842018-10-19 2:03:242323 days ago1539914604
0xd0B6cAF6...d258ffb8D
1.1 ETH
65414792018-10-19 2:02:252323 days ago1539914545
0xd0B6cAF6...d258ffb8D
0.56841668 ETH
65412072018-10-19 0:55:462323 days ago1539910546
0xd0B6cAF6...d258ffb8D
11.2 ETH
65407012018-10-18 22:57:392323 days ago1539903459
0xd0B6cAF6...d258ffb8D
2.81 ETH
65404612018-10-18 21:58:332323 days ago1539899913
0xd0B6cAF6...d258ffb8D
349.9 ETH
65401582018-10-18 20:48:432323 days ago1539895723
0xd0B6cAF6...d258ffb8D
289.15 ETH
65400622018-10-18 20:24:402323 days ago1539894280
0xd0B6cAF6...d258ffb8D
0.5 ETH
65399382018-10-18 19:56:012323 days ago1539892561
0xd0B6cAF6...d258ffb8D
19.54 ETH
65394462018-10-18 17:53:482323 days ago1539885228
0xd0B6cAF6...d258ffb8D
26 ETH
65393372018-10-18 17:30:362323 days ago1539883836
0xd0B6cAF6...d258ffb8D
20 ETH
65392442018-10-18 17:10:572323 days ago1539882657
0xd0B6cAF6...d258ffb8D
0.651 ETH
65391442018-10-18 16:47:312323 days ago1539881251
0xd0B6cAF6...d258ffb8D
286.31 ETH
65390932018-10-18 16:33:042323 days ago1539880384
0xd0B6cAF6...d258ffb8D
207.7 ETH
65389132018-10-18 15:53:322323 days ago1539878012
0xd0B6cAF6...d258ffb8D
1,098 ETH
65388732018-10-18 15:45:372323 days ago1539877537
0xd0B6cAF6...d258ffb8D
1 ETH
65388182018-10-18 15:33:162323 days ago1539876796
0xd0B6cAF6...d258ffb8D
2.91589539 ETH
65386192018-10-18 14:41:132323 days ago1539873673
0xd0B6cAF6...d258ffb8D
10 ETH
65385022018-10-18 14:11:592323 days ago1539871919
0xd0B6cAF6...d258ffb8D
10 ETH
65377682018-10-18 11:25:062323 days ago1539861906
0xd0B6cAF6...d258ffb8D
1.3 ETH
65377262018-10-18 11:16:382323 days ago1539861398
0xd0B6cAF6...d258ffb8D
1.9 ETH
65374582018-10-18 10:13:032323 days ago1539857583
0xd0B6cAF6...d258ffb8D
30 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CaspianTokenSale

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-10-03
*/

pragma solidity ^0.4.23;

// ----------------------------------------------------------------------------
// ERC20Interface - Standard ERC20 Interface Definition
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
// Based on the final ERC20 specification at:
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {

   event Transfer(address indexed _from, address indexed _to, uint256 _value);
   event Approval(address indexed _owner, address indexed _spender, uint256 _value);

   function name() public view returns (string);
   function symbol() public view returns (string);
   function decimals() public view returns (uint8);
   function totalSupply() public view returns (uint256);

   function balanceOf(address _owner) public view returns (uint256 balance);
   function allowance(address _owner, address _spender) public view returns (uint256 remaining);

   function transfer(address _to, uint256 _value) public returns (bool success);
   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
   function approve(address _spender, uint256 _value) public returns (bool success);
}

// ----------------------------------------------------------------------------
// Math - General Math Utility Library
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


library Math {

   function add(uint256 a, uint256 b) internal pure returns (uint256) {
      uint256 r = a + b;

      require(r >= a);

      return r;
   }


   function sub(uint256 a, uint256 b) internal pure returns (uint256) {
      require(a >= b);

      return a - b;
   }


   function mul(uint256 a, uint256 b) internal pure returns (uint256) {
      if (a == 0) {
         return 0;
      }

      uint256 r = a * b;

      require(r / a == b);

      return r;
   }


   function div(uint256 a, uint256 b) internal pure returns (uint256) {
      return a / b;
   }
}

// ----------------------------------------------------------------------------
// Owned - Ownership model with 2 phase transfers
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


// Implements a simple ownership model with 2-phase transfer.
contract Owned {

   address public owner;
   address public proposedOwner;

   event OwnershipTransferInitiated(address indexed _proposedOwner);
   event OwnershipTransferCompleted(address indexed _newOwner);


   constructor() public
   {
      owner = msg.sender;
   }


   modifier onlyOwner() {
      require(isOwner(msg.sender) == true);
      _;
   }


   function isOwner(address _address) public view returns (bool) {
      return (_address == owner);
   }


   function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) {
      require(_proposedOwner != address(0));
      require(_proposedOwner != address(this));
      require(_proposedOwner != owner);

      proposedOwner = _proposedOwner;

      emit OwnershipTransferInitiated(proposedOwner);

      return true;
   }


   function completeOwnershipTransfer() public returns (bool) {
      require(msg.sender == proposedOwner);

      owner = msg.sender;
      proposedOwner = address(0);

      emit OwnershipTransferCompleted(owner);

      return true;
   }
}

// ----------------------------------------------------------------------------
// Finalizable - Basic implementation of the finalization pattern
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


contract Finalizable is Owned() {

   bool public finalized;

   event Finalized();


   constructor() public
   {
      finalized = false;
   }


   function finalize() public onlyOwner returns (bool) {
      require(!finalized);

      finalized = true;

      emit Finalized();

      return true;
   }
}

// ----------------------------------------------------------------------------
// OpsManaged - Implements an Owner and Ops Permission Model
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------



//
// Implements a security model with owner and ops.
//
contract OpsManaged is Owned() {

   address public opsAddress;

   event OpsAddressUpdated(address indexed _newAddress);


   constructor() public
   {
   }


   modifier onlyOwnerOrOps() {
      require(isOwnerOrOps(msg.sender));
      _;
   }


   function isOps(address _address) public view returns (bool) {
      return (opsAddress != address(0) && _address == opsAddress);
   }


   function isOwnerOrOps(address _address) public view returns (bool) {
      return (isOwner(_address) || isOps(_address));
   }


   function setOpsAddress(address _newOpsAddress) public onlyOwner returns (bool) {
      require(_newOpsAddress != owner);
      require(_newOpsAddress != address(this));

      opsAddress = _newOpsAddress;

      emit OpsAddressUpdated(opsAddress);

      return true;
   }
}

// ----------------------------------------------------------------------------
// ERC20Token - Standard ERC20 Implementation
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


contract ERC20Token is ERC20Interface {

   using Math for uint256;

   string  private tokenName;
   string  private tokenSymbol;
   uint8   private tokenDecimals;
   uint256 internal tokenTotalSupply;

   mapping(address => uint256) internal balances;
   mapping(address => mapping (address => uint256)) allowed;


   constructor(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply, address _initialTokenHolder) public {
      tokenName = _name;
      tokenSymbol = _symbol;
      tokenDecimals = _decimals;
      tokenTotalSupply = _totalSupply;

      // The initial balance of tokens is assigned to the given token holder address.
      balances[_initialTokenHolder] = _totalSupply;

      // Per EIP20, the constructor should fire a Transfer event if tokens are assigned to an account.
      emit Transfer(0x0, _initialTokenHolder, _totalSupply);
   }


   function name() public view returns (string) {
      return tokenName;
   }


   function symbol() public view returns (string) {
      return tokenSymbol;
   }


   function decimals() public view returns (uint8) {
      return tokenDecimals;
   }


   function totalSupply() public view returns (uint256) {
      return tokenTotalSupply;
   }


   function balanceOf(address _owner) public view returns (uint256 balance) {
      return balances[_owner];
   }


   function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
      return allowed[_owner][_spender];
   }


   function transfer(address _to, uint256 _value) public returns (bool success) {
      balances[msg.sender] = balances[msg.sender].sub(_value);
      balances[_to] = balances[_to].add(_value);

      emit Transfer(msg.sender, _to, _value);

      return true;
   }


   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
      balances[_from] = balances[_from].sub(_value);
      allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
      balances[_to] = balances[_to].add(_value);

      emit Transfer(_from, _to, _value);

      return true;
   }


   function approve(address _spender, uint256 _value) public returns (bool success) {
      allowed[msg.sender][_spender] = _value;

      emit Approval(msg.sender, _spender, _value);

      return true;
   }
}

// ----------------------------------------------------------------------------
// FinalizableToken - Extension to ERC20Token with ops and finalization
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


//
// ERC20 token with the following additions:
//    1. Owner/Ops Ownership
//    2. Finalization
//
contract FinalizableToken is ERC20Token, OpsManaged, Finalizable {

   using Math for uint256;


   // The constructor will assign the initial token supply to the owner (msg.sender).
   constructor(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply) public
      ERC20Token(_name, _symbol, _decimals, _totalSupply, msg.sender)
      OpsManaged()
      Finalizable()
   {
   }


   function transfer(address _to, uint256 _value) public returns (bool success) {
      validateTransfer(msg.sender, _to);

      return super.transfer(_to, _value);
   }


   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
      validateTransfer(msg.sender, _to);

      return super.transferFrom(_from, _to, _value);
   }


   function validateTransfer(address _sender, address _to) private view {
      // Once the token is finalized, everybody can transfer tokens.
      if (finalized) {
         return;
      }

      if (isOwner(_to)) {
         return;
      }

      // Before the token is finalized, only owner and ops are allowed to initiate transfers.
      // This allows them to move tokens while the sale is still ongoing for example.
      require(isOwnerOrOps(_sender));
   }
}



// ----------------------------------------------------------------------------
// FlexibleTokenSale - Token Sale Contract
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies Limited.
// https://www.enuma.io/
// ----------------------------------------------------------------------------


contract FlexibleTokenSale is Finalizable, OpsManaged {

   using Math for uint256;

   //
   // Lifecycle
   //
   uint256 public startTime;
   uint256 public endTime;
   bool public suspended;

   //
   // Pricing
   //
   uint256 public tokensPerKEther;
   uint256 public bonus;
   uint256 public maxTokensPerAccount;
   uint256 public contributionMin;
   uint256 public tokenConversionFactor;

   //
   // Wallets
   //
   address public walletAddress;

   //
   // Token
   //
   FinalizableToken public token;

   //
   // Counters
   //
   uint256 public totalTokensSold;
   uint256 public totalEtherCollected;


   //
   // Events
   //
   event Initialized();
   event TokensPerKEtherUpdated(uint256 _newValue);
   event MaxTokensPerAccountUpdated(uint256 _newMax);
   event BonusUpdated(uint256 _newValue);
   event SaleWindowUpdated(uint256 _startTime, uint256 _endTime);
   event WalletAddressUpdated(address _newAddress);
   event SaleSuspended();
   event SaleResumed();
   event TokensPurchased(address _beneficiary, uint256 _cost, uint256 _tokens);
   event TokensReclaimed(uint256 _amount);


   constructor(uint256 _startTime, uint256 _endTime, address _walletAddress) public
      OpsManaged()
   {
      require(_endTime > _startTime);

      require(_walletAddress != address(0));
      require(_walletAddress != address(this));

      walletAddress = _walletAddress;

      finalized = false;
      suspended = false;

      startTime = _startTime;
      endTime   = _endTime;

      // Use some defaults config values. Classes deriving from FlexibleTokenSale
      // should set their own defaults
      tokensPerKEther     = 100000;
      bonus               = 0;
      maxTokensPerAccount = 0;
      contributionMin     = 0.1 ether;

      totalTokensSold     = 0;
      totalEtherCollected = 0;
   }


   function currentTime() public constant returns (uint256) {
      return now;
   }


   // Initialize should be called by the owner as part of the deployment + setup phase.
   // It will associate the sale contract with the token contract and perform basic checks.
   function initialize(FinalizableToken _token) external onlyOwner returns(bool) {
      require(address(token) == address(0));
      require(address(_token) != address(0));
      require(address(_token) != address(this));
      require(address(_token) != address(walletAddress));
      require(isOwnerOrOps(address(_token)) == false);

      token = _token;

      // This factor is used when converting cost <-> tokens.
      // 18 is because of the ETH -> Wei conversion.
      // 3 because prices are in K ETH instead of just ETH.
      // 4 because bonuses are expressed as 0 - 10000 for 0.00% - 100.00% (with 2 decimals).
      tokenConversionFactor = 10**(uint256(18).sub(_token.decimals()).add(3).add(4));
      require(tokenConversionFactor > 0);

      emit Initialized();

      return true;
   }


   //
   // Owner Configuation
   //

   // Allows the owner to change the wallet address which is used for collecting
   // ether received during the token sale.
   function setWalletAddress(address _walletAddress) external onlyOwner returns(bool) {
      require(_walletAddress != address(0));
      require(_walletAddress != address(this));
      require(_walletAddress != address(token));
      require(isOwnerOrOps(_walletAddress) == false);

      walletAddress = _walletAddress;

      emit WalletAddressUpdated(_walletAddress);

      return true;
   }


   // Allows the owner to set an optional limit on the amount of tokens that can be purchased
   // by a contributor. It can also be set to 0 to remove limit.
   function setMaxTokensPerAccount(uint256 _maxTokens) external onlyOwner returns(bool) {

      maxTokensPerAccount = _maxTokens;

      emit MaxTokensPerAccountUpdated(_maxTokens);

      return true;
   }


   // Allows the owner to specify the conversion rate for ETH -> tokens.
   // For example, passing 1,000,000 would mean that 1 ETH would purchase 1000 tokens.
   function setTokensPerKEther(uint256 _tokensPerKEther) external onlyOwner returns(bool) {
      require(_tokensPerKEther > 0);

      tokensPerKEther = _tokensPerKEther;

      emit TokensPerKEtherUpdated(_tokensPerKEther);

      return true;
   }


   // Allows the owner to set a bonus to apply to all purchases.
   // For example, setting it to 2000 means that instead of receiving 200 tokens,
   // for a given price, contributors would receive 240 tokens (20.00% bonus).
   function setBonus(uint256 _bonus) external onlyOwner returns(bool) {
      require(_bonus <= 10000);

      bonus = _bonus;

      emit BonusUpdated(_bonus);

      return true;
   }


   // Allows the owner to set a sale window which will allow the sale (aka buyTokens) to
   // receive contributions between _startTime and _endTime. Once _endTime is reached,
   // the sale contract will automatically stop accepting incoming contributions.
   function setSaleWindow(uint256 _startTime, uint256 _endTime) external onlyOwner returns(bool) {
      require(_startTime > 0);
      require(_endTime > _startTime);

      startTime = _startTime;
      endTime   = _endTime;

      emit SaleWindowUpdated(_startTime, _endTime);

      return true;
   }


   // Allows the owner to suspend the sale until it is manually resumed at a later time.
   function suspend() external onlyOwner returns(bool) {
      if (suspended == true) {
          return false;
      }

      suspended = true;

      emit SaleSuspended();

      return true;
   }


   // Allows the owner to resume the sale.
   function resume() external onlyOwner returns(bool) {
      if (suspended == false) {
          return false;
      }

      suspended = false;

      emit SaleResumed();

      return true;
   }


   //
   // Contributions
   //

   // Default payable function which can be used to purchase tokens.
   function () payable public {
      buyTokens(msg.sender);
   }


   // Allows the caller to purchase tokens for a specific beneficiary (proxy purchase).
   function buyTokens(address _beneficiary) public payable returns (uint256) {
      return buyTokensInternal(_beneficiary, bonus);
   }


   function buyTokensInternal(address _beneficiary, uint256 _bonus) internal returns (uint256) {
      require(!finalized);
      require(!suspended);
      require(currentTime() >= startTime);
      require(currentTime() <= endTime);
      require(msg.value >= contributionMin);
      require(_beneficiary != address(0));
      require(_beneficiary != address(this));
      require(_beneficiary != address(token));

      // We don't want to allow the wallet collecting ETH to
      // directly be used to purchase tokens.
      require(msg.sender != address(walletAddress));

      // Check how many tokens are still available for sale.
      uint256 saleBalance = token.balanceOf(address(this));
      require(saleBalance > 0);

      // Calculate how many tokens the contributor could purchase based on ETH received.
      uint256 tokens = msg.value.mul(tokensPerKEther).mul(_bonus.add(10000)).div(tokenConversionFactor);
      require(tokens > 0);

      uint256 cost = msg.value;
      uint256 refund = 0;

      // Calculate what is the maximum amount of tokens that the contributor
      // should be allowed to purchase
      uint256 maxTokens = saleBalance;

      if (maxTokensPerAccount > 0) {
         // There is a maximum amount of tokens per account in place.
         // Check if the user already hit that limit.
         uint256 userBalance = getUserTokenBalance(_beneficiary);
         require(userBalance < maxTokensPerAccount);

         uint256 quotaBalance = maxTokensPerAccount.sub(userBalance);

         if (quotaBalance < saleBalance) {
            maxTokens = quotaBalance;
         }
      }

      require(maxTokens > 0);

      if (tokens > maxTokens) {
         // The contributor sent more ETH than allowed to purchase.
         // Limit the amount of tokens that they can purchase in this transaction.
         tokens = maxTokens;

         // Calculate the actual cost for that new amount of tokens.
         cost = tokens.mul(tokenConversionFactor).div(tokensPerKEther.mul(_bonus.add(10000)));

         if (msg.value > cost) {
            // If the contributor sent more ETH than needed to buy the tokens,
            // the balance should be refunded.
            refund = msg.value.sub(cost);
         }
      }

      // This is the actual amount of ETH that can be sent to the wallet.
      uint256 contribution = msg.value.sub(refund);
      walletAddress.transfer(contribution);

      // Update our stats counters.
      totalTokensSold     = totalTokensSold.add(tokens);
      totalEtherCollected = totalEtherCollected.add(contribution);

      // Transfer tokens to the beneficiary.
      require(token.transfer(_beneficiary, tokens));

      // Issue a refund for the excess ETH, as needed.
      if (refund > 0) {
         msg.sender.transfer(refund);
      }

      emit TokensPurchased(_beneficiary, cost, tokens);

      return tokens;
   }


   // Returns the number of tokens that the user has purchased. Will be checked against the
   // maximum allowed. Can be overriden in a sub class to change the calculations.
   function getUserTokenBalance(address _beneficiary) internal view returns (uint256) {
      return token.balanceOf(_beneficiary);
   }


   // Allows the owner to take back the tokens that are assigned to the sale contract.
   function reclaimTokens() external onlyOwner returns (bool) {
      uint256 tokens = token.balanceOf(address(this));

      if (tokens == 0) {
         return false;
      }

      address tokenOwner = token.owner();
      require(tokenOwner != address(0));

      require(token.transfer(tokenOwner, tokens));

      emit TokensReclaimed(tokens);

      return true;
   }
}


// ----------------------------------------------------------------------------
// CaspianTokenConfig - Token Contract Configuration
//
// Copyright (c) 2018 Caspian, Limited (TM).
// http://www.caspian.tech/
// ----------------------------------------------------------------------------


contract CaspianTokenConfig {

    string  public constant TOKEN_SYMBOL      = "CSP";
    string  public constant TOKEN_NAME        = "Caspian Token";
    uint8   public constant TOKEN_DECIMALS    = 18;

    uint256 public constant DECIMALSFACTOR    = 10**uint256(TOKEN_DECIMALS);
    uint256 public constant TOKEN_TOTALSUPPLY = 1000000000 * DECIMALSFACTOR;
}



// ----------------------------------------------------------------------------
// CaspianTokenSaleConfig - Token Sale Configuration
//
// Copyright (c) 2018 Caspian, Limited (TM).
// http://www.caspian.tech/
// ----------------------------------------------------------------------------


contract CaspianTokenSaleConfig is CaspianTokenConfig {

    //
    // Time
    //
    uint256 public constant INITIAL_STARTTIME    = 1538553600; // 2018-10-03, 08:00:00 UTC
    uint256 public constant INITIAL_ENDTIME      = 1538726400; // 2018-10-05, 08:00:00 UTC


    //
    // Purchases
    //

    // Minimum amount of ETH that can be used for purchase.
    uint256 public constant CONTRIBUTION_MIN     = 0.5 ether;

    // Price of tokens, based on the 1 ETH = 4000 CSP conversion ratio.
    uint256 public constant TOKENS_PER_KETHER    = 4000000;

    // Amount of bonus applied to the sale. 2000 = 20.00% bonus, 750 = 7.50% bonus, 0 = no bonus.
    uint256 public constant BONUS                = 0;

    // Maximum amount of tokens that can be purchased for each account. 0 for no maximum.
    uint256 public constant TOKENS_ACCOUNT_MAX   = 400000 * DECIMALSFACTOR; // 100 ETH Max
}


// ----------------------------------------------------------------------------
// CaspianTokenSale - Token Sale Contract
//
// Copyright (c) 2018 Caspian, Limited (TM).
// http://www.caspian.tech/
//
// Based on code from Enuma Technologies.
// Copyright (c) 2017 Enuma Technologies Limited.
// ----------------------------------------------------------------------------


contract CaspianTokenSale is FlexibleTokenSale, CaspianTokenSaleConfig {

   //
   // Whitelist
   //
   uint8 public currentPhase;

   mapping(address => uint8) public whitelist;


   //
   // Events
   //
   event WhitelistUpdated(address indexed _account, uint8 _phase);


   constructor(address wallet) public
      FlexibleTokenSale(INITIAL_STARTTIME, INITIAL_ENDTIME, wallet)
   {
      tokensPerKEther     = TOKENS_PER_KETHER;
      bonus               = BONUS;
      maxTokensPerAccount = TOKENS_ACCOUNT_MAX;
      contributionMin     = CONTRIBUTION_MIN;
      currentPhase        = 1;
   }


   // Allows the owner or ops to add/remove people from the whitelist.
   function updateWhitelist(address _address, uint8 _phase) external onlyOwnerOrOps returns (bool) {
      return updateWhitelistInternal(_address, _phase);
   }


   function updateWhitelistInternal(address _address, uint8 _phase) internal returns (bool) {
      require(_address != address(0));
      require(_address != address(this));
      require(_address != walletAddress);
      require(_phase <= 1);

      whitelist[_address] = _phase;

      emit WhitelistUpdated(_address, _phase);

      return true;
   }


   // Allows the owner or ops to add/remove people from the whitelist, in batches.
   function updateWhitelistBatch(address[] _addresses, uint8 _phase) external onlyOwnerOrOps returns (bool) {
      require(_addresses.length > 0);

      for (uint256 i = 0; i < _addresses.length; i++) {
         require(updateWhitelistInternal(_addresses[i], _phase));
      }

      return true;
   }


   // This is an extension to the buyToken function in FlexibleTokenSale which also takes
   // care of checking contributors against the whitelist. Since buyTokens supports proxy payments
   // we check that both the sender and the beneficiary have been whitelisted.
   function buyTokensInternal(address _beneficiary, uint256 _bonus) internal returns (uint256) {
      require(whitelist[msg.sender] >= currentPhase);
      require(whitelist[_beneficiary] >= currentPhase);

      return super.buyTokensInternal(_beneficiary, _bonus);
   }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"resume","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentPhase","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bonus","type":"uint256"}],"name":"setBonus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokensPerKEther","type":"uint256"}],"name":"setTokensPerKEther","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_ENDTIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"},{"name":"_phase","type":"uint8"}],"name":"updateWhitelistBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BONUS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_phase","type":"uint8"}],"name":"updateWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenConversionFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_ACCOUNT_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_STARTTIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"}],"name":"setSaleWindow","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"walletAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"suspended","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOpsAddress","type":"address"}],"name":"setOpsAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_TOTALSUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonus","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":"DECIMALSFACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTokensPerAccount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensPerKEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_walletAddress","type":"address"}],"name":"setWalletAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwnerOrOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRIBUTION_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contributionMin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposedOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"suspend","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"completeOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxTokens","type":"uint256"}],"name":"setMaxTokensPerAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_PER_KETHER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"wallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"},{"indexed":false,"name":"_phase","type":"uint8"}],"name":"WhitelistUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"TokensPerKEtherUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newMax","type":"uint256"}],"name":"MaxTokensPerAccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newValue","type":"uint256"}],"name":"BonusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_startTime","type":"uint256"},{"indexed":false,"name":"_endTime","type":"uint256"}],"name":"SaleWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newAddress","type":"address"}],"name":"WalletAddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleSuspended","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_beneficiary","type":"address"},{"indexed":false,"name":"_cost","type":"uint256"},{"indexed":false,"name":"_tokens","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensReclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newAddress","type":"address"}],"name":"OpsAddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_proposedOwner","type":"address"}],"name":"OwnershipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnershipTransferCompleted","type":"event"}]

608060405234801561001057600080fd5b50604051602080611c02833981016040525160008054600160a060020a03191633600160a060020a03161790556001805460a060020a60ff0219169055635bb47700635bb71a0082600160a060020a038116151561006d57600080fd5b30600160a060020a031681600160a060020a03161415151561008e57600080fd5b600b8054600160a060020a03909216600160a060020a03199092169190911790556001805460a060020a60ff02191681556005805460ff1990811690915560039390935560049190915560006007819055600d819055600e55623d09006006556954b40b1f852bda0000006008556706f05b59d3b20000600955600f805490921617905550611ae0806101226000396000f3006080604052600436106102375763ffffffff60e060020a600035041663046f7da28114610243578063055ad42e1461026c5780630b98f975146102975780630e9d02cc146102af57806318821400146102c75780632a905318146103515780632f54bf6e14610366578063312defb4146103875780633197cbb6146103ae5780633c54caa5146103c357806340267e53146103d85780634b8624c4146104005780634bb278f3146104155780634d399cb31461042a57806353105fbc146104515780635b2b345c146104665780635b7f415c1461047b57806363b2011714610490578063677ab667146104a5578063680e354a146104ba5780636ad5b3ea146104d5578063702efdf314610506578063707789c51461051b57806374c950fb1461053c57806375b4d78c1461055157806378e97925146105665780638bc04eb71461057b5780638da5cb5b146105905780638ea64376146105a55780639a02edfe146105ba5780639b19251a146105cf578063a5bc770c146105f0578063ac1a386a14610605578063adcf59ee14610626578063b3f05b9714610647578063ba9bb8271461065c578063bcc13d1d14610671578063c0b6f56114610686578063c4d66de8146106a7578063c7a02061146106c8578063d153b60c146106dd578063d18e81b3146106f2578063e6400bbe14610707578063e71a78111461071c578063ec8ac4d814610731578063ef326c6d14610745578063f18e120b14610766578063f527c8561461077e578063fc0c546a14610793575b610240336107a8565b50005b34801561024f57600080fd5b506102586107bc565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610823565b6040805160ff9092168252519081900360200190f35b3480156102a357600080fd5b5061025860043561082c565b3480156102bb57600080fd5b50610258600435610894565b3480156102d357600080fd5b506102dc6108fa565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103165781810151838201526020016102fe565b50505050905090810190601f1680156103435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035d57600080fd5b506102dc610931565b34801561037257600080fd5b50610258600160a060020a0360043516610968565b34801561039357600080fd5b5061039c61097c565b60408051918252519081900360200190f35b3480156103ba57600080fd5b5061039c610984565b3480156103cf57600080fd5b5061025861098a565b3480156103e457600080fd5b50610258602460048035828101929101359060ff903516610bc5565b34801561040c57600080fd5b5061039c610c38565b34801561042157600080fd5b50610258610c3d565b34801561043657600080fd5b50610258600160a060020a036004351660ff60243516610ce2565b34801561045d57600080fd5b5061039c610d09565b34801561047257600080fd5b5061039c610d0f565b34801561048757600080fd5b50610281610d1d565b34801561049c57600080fd5b5061039c610d22565b3480156104b157600080fd5b5061039c610d28565b3480156104c657600080fd5b50610258600435602435610d30565b3480156104e157600080fd5b506104ea610db0565b60408051600160a060020a039092168252519081900360200190f35b34801561051257600080fd5b50610258610dbf565b34801561052757600080fd5b50610258600160a060020a0360043516610dc8565b34801561054857600080fd5b5061039c610e7f565b34801561055d57600080fd5b5061039c610e8f565b34801561057257600080fd5b5061039c610e95565b34801561058757600080fd5b5061039c610e9b565b34801561059c57600080fd5b506104ea610ea7565b3480156105b157600080fd5b506104ea610eb6565b3480156105c657600080fd5b5061039c610ec5565b3480156105db57600080fd5b50610281600160a060020a0360043516610ecb565b3480156105fc57600080fd5b5061039c610ee0565b34801561061157600080fd5b50610258600160a060020a0360043516610ee6565b34801561063257600080fd5b50610258600160a060020a0360043516610fc9565b34801561065357600080fd5b50610258610fe3565b34801561066857600080fd5b5061039c611004565b34801561067d57600080fd5b5061039c611010565b34801561069257600080fd5b50610258600160a060020a0360043516611016565b3480156106b357600080fd5b50610258600160a060020a03600435166110e2565b3480156106d457600080fd5b5061039c611276565b3480156106e957600080fd5b506104ea61127c565b3480156106fe57600080fd5b5061039c61128b565b34801561071357600080fd5b5061025861128f565b34801561072857600080fd5b506102586112fc565b61039c600160a060020a03600435166107a8565b34801561075157600080fd5b50610258600160a060020a036004351661137f565b34801561077257600080fd5b506102586004356113ac565b34801561078a57600080fd5b5061039c611405565b34801561079f57600080fd5b506104ea61140c565b60006107b68260075461141b565b92915050565b60006107c733610968565b15156001146107d557600080fd5b60055460ff1615156107e957506000610820565b6005805460ff191690556040517fbcbdbf400d5c713d9679ffa947f717848591ab5a7d1608c49119db603c4942cb90600090a15060015b90565b600f5460ff1681565b600061083733610968565b151560011461084557600080fd5b61271082111561085457600080fd5b60078290556040805183815290517f04a7ca0e55f887a637b560614f621b92b79423e20152fea70bc4be66edaee3d69181900360200190a1506001919050565b600061089f33610968565b15156001146108ad57600080fd5b600082116108ba57600080fd5b60068290556040805183815290517fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab9181900360200190a1506001919050565b60408051808201909152600d81527f4361737069616e20546f6b656e00000000000000000000000000000000000000602082015281565b60408051808201909152600381527f4353500000000000000000000000000000000000000000000000000000000000602082015281565b600054600160a060020a0390811691161490565b635bb71a0081565b60045481565b600080600061099833610968565b15156001146109a657600080fd5b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152915191909216916370a082319160248083019260209291908290030181600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d6020811015610a3857600080fd5b50519150811515610a4c5760009250610bc0565b600c60009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b50519050600160a060020a0381161515610ae257600080fd5b600c54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d6020811015610b7b57600080fd5b50511515610b8857600080fd5b6040805183815290517fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b9181900360200190a1600192505b505090565b600080610bd133610fc9565b1515610bdc57600080fd5b60008411610be957600080fd5b5060005b83811015610c2d57610c1a858583818110610c0457fe5b90506020020135600160a060020a031684611483565b1515610c2557600080fd5b600101610bed565b506001949350505050565b600081565b6000610c4833610968565b1515600114610c5657600080fd5b60015474010000000000000000000000000000000000000000900460ff1615610c7e57600080fd5b6001805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a150600190565b6000610ced33610fc9565b1515610cf857600080fd5b610d028383611483565b9392505050565b600a5481565b6954b40b1f852bda00000081565b601281565b600d5481565b635bb4770081565b6000610d3b33610968565b1515600114610d4957600080fd5b60008311610d5657600080fd5b828211610d6257600080fd5b60038390556004829055604080518481526020810184905281517f7291acdf619347e3dd338a8b65d1788570a0f1bc413e94e9e7333d0561c6ed58929181900390910190a150600192915050565b600b54600160a060020a031681565b60055460ff1681565b6000610dd333610968565b1515600114610de157600080fd5b600054600160a060020a0383811691161415610dfc57600080fd5b30600160a060020a031682600160a060020a031614151515610e1d57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290556040519116907f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650890600090a2506001919050565b6b033b2e3c9fd0803ce800000081565b60075481565b60035481565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b60085481565b60106020526000908152604090205460ff1681565b60065481565b6000610ef133610968565b1515600114610eff57600080fd5b600160a060020a0382161515610f1457600080fd5b30600160a060020a031682600160a060020a031614151515610f3557600080fd5b600c54600160a060020a0383811691161415610f5057600080fd5b610f5982610fc9565b15610f6357600080fd5b600b8054600160a060020a03841673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d9181900360200190a1506001919050565b6000610fd482610968565b806107b657506107b68261137f565b60015474010000000000000000000000000000000000000000900460ff1681565b6706f05b59d3b2000081565b60095481565b600061102133610968565b151560011461102f57600080fd5b600160a060020a038216151561104457600080fd5b30600160a060020a031682600160a060020a03161415151561106557600080fd5b600054600160a060020a038381169116141561108057600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290556040519116907f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf90600090a2506001919050565b60006110ed33610968565b15156001146110fb57600080fd5b600c54600160a060020a03161561111157600080fd5b600160a060020a038216151561112657600080fd5b30600160a060020a031682600160a060020a03161415151561114757600080fd5b600b54600160a060020a038381169116141561116257600080fd5b61116b82610fc9565b1561117557600080fd5b81600c60006101000a815481600160a060020a030219169083600160a060020a031602179055506112306004611224600361122486600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156111e757600080fd5b505af11580156111fb573d6000803e3d6000fd5b505050506040513d602081101561121157600080fd5b505160129060ff1663ffffffff61154d16565b9063ffffffff61156216565b600a90810a9081905560001061124557600080fd5b6040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a1506001919050565b600e5481565b600154600160a060020a031681565b4290565b600061129a33610968565b15156001146112a857600080fd5b60055460ff161515600114156112c057506000610820565b6005805460ff191660011790556040517fe14916b4c867f32e91547d295f9b845b805d5b8c813daa3adbc1597f80a0c5eb90600090a150600190565b60015460009033600160a060020a0390811691161461131a57600080fd5b60008054600160a060020a0333811673ffffffffffffffffffffffffffffffffffffffff1992831617808455600180549093169092556040519116917f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840791a250600190565b600254600090600160a060020a0316158015906107b6575050600254600160a060020a0390811691161490565b60006113b733610968565b15156001146113c557600080fd5b60088290556040805183815290517f2de896f66f29831ace4b07f5658ac41de20910c13ce8b8db17bc102a80beff269181900360200190a1506001919050565b623d090081565b600c54600160a060020a031681565b600f54600160a060020a033316600090815260106020526040812054909160ff9081169116101561144b57600080fd5b600f54600160a060020a03841660009081526010602052604090205460ff9182169116101561147957600080fd5b610d02838361157f565b6000600160a060020a038316151561149a57600080fd5b30600160a060020a031683600160a060020a0316141515156114bb57600080fd5b600b54600160a060020a03848116911614156114d657600080fd5b600160ff831611156114e757600080fd5b600160a060020a038316600081815260106020908152604091829020805460ff191660ff8716908117909155825190815291517f7ed18aa59a2962897d3e7ed3da887dfb6a03cca6c3cfe8d74e55130f631791c89281900390910190a250600192915050565b60008183101561155c57600080fd5b50900390565b60008282018381101561157457600080fd5b8091505b5092915050565b6000806000806000806000806000600160149054906101000a900460ff161515156115a957600080fd5b60055460ff16156115b957600080fd5b6003546115c461128b565b10156115cf57600080fd5b6004546115da61128b565b11156115e557600080fd5b6009543410156115f457600080fd5b600160a060020a038b16151561160957600080fd5b30600160a060020a03168b600160a060020a03161415151561162a57600080fd5b600c54600160a060020a038c81169116141561164557600080fd5b600b5433600160a060020a039081169116141561166157600080fd5b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152915191909216916370a082319160248083019260209291908290030181600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b505050506040513d60208110156116f357600080fd5b505197506000881161170457600080fd5b600a5461174c906117406117208d61271063ffffffff61156216565b60065461173490349063ffffffff6119d416565b9063ffffffff6119d416565b9063ffffffff611a0216565b96506000871161175b57600080fd5b34955060009450879350600060085411156117ab576117798b611a17565b600854909350831061178a57600080fd5b60085461179d908463ffffffff61154d16565b9150878210156117ab578193505b600084116117b857600080fd5b8387111561181d5792955085926118006117ec6117dd8c61271063ffffffff61156216565b6006549063ffffffff6119d416565b600a54611740908a9063ffffffff6119d416565b95508534111561181d5761181a348763ffffffff61154d16565b94505b61182d348663ffffffff61154d16565b600b54604051919250600160a060020a03169082156108fc029083906000818181858888f19350505050158015611868573d6000803e3d6000fd5b50600d5461187c908863ffffffff61156216565b600d55600e54611892908263ffffffff61156216565b600e55600c54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038e81166004830152602482018b90529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561190457600080fd5b505af1158015611918573d6000803e3d6000fd5b505050506040513d602081101561192e57600080fd5b5051151561193b57600080fd5b600085111561197c57604051600160a060020a0333169086156108fc029087906000818181858888f1935050505015801561197a573d6000803e3d6000fd5b505b60408051600160a060020a038d1681526020810188905280820189905290517f8fafebcaf9d154343dad25669bfa277f4fbacd7ac6b0c4fed522580e040a0f339181900360600190a150949998505050505050505050565b6000808315156119e75760009150611578565b508282028284828115156119f757fe5b041461157457600080fd5b60008183811515611a0f57fe5b049392505050565b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916370a082319160248082019260209290919082900301818787803b158015611a8257600080fd5b505af1158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b5051929150505600a165627a7a7230582052e03b652d73656d9e6a3ddb89bcf2c522ae5ef54dc8a30f622dd91dd2d04fb200290000000000000000000000009ca9e0139f5558ba9b4a5e71990cd62a4457196b

Deployed Bytecode

0x6080604052600436106102375763ffffffff60e060020a600035041663046f7da28114610243578063055ad42e1461026c5780630b98f975146102975780630e9d02cc146102af57806318821400146102c75780632a905318146103515780632f54bf6e14610366578063312defb4146103875780633197cbb6146103ae5780633c54caa5146103c357806340267e53146103d85780634b8624c4146104005780634bb278f3146104155780634d399cb31461042a57806353105fbc146104515780635b2b345c146104665780635b7f415c1461047b57806363b2011714610490578063677ab667146104a5578063680e354a146104ba5780636ad5b3ea146104d5578063702efdf314610506578063707789c51461051b57806374c950fb1461053c57806375b4d78c1461055157806378e97925146105665780638bc04eb71461057b5780638da5cb5b146105905780638ea64376146105a55780639a02edfe146105ba5780639b19251a146105cf578063a5bc770c146105f0578063ac1a386a14610605578063adcf59ee14610626578063b3f05b9714610647578063ba9bb8271461065c578063bcc13d1d14610671578063c0b6f56114610686578063c4d66de8146106a7578063c7a02061146106c8578063d153b60c146106dd578063d18e81b3146106f2578063e6400bbe14610707578063e71a78111461071c578063ec8ac4d814610731578063ef326c6d14610745578063f18e120b14610766578063f527c8561461077e578063fc0c546a14610793575b610240336107a8565b50005b34801561024f57600080fd5b506102586107bc565b604080519115158252519081900360200190f35b34801561027857600080fd5b50610281610823565b6040805160ff9092168252519081900360200190f35b3480156102a357600080fd5b5061025860043561082c565b3480156102bb57600080fd5b50610258600435610894565b3480156102d357600080fd5b506102dc6108fa565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103165781810151838201526020016102fe565b50505050905090810190601f1680156103435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035d57600080fd5b506102dc610931565b34801561037257600080fd5b50610258600160a060020a0360043516610968565b34801561039357600080fd5b5061039c61097c565b60408051918252519081900360200190f35b3480156103ba57600080fd5b5061039c610984565b3480156103cf57600080fd5b5061025861098a565b3480156103e457600080fd5b50610258602460048035828101929101359060ff903516610bc5565b34801561040c57600080fd5b5061039c610c38565b34801561042157600080fd5b50610258610c3d565b34801561043657600080fd5b50610258600160a060020a036004351660ff60243516610ce2565b34801561045d57600080fd5b5061039c610d09565b34801561047257600080fd5b5061039c610d0f565b34801561048757600080fd5b50610281610d1d565b34801561049c57600080fd5b5061039c610d22565b3480156104b157600080fd5b5061039c610d28565b3480156104c657600080fd5b50610258600435602435610d30565b3480156104e157600080fd5b506104ea610db0565b60408051600160a060020a039092168252519081900360200190f35b34801561051257600080fd5b50610258610dbf565b34801561052757600080fd5b50610258600160a060020a0360043516610dc8565b34801561054857600080fd5b5061039c610e7f565b34801561055d57600080fd5b5061039c610e8f565b34801561057257600080fd5b5061039c610e95565b34801561058757600080fd5b5061039c610e9b565b34801561059c57600080fd5b506104ea610ea7565b3480156105b157600080fd5b506104ea610eb6565b3480156105c657600080fd5b5061039c610ec5565b3480156105db57600080fd5b50610281600160a060020a0360043516610ecb565b3480156105fc57600080fd5b5061039c610ee0565b34801561061157600080fd5b50610258600160a060020a0360043516610ee6565b34801561063257600080fd5b50610258600160a060020a0360043516610fc9565b34801561065357600080fd5b50610258610fe3565b34801561066857600080fd5b5061039c611004565b34801561067d57600080fd5b5061039c611010565b34801561069257600080fd5b50610258600160a060020a0360043516611016565b3480156106b357600080fd5b50610258600160a060020a03600435166110e2565b3480156106d457600080fd5b5061039c611276565b3480156106e957600080fd5b506104ea61127c565b3480156106fe57600080fd5b5061039c61128b565b34801561071357600080fd5b5061025861128f565b34801561072857600080fd5b506102586112fc565b61039c600160a060020a03600435166107a8565b34801561075157600080fd5b50610258600160a060020a036004351661137f565b34801561077257600080fd5b506102586004356113ac565b34801561078a57600080fd5b5061039c611405565b34801561079f57600080fd5b506104ea61140c565b60006107b68260075461141b565b92915050565b60006107c733610968565b15156001146107d557600080fd5b60055460ff1615156107e957506000610820565b6005805460ff191690556040517fbcbdbf400d5c713d9679ffa947f717848591ab5a7d1608c49119db603c4942cb90600090a15060015b90565b600f5460ff1681565b600061083733610968565b151560011461084557600080fd5b61271082111561085457600080fd5b60078290556040805183815290517f04a7ca0e55f887a637b560614f621b92b79423e20152fea70bc4be66edaee3d69181900360200190a1506001919050565b600061089f33610968565b15156001146108ad57600080fd5b600082116108ba57600080fd5b60068290556040805183815290517fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab9181900360200190a1506001919050565b60408051808201909152600d81527f4361737069616e20546f6b656e00000000000000000000000000000000000000602082015281565b60408051808201909152600381527f4353500000000000000000000000000000000000000000000000000000000000602082015281565b600054600160a060020a0390811691161490565b635bb71a0081565b60045481565b600080600061099833610968565b15156001146109a657600080fd5b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152915191909216916370a082319160248083019260209291908290030181600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d6020811015610a3857600080fd5b50519150811515610a4c5760009250610bc0565b600c60009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b50519050600160a060020a0381161515610ae257600080fd5b600c54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d6020811015610b7b57600080fd5b50511515610b8857600080fd5b6040805183815290517fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b9181900360200190a1600192505b505090565b600080610bd133610fc9565b1515610bdc57600080fd5b60008411610be957600080fd5b5060005b83811015610c2d57610c1a858583818110610c0457fe5b90506020020135600160a060020a031684611483565b1515610c2557600080fd5b600101610bed565b506001949350505050565b600081565b6000610c4833610968565b1515600114610c5657600080fd5b60015474010000000000000000000000000000000000000000900460ff1615610c7e57600080fd5b6001805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a150600190565b6000610ced33610fc9565b1515610cf857600080fd5b610d028383611483565b9392505050565b600a5481565b6954b40b1f852bda00000081565b601281565b600d5481565b635bb4770081565b6000610d3b33610968565b1515600114610d4957600080fd5b60008311610d5657600080fd5b828211610d6257600080fd5b60038390556004829055604080518481526020810184905281517f7291acdf619347e3dd338a8b65d1788570a0f1bc413e94e9e7333d0561c6ed58929181900390910190a150600192915050565b600b54600160a060020a031681565b60055460ff1681565b6000610dd333610968565b1515600114610de157600080fd5b600054600160a060020a0383811691161415610dfc57600080fd5b30600160a060020a031682600160a060020a031614151515610e1d57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290556040519116907f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650890600090a2506001919050565b6b033b2e3c9fd0803ce800000081565b60075481565b60035481565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b60085481565b60106020526000908152604090205460ff1681565b60065481565b6000610ef133610968565b1515600114610eff57600080fd5b600160a060020a0382161515610f1457600080fd5b30600160a060020a031682600160a060020a031614151515610f3557600080fd5b600c54600160a060020a0383811691161415610f5057600080fd5b610f5982610fc9565b15610f6357600080fd5b600b8054600160a060020a03841673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d9181900360200190a1506001919050565b6000610fd482610968565b806107b657506107b68261137f565b60015474010000000000000000000000000000000000000000900460ff1681565b6706f05b59d3b2000081565b60095481565b600061102133610968565b151560011461102f57600080fd5b600160a060020a038216151561104457600080fd5b30600160a060020a031682600160a060020a03161415151561106557600080fd5b600054600160a060020a038381169116141561108057600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290556040519116907f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf90600090a2506001919050565b60006110ed33610968565b15156001146110fb57600080fd5b600c54600160a060020a03161561111157600080fd5b600160a060020a038216151561112657600080fd5b30600160a060020a031682600160a060020a03161415151561114757600080fd5b600b54600160a060020a038381169116141561116257600080fd5b61116b82610fc9565b1561117557600080fd5b81600c60006101000a815481600160a060020a030219169083600160a060020a031602179055506112306004611224600361122486600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156111e757600080fd5b505af11580156111fb573d6000803e3d6000fd5b505050506040513d602081101561121157600080fd5b505160129060ff1663ffffffff61154d16565b9063ffffffff61156216565b600a90810a9081905560001061124557600080fd5b6040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c890600090a1506001919050565b600e5481565b600154600160a060020a031681565b4290565b600061129a33610968565b15156001146112a857600080fd5b60055460ff161515600114156112c057506000610820565b6005805460ff191660011790556040517fe14916b4c867f32e91547d295f9b845b805d5b8c813daa3adbc1597f80a0c5eb90600090a150600190565b60015460009033600160a060020a0390811691161461131a57600080fd5b60008054600160a060020a0333811673ffffffffffffffffffffffffffffffffffffffff1992831617808455600180549093169092556040519116917f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840791a250600190565b600254600090600160a060020a0316158015906107b6575050600254600160a060020a0390811691161490565b60006113b733610968565b15156001146113c557600080fd5b60088290556040805183815290517f2de896f66f29831ace4b07f5658ac41de20910c13ce8b8db17bc102a80beff269181900360200190a1506001919050565b623d090081565b600c54600160a060020a031681565b600f54600160a060020a033316600090815260106020526040812054909160ff9081169116101561144b57600080fd5b600f54600160a060020a03841660009081526010602052604090205460ff9182169116101561147957600080fd5b610d02838361157f565b6000600160a060020a038316151561149a57600080fd5b30600160a060020a031683600160a060020a0316141515156114bb57600080fd5b600b54600160a060020a03848116911614156114d657600080fd5b600160ff831611156114e757600080fd5b600160a060020a038316600081815260106020908152604091829020805460ff191660ff8716908117909155825190815291517f7ed18aa59a2962897d3e7ed3da887dfb6a03cca6c3cfe8d74e55130f631791c89281900390910190a250600192915050565b60008183101561155c57600080fd5b50900390565b60008282018381101561157457600080fd5b8091505b5092915050565b6000806000806000806000806000600160149054906101000a900460ff161515156115a957600080fd5b60055460ff16156115b957600080fd5b6003546115c461128b565b10156115cf57600080fd5b6004546115da61128b565b11156115e557600080fd5b6009543410156115f457600080fd5b600160a060020a038b16151561160957600080fd5b30600160a060020a03168b600160a060020a03161415151561162a57600080fd5b600c54600160a060020a038c81169116141561164557600080fd5b600b5433600160a060020a039081169116141561166157600080fd5b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152915191909216916370a082319160248083019260209291908290030181600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b505050506040513d60208110156116f357600080fd5b505197506000881161170457600080fd5b600a5461174c906117406117208d61271063ffffffff61156216565b60065461173490349063ffffffff6119d416565b9063ffffffff6119d416565b9063ffffffff611a0216565b96506000871161175b57600080fd5b34955060009450879350600060085411156117ab576117798b611a17565b600854909350831061178a57600080fd5b60085461179d908463ffffffff61154d16565b9150878210156117ab578193505b600084116117b857600080fd5b8387111561181d5792955085926118006117ec6117dd8c61271063ffffffff61156216565b6006549063ffffffff6119d416565b600a54611740908a9063ffffffff6119d416565b95508534111561181d5761181a348763ffffffff61154d16565b94505b61182d348663ffffffff61154d16565b600b54604051919250600160a060020a03169082156108fc029083906000818181858888f19350505050158015611868573d6000803e3d6000fd5b50600d5461187c908863ffffffff61156216565b600d55600e54611892908263ffffffff61156216565b600e55600c54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038e81166004830152602482018b90529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561190457600080fd5b505af1158015611918573d6000803e3d6000fd5b505050506040513d602081101561192e57600080fd5b5051151561193b57600080fd5b600085111561197c57604051600160a060020a0333169086156108fc029087906000818181858888f1935050505015801561197a573d6000803e3d6000fd5b505b60408051600160a060020a038d1681526020810188905280820189905290517f8fafebcaf9d154343dad25669bfa277f4fbacd7ac6b0c4fed522580e040a0f339181900360600190a150949998505050505050505050565b6000808315156119e75760009150611578565b508282028284828115156119f757fe5b041461157457600080fd5b60008183811515611a0f57fe5b049392505050565b600c54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916370a082319160248082019260209290919082900301818787803b158015611a8257600080fd5b505af1158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b5051929150505600a165627a7a7230582052e03b652d73656d9e6a3ddb89bcf2c522ae5ef54dc8a30f622dd91dd2d04fb20029

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

0000000000000000000000009ca9e0139f5558ba9b4a5e71990cd62a4457196b

-----Decoded View---------------
Arg [0] : wallet (address): 0x9cA9e0139f5558ba9B4a5E71990cd62A4457196B

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ca9e0139f5558ba9b4a5e71990cd62a4457196b


Swarm Source

bzzr://52e03b652d73656d9e6a3ddb89bcf2c522ae5ef54dc8a30f622dd91dd2d04fb2

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.