ETH Price: $3,301.36 (-0.42%)
 
Transaction Hash
Method
Block
From
To
Set Wallet Addre...52167642018-03-08 5:31:152516 days ago1520487075IN
0xBC05e610...1beb58D36
0 ETH0.000986741
Transfer51541482018-02-25 14:02:312527 days ago1519567351IN
0xBC05e610...1beb58D36
0.627 ETH0.0014448660
Transfer51289262018-02-21 7:10:352531 days ago1519197035IN
0xBC05e610...1beb58D36
0.62 ETH0.0014448660
Transfer49963312018-01-29 22:37:212553 days ago1517265441IN
0xBC05e610...1beb58D36
2.373 ETH0.1204055,000
Transfer49872362018-01-28 10:05:222555 days ago1517133922IN
0xBC05e610...1beb58D36
0.31 ETH0.0013726157
Transfer49838182018-01-27 20:12:202555 days ago1517083940IN
0xBC05e610...1beb58D36
2.38 ETH0.0024081100
Transfer49691962018-01-25 9:18:262558 days ago1516871906IN
0xBC05e610...1beb58D36
2.372 ETH0.0120405500
Transfer49673162018-01-25 1:36:362558 days ago1516844196IN
0xBC05e610...1beb58D36
2.373 ETH0.00243218101
Transfer49659912018-01-24 20:31:072558 days ago1516825867IN
0xBC05e610...1beb58D36
2.374 ETH0.0013003754
Transfer49617532018-01-24 3:06:532559 days ago1516763213IN
0xBC05e610...1beb58D36
0.63 ETH0.0014448660
Transfer49617172018-01-24 2:59:092559 days ago1516762749IN
0xBC05e610...1beb58D36
0.63 ETH0.0024081100
Transfer49617172018-01-24 2:59:092559 days ago1516762749IN
0xBC05e610...1beb58D36
0.628 ETH0.0012762953
Transfer49590142018-01-23 16:22:372559 days ago1516724557IN
0xBC05e610...1beb58D36
2.372 ETH0.024088221,000.3
Transfer49586772018-01-23 14:52:202559 days ago1516719140IN
0xBC05e610...1beb58D36
3 ETH0.0010595644
Transfer49585852018-01-23 14:29:582559 days ago1516717798IN
0xBC05e610...1beb58D36
0.4 ETH0.0012040550
Transfer49540642018-01-22 20:06:002560 days ago1516651560IN
0xBC05e610...1beb58D36
0 ETH0.00361215150
Transfer49525082018-01-22 13:31:212561 days ago1516627881IN
0xBC05e610...1beb58D36
3 ETH0.0010595644
Transfer49524992018-01-22 13:28:592561 days ago1516627739IN
0xBC05e610...1beb58D36
3 ETH0.00107151
Transfer49524292018-01-22 13:11:472561 days ago1516626707IN
0xBC05e610...1beb58D36
3 ETH0.00079838
Transfer49500812018-01-22 3:38:402561 days ago1516592320IN
0xBC05e610...1beb58D36
2.3 ETH0.0012040550
Transfer49488132018-01-21 22:36:462561 days ago1516574206IN
0xBC05e610...1beb58D36
2.3 ETH0.0120405500
Transfer49461652018-01-21 11:42:442562 days ago1516534964IN
0xBC05e610...1beb58D36
1.5 ETH0.000001140.053
Transfer49460762018-01-21 11:21:412562 days ago1516533701IN
0xBC05e610...1beb58D36
0.4698 ETH0.0008440
Transfer49460712018-01-21 11:20:122562 days ago1516533612IN
0xBC05e610...1beb58D36
0.4698 ETH0.0008440
Transfer49453792018-01-21 8:30:472562 days ago1516523447IN
0xBC05e610...1beb58D36
2.38 ETH0.0023840199
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.96855031 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
1.40925376 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.3 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.62639212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.00039212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.373 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.8 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.373 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.00039212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.373 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.3736 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.373 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.08 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.08 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.08 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.08 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.00039212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.00039212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
0.00039212 ETH
49379682018-01-20 2:00:192563 days ago1516413619
0xBC05e610...1beb58D36
2.37360787 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BluzelleTokenSale

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.18;

// ----------------------------------------------------------------------------
// Owned - Ownership model with 2 phase transfers
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// 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);
   event OwnershipTransferCanceled();


   function Owned() 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;

      OwnershipTransferInitiated(proposedOwner);

      return true;
   }


   function cancelOwnershipTransfer() public onlyOwner returns (bool) {
      if (proposedOwner == address(0)) {
         return true;
      }

      proposedOwner = address(0);

      OwnershipTransferCanceled();

      return true;
   }


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

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

      OwnershipTransferCompleted(owner);

      return true;
   }
}

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



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

   address public opsAddress;

   event OpsAddressUpdated(address indexed _newAddress);


   function OpsManaged() public
      Owned()
   {
   }


   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;

      OpsAddressUpdated(opsAddress);

      return true;
   }
}

// ----------------------------------------------------------------------------
// Math - General Math Utility Library
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// 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) {
      uint256 r = a * b;

      require(a == 0 || r / a == b);

      return r;
   }


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

// ----------------------------------------------------------------------------
// ERC20Interface - Standard ERC20 Interface Definition
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// 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);
}

// ----------------------------------------------------------------------------
// ERC20Token - Standard ERC20 Implementation
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// 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;


   function ERC20Token(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.
      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);

      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);

      Transfer(_from, _to, _value);

      return true;
   }


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

      Approval(msg.sender, _spender, _value);

      return true;
   }
}

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



contract Finalizable is Owned {

   bool public finalized;

   event Finalized();


   function Finalizable() public
      Owned()
   {
      finalized = false;
   }


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

      finalized = true;

      Finalized();

      return true;
   }
}

// ----------------------------------------------------------------------------
// FinalizableToken - Extension to ERC20Token with ops and finalization
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// 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).
   function FinalizableToken(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 {
      require(_to != address(0));

      // 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.
// 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);


   function FlexibleTokenSale(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);

      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;

      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;

      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;

      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;

      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;

      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;

      SaleSuspended();

      return true;
   }


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

      suspended = false;

      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);
      }

      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));

      TokensReclaimed(tokens);

      return true;
   }
}


// ----------------------------------------------------------------------------
// BluzelleTokenConfig - Token Contract Configuration
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------


contract BluzelleTokenConfig {

    string  public constant TOKEN_SYMBOL      = "BLZ";
    string  public constant TOKEN_NAME        = "Bluzelle Token";
    uint8   public constant TOKEN_DECIMALS    = 18;

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


// ----------------------------------------------------------------------------
// BluzelleTokenSaleConfig - Token Sale Configuration
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------



contract BluzelleTokenSaleConfig is BluzelleTokenConfig {

    //
    // Time
    //
    uint256 public constant INITIAL_STARTTIME      = 1516240800; // 2018-01-18, 02:00:00 UTC
    uint256 public constant INITIAL_ENDTIME        = 1517536800; // 2018-02-02, 02:00:00 UTC
    uint256 public constant INITIAL_STAGE          = 1;


    //
    // Purchases
    //

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

    // Price of tokens, based on the 1 ETH = 1700 BLZ conversion ratio.
    uint256 public constant TOKENS_PER_KETHER     = 1700000;

    // 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.
    uint256 public constant TOKENS_ACCOUNT_MAX    = 17000 * DECIMALSFACTOR;
}


// ----------------------------------------------------------------------------
// BluzelleToken - ERC20 Compatible Token
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------



// ----------------------------------------------------------------------------
// The Bluzelle token is a standard ERC20 token with the addition of a few
// concepts such as:
//
// 1. Finalization
// Tokens can only be transfered by contributors after the contract has
// been finalized.
//
// 2. Ops Managed Model
// In addition to owner, there is a ops role which is used during the sale,
// by the sale contract, in order to transfer tokens.
// ----------------------------------------------------------------------------
contract BluzelleToken is FinalizableToken, BluzelleTokenConfig {


   event TokensReclaimed(uint256 _amount);


   function BluzelleToken() public
      FinalizableToken(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS, TOKEN_TOTALSUPPLY)
   {
   }


   // Allows the owner to reclaim tokens that have been sent to the token address itself.
   function reclaimTokens() public onlyOwner returns (bool) {

      address account = address(this);
      uint256 amount  = balanceOf(account);

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

      balances[account] = balances[account].sub(amount);
      balances[owner] = balances[owner].add(amount);

      Transfer(account, owner, amount);

      TokensReclaimed(amount);

      return true;
   }
}


// ----------------------------------------------------------------------------
// BluzelleTokenSale - Token Sale Contract
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------



contract BluzelleTokenSale is FlexibleTokenSale, BluzelleTokenSaleConfig {

   //
   // Whitelist
   //

   // This is the stage or whitelist group that is currently in effect.
   // Everybody that's been whitelisted for earlier stages should be able to
   // contribute in the current stage.
   uint256 public currentStage;

   // Keeps track of the amount of bonus to apply for a given stage. If set
   // to 0, the base class bonus will be used.
   mapping(uint256 => uint256) public stageBonus;

   // Keeps track of the amount of tokens that a specific account has received.
   mapping(address => uint256) public accountTokensPurchased;

   // This a mapping of address -> stage that they are allowed to participate in.
   // For example, if someone has been whitelisted for stage 2, they will be able
   // to participate for stages 2 and above but they would not be able to participate
   // in stage 1. A stage value of 0 means that the participant is not whitelisted.
   mapping(address => uint256) public whitelist;


   //
   // Events
   //
   event CurrentStageUpdated(uint256 _newStage);
   event StageBonusUpdated(uint256 _stage, uint256 _bonus);
   event WhitelistedStatusUpdated(address indexed _address, uint256 _stage);


   function BluzelleTokenSale(address wallet) public
      FlexibleTokenSale(INITIAL_STARTTIME, INITIAL_ENDTIME, wallet)
   {
      currentStage        = INITIAL_STAGE;
      tokensPerKEther     = TOKENS_PER_KETHER;
      bonus               = BONUS;
      maxTokensPerAccount = TOKENS_ACCOUNT_MAX;
      contributionMin     = CONTRIBUTION_MIN;
   }


   // Allows the admin to determine what is the current stage for
   // the sale. It can only move forward.
   function setCurrentStage(uint256 _stage) public onlyOwner returns(bool) {
      require(_stage > 0);

      if (currentStage == _stage) {
         return false;
      }

      currentStage = _stage;

      CurrentStageUpdated(_stage);

      return true;
   }


   // Allows the admin to set a bonus amount to apply for a specific stage.
   function setStageBonus(uint256 _stage, uint256 _bonus) public onlyOwner returns(bool) {
      require(_stage > 0);
      require(_bonus <= 10000);

      if (stageBonus[_stage] == _bonus) {
         // Nothing to change.
         return false;
      }

      stageBonus[_stage] = _bonus;

      StageBonusUpdated(_stage, _bonus);

      return true;
   }


   // Allows the owner or ops to add/remove people from the whitelist.
   function setWhitelistedStatus(address _address, uint256 _stage) public onlyOwnerOrOps returns (bool) {
      return setWhitelistedStatusInternal(_address, _stage);
   }


   function setWhitelistedStatusInternal(address _address, uint256 _stage) private returns (bool) {
      require(_address != address(0));
      require(_address != address(this));
      require(_address != walletAddress);

      whitelist[_address] = _stage;

      WhitelistedStatusUpdated(_address, _stage);

      return true;
   }


   // Allows the owner or ops to add/remove people from the whitelist, in batches. This makes
   // it easier/cheaper/faster to upload whitelist data in bulk. Note that the function is using an
   // unbounded loop so the call should take care to not exceed the tx gas limit or block gas limit.
   function setWhitelistedBatch(address[] _addresses, uint256 _stage) public onlyOwnerOrOps returns (bool) {
      require(_addresses.length > 0);

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

      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] > 0);
      require(whitelist[_beneficiary] > 0);
      require(currentStage >= whitelist[msg.sender]);

      uint256 _beneficiaryStage = whitelist[_beneficiary];
      require(currentStage >= _beneficiaryStage);

      uint256 applicableBonus = stageBonus[_beneficiaryStage];
      if (applicableBonus == 0) {
         applicableBonus = _bonus;
      }

      uint256 tokensPurchased = super.buyTokensInternal(_beneficiary, applicableBonus);

      accountTokensPurchased[_beneficiary] = accountTokensPurchased[_beneficiary].add(tokensPurchased);

      return tokensPurchased;
   }


   // Returns the number of tokens that the user has purchased. We keep a separate balance from
   // the token contract in case we'd like to do additional sales with new purchase limits. This behavior
   // is different from the base implementation which just checks the token balance from the token
   // contract directly.
   function getUserTokenBalance(address _beneficiary) internal view returns (uint256) {
      return accountTokensPurchased[_beneficiary];
   }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"resume","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"stageBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"_stage","type":"uint256"}],"name":"setCurrentStage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reclaimTokens","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":"_addresses","type":"address[]"},{"name":"_stage","type":"uint256"}],"name":"setWhitelistedBatch","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":"currentStage","outputs":[{"name":"","type":"uint256"}],"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":"uint256"}],"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":"_address","type":"address"},{"name":"_stage","type":"uint256"}],"name":"setWhitelistedStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_stage","type":"uint256"},{"name":"_bonus","type":"uint256"}],"name":"setStageBonus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"INITIAL_STAGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[{"name":"","type":"address"}],"name":"accountTokensPurchased","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":false,"name":"_newStage","type":"uint256"}],"name":"CurrentStageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_stage","type":"uint256"},{"indexed":false,"name":"_bonus","type":"uint256"}],"name":"StageBonusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_address","type":"address"},{"indexed":false,"name":"_stage","type":"uint256"}],"name":"WhitelistedStatusUpdated","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"},{"anonymous":false,"inputs":[],"name":"OwnershipTransferCanceled","type":"event"}]

6060604052341561000f57600080fd5b604051602080611d718339810160405280805160008054600160a060020a03191633600160a060020a03161790556001805460a060020a60ff02191690559150635a5fffa09050635a73c62082600160a060020a038116151561007157600080fd5b30600160a060020a031681600160a060020a03161415151561009257600080fd5b600b8054600160a060020a03909216600160a060020a03199092169190911790556001805460a060020a60ff02191681556005805460ff191690556003929092556004556000600781905567016345785d8a0000600955600d819055600e55600f55506219f0a060065569039992648a23c8a00000600855611c58806101196000396000f3006060604052600436106102795763ffffffff60e060020a600035041663046f7da281146102855780630b98f975146102ac5780630e9d02cc146102c257806318821400146102d85780631f209d9a1461036257806323452b9c1461038a5780632a9053181461039d5780632f54bf6e146103b0578063312defb4146103cf5780633197cbb6146103e257806338c67b73146103f55780633c54caa51461040b5780634b8624c41461041e5780634bb278f3146104315780635207c3911461044457806353105fbc146104955780635b2b345c146104a85780635b7f415c146104bb5780635bf5d54c146104e457806363b20117146104f7578063677ab6671461050a578063680e354a1461051d5780636ad5b3ea14610536578063702efdf314610565578063707789c51461057857806374c950fb1461059757806375b4d78c146105aa57806378e97925146105bd5780638bc04eb7146105d05780638da5cb5b146105e35780638ea64376146105f65780639a02edfe146106095780639b19251a1461061c578063a5bc770c1461063b578063a9a615e91461064e578063ac1a386a14610670578063adcf59ee1461068f578063aed396c6146106ae578063b3f05b97146106c7578063ba9bb827146106da578063bcc13d1d146106ed578063c0b6f56114610700578063c4d66de81461071f578063c7091c5e1461073e578063c7a0206114610751578063d153b60c14610764578063d18e81b314610777578063d7bb913f1461078a578063e6400bbe146107a9578063e71a7811146107bc578063ec8ac4d8146107cf578063ef326c6d146107e3578063f18e120b14610802578063f527c85614610818578063fc0c546a1461082b575b6102823361083e565b50005b341561029057600080fd5b610298610854565b604051901515815260200160405180910390f35b34156102b757600080fd5b6102986004356108be565b34156102cd57600080fd5b610298600435610926565b34156102e357600080fd5b6102eb61098c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561032757808201518382015260200161030f565b50505050905090810190601f1680156103545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036d57600080fd5b6103786004356109c3565b60405190815260200160405180910390f35b341561039557600080fd5b6102986109d5565b34156103a857600080fd5b6102eb610a4a565b34156103bb57600080fd5b610298600160a060020a0360043516610a81565b34156103da57600080fd5b610378610a95565b34156103ed57600080fd5b610378610a9d565b341561040057600080fd5b610298600435610aa3565b341561041657600080fd5b610298610b1b565b341561042957600080fd5b610378610cf7565b341561043c57600080fd5b610298610cfc565b341561044f57600080fd5b61029860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496505093359350610da492505050565b34156104a057600080fd5b610378610e12565b34156104b357600080fd5b610378610e18565b34156104c657600080fd5b6104ce610e26565b60405160ff909116815260200160405180910390f35b34156104ef57600080fd5b610378610e2b565b341561050257600080fd5b610378610e31565b341561051557600080fd5b610378610e37565b341561052857600080fd5b610298600435602435610e3f565b341561054157600080fd5b610549610ebf565b604051600160a060020a03909116815260200160405180910390f35b341561057057600080fd5b610298610ece565b341561058357600080fd5b610298600160a060020a0360043516610ed7565b34156105a257600080fd5b610378610f82565b34156105b557600080fd5b610378610f92565b34156105c857600080fd5b610378610f98565b34156105db57600080fd5b610378610f9e565b34156105ee57600080fd5b610549610faa565b341561060157600080fd5b610549610fb9565b341561061457600080fd5b610378610fc8565b341561062757600080fd5b610378600160a060020a0360043516610fce565b341561064657600080fd5b610378610fe0565b341561065957600080fd5b610298600160a060020a0360043516602435610fe6565b341561067b57600080fd5b610298600160a060020a036004351661100d565b341561069a57600080fd5b610298600160a060020a03600435166110ea565b34156106b957600080fd5b610298600435602435611104565b34156106d257600080fd5b6102986111ae565b34156106e557600080fd5b6103786111cf565b34156106f857600080fd5b6103786111db565b341561070b57600080fd5b610298600160a060020a03600435166111e1565b341561072a57600080fd5b610298600160a060020a03600435166112a1565b341561074957600080fd5b61037861141f565b341561075c57600080fd5b610378611424565b341561076f57600080fd5b61054961142a565b341561078257600080fd5b610378611439565b341561079557600080fd5b610378600160a060020a036004351661143d565b34156107b457600080fd5b61029861144f565b34156107c757600080fd5b6102986114bf565b610378600160a060020a036004351661083e565b34156107ee57600080fd5b610298600160a060020a036004351661153a565b341561080d57600080fd5b610298600435611567565b341561082357600080fd5b6103786115c0565b341561083657600080fd5b6105496115c7565b600061084c826007546115d6565b90505b919050565b600061085f33610a81565b151560011461086d57600080fd5b60055460ff161515610881575060006108bb565b6005805460ff191690557fbcbdbf400d5c713d9679ffa947f717848591ab5a7d1608c49119db603c4942cb60405160405180910390a15060015b90565b60006108c933610a81565b15156001146108d757600080fd5b6127108211156108e657600080fd5b60078290557f04a7ca0e55f887a637b560614f621b92b79423e20152fea70bc4be66edaee3d68260405190815260200160405180910390a1506001919050565b600061093133610a81565b151560011461093f57600080fd5b6000821161094c57600080fd5b60068290557fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab8260405190815260200160405180910390a1506001919050565b60408051908101604052600e81527f426c757a656c6c6520546f6b656e000000000000000000000000000000000000602082015281565b60106020526000908152604090205481565b60006109e033610a81565b15156001146109ee57600080fd5b600154600160a060020a03161515610a08575060016108bb565b60018054600160a060020a03191690557f670699162ea7ba4de638b5a57c2148aed9ee8bd69740a5e6a7db727e3886c88b60405160405180910390a150600190565b60408051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015281565b600054600160a060020a0390811691161490565b635a73c62081565b60045481565b6000610aae33610a81565b1515600114610abc57600080fd5b60008211610ac957600080fd5b81600f541415610adb5750600061084f565b600f8290557fbd102993c090f400138a05c1b5b0c9eadb8d94399c432f6522fab9cf26bd180b8260405190815260200160405180910390a1506001919050565b6000806000610b2933610a81565b1515600114610b3757600080fd5b600c54600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b9057600080fd5b6102c65a03f11515610ba157600080fd5b5050506040518051925050811515610bbc5760009250610cf2565b600c54600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610c0457600080fd5b6102c65a03f11515610c1557600080fd5b5050506040518051915050600160a060020a0381161515610c3557600080fd5b600c54600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c9457600080fd5b6102c65a03f11515610ca557600080fd5b505050604051805190501515610cba57600080fd5b7fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8260405190815260200160405180910390a1600192505b505090565b600081565b6000610d0733610a81565b1515600114610d1557600080fd5b60015474010000000000000000000000000000000000000000900460ff1615610d3d57600080fd5b6001805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b600080610db0336110ea565b1515610dbb57600080fd5b6000845111610dc957600080fd5b5060005b8351811015610e0857610df5848281518110610de557fe5b90602001906020020151846116ec565b1515610e0057600080fd5b600101610dcd565b5060019392505050565b600a5481565b69039992648a23c8a0000081565b601281565b600f5481565b600d5481565b635a5fffa081565b6000610e4a33610a81565b1515600114610e5857600080fd5b60008311610e6557600080fd5b828211610e7157600080fd5b600383905560048290557f7291acdf619347e3dd338a8b65d1788570a0f1bc413e94e9e7333d0561c6ed58838360405191825260208201526040908101905180910390a15060015b92915050565b600b54600160a060020a031681565b60055460ff1681565b6000610ee233610a81565b1515600114610ef057600080fd5b600054600160a060020a0383811691161415610f0b57600080fd5b30600160a060020a031682600160a060020a031614151515610f2c57600080fd5b60028054600160a060020a031916600160a060020a038481169190911791829055167f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650860405160405180910390a2506001919050565b6b019d971e4fe8401e7400000081565b60075481565b60035481565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b60085481565b60126020526000908152604090205481565b60065481565b6000610ff1336110ea565b1515610ffc57600080fd5b61100683836116ec565b9392505050565b600061101833610a81565b151560011461102657600080fd5b600160a060020a038216151561103b57600080fd5b30600160a060020a031682600160a060020a03161415151561105c57600080fd5b600c54600160a060020a038381169116141561107757600080fd5b611080826110ea565b1561108a57600080fd5b600b8054600160a060020a031916600160a060020a0384161790557f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d82604051600160a060020a03909116815260200160405180910390a1506001919050565b60006110f582610a81565b8061084c575061084c8261153a565b600061110f33610a81565b151560011461111d57600080fd5b6000831161112a57600080fd5b61271082111561113957600080fd5b60008381526010602052604090205482141561115757506000610eb9565b600083815260106020526040908190208390557f1744d5a5c185d64a1877cf5e5950b2e4043b955c9923252820fb9cf6ad2b257590849084905191825260208201526040908101905180910390a150600192915050565b60015474010000000000000000000000000000000000000000900460ff1681565b67016345785d8a000081565b60095481565b60006111ec33610a81565b15156001146111fa57600080fd5b600160a060020a038216151561120f57600080fd5b30600160a060020a031682600160a060020a03161415151561123057600080fd5b600054600160a060020a038381169116141561124b57600080fd5b60018054600160a060020a031916600160a060020a038481169190911791829055167f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b60006112ac33610a81565b15156001146112ba57600080fd5b600c54600160a060020a0316156112d057600080fd5b600160a060020a03821615156112e557600080fd5b30600160a060020a031682600160a060020a03161415151561130657600080fd5b600b54600160a060020a038381169116141561132157600080fd5b61132a826110ea565b1561133457600080fd5b600c8054600160a060020a031916600160a060020a0384169081179091556113d5906004906113c990600390829063313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561139e57600080fd5b6102c65a03f115156113af57600080fd5b50505060405180516012915060ff1663ffffffff61179816565b9063ffffffff6117ad16565b600a90810a90819055600090116113eb57600080fd5b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a1506001919050565b600181565b600e5481565b600154600160a060020a031681565b4290565b60116020526000908152604090205481565b600061145a33610a81565b151560011461146857600080fd5b60055460ff16151560011415611480575060006108bb565b6005805460ff191660011790557fe14916b4c867f32e91547d295f9b845b805d5b8c813daa3adbc1597f80a0c5eb60405160405180910390a150600190565b60015460009033600160a060020a039081169116146114dd57600080fd5b60008054600160a060020a03338116600160a060020a0319928316179283905560018054909216909155167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b600254600090600160a060020a03161580159061084c575050600254600160a060020a0390811691161490565b600061157233610a81565b151560011461158057600080fd5b60088290557f2de896f66f29831ace4b07f5658ac41de20910c13ce8b8db17bc102a80beff268260405190815260200160405180910390a1506001919050565b6219f0a081565b600c54600160a060020a031681565b600160a060020a03331660009081526012602052604081205481908190819081901161160157600080fd5b600160a060020a0386166000908152601260205260408120541161162457600080fd5b600160a060020a033316600090815260126020526040902054600f54101561164b57600080fd5b600160a060020a038616600090815260126020526040902054600f549093508390101561167757600080fd5b6000838152601060205260409020549150811515611693578491505b61169d86836117bf565b600160a060020a0387166000908152601160205260409020549091506116c9908263ffffffff6117ad16565b600160a060020a0387166000908152601160205260409020559250505092915050565b6000600160a060020a038316151561170357600080fd5b30600160a060020a031683600160a060020a03161415151561172457600080fd5b600b54600160a060020a038481169116141561173f57600080fd5b600160a060020a038316600081815260126020526040908190208490557f5beb3f610f1d5275b6ce198b03b5f6ebdeee3f94c2ed7c2941109390a303cd0f9084905190815260200160405180910390a250600192915050565b6000818310156117a757600080fd5b50900390565b60008282018381101561100657600080fd5b6000806000806000806000806000600160149054906101000a900460ff161515156117e957600080fd5b60055460ff16156117f957600080fd5b600354611804611439565b101561180f57600080fd5b60045461181a611439565b111561182557600080fd5b60095434101561183457600080fd5b600160a060020a038b16151561184957600080fd5b30600160a060020a03168b600160a060020a03161415151561186a57600080fd5b600c54600160a060020a038c81169116141561188557600080fd5b600b5433600160a060020a03908116911614156118a157600080fd5b600c54600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156118fa57600080fd5b6102c65a03f1151561190b57600080fd5b50505060405180519850506000881161192357600080fd5b600a5461196b9061195f61193f8d61271063ffffffff6117ad16565b60065461195390349063ffffffff611bd516565b9063ffffffff611bd516565b9063ffffffff611bfc16565b96506000871161197a57600080fd5b34955060009450879350600060085411156119ca576119988b611c11565b60085490935083106119a957600080fd5b6008546119bc908463ffffffff61179816565b9150878210156119ca578193505b600084116119d757600080fd5b83871115611a3c579295508592611a1f611a0b6119fc8c61271063ffffffff6117ad16565b6006549063ffffffff611bd516565b600a5461195f908a9063ffffffff611bd516565b955085341115611a3c57611a39348763ffffffff61179816565b94505b611a4c348663ffffffff61179816565b600b54909150600160a060020a031681156108fc0282604051600060405180830381858888f193505050501515611a8257600080fd5b600d54611a95908863ffffffff6117ad16565b600d55600e54611aab908263ffffffff6117ad16565b600e55600c54600160a060020a031663a9059cbb8c8960006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611b0d57600080fd5b6102c65a03f11515611b1e57600080fd5b505050604051805190501515611b3357600080fd5b6000851115611b6d57600160a060020a03331685156108fc0286604051600060405180830381858888f193505050501515611b6d57600080fd5b7f8fafebcaf9d154343dad25669bfa277f4fbacd7ac6b0c4fed522580e040a0f338b87896040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150949998505050505050505050565b6000828202831580611bf15750828482811515611bee57fe5b04145b151561100657600080fd5b60008183811515611c0957fe5b049392505050565b600160a060020a0316600090815260116020526040902054905600a165627a7a72305820c8dbbe176deeed0a10c085b277755263dd5fa9e252d70dd1a0720fb7a5a0784d0029000000000000000000000000e9638c2d07eac8774d46b85e47cf53f52d60239f

Deployed Bytecode

0x6060604052600436106102795763ffffffff60e060020a600035041663046f7da281146102855780630b98f975146102ac5780630e9d02cc146102c257806318821400146102d85780631f209d9a1461036257806323452b9c1461038a5780632a9053181461039d5780632f54bf6e146103b0578063312defb4146103cf5780633197cbb6146103e257806338c67b73146103f55780633c54caa51461040b5780634b8624c41461041e5780634bb278f3146104315780635207c3911461044457806353105fbc146104955780635b2b345c146104a85780635b7f415c146104bb5780635bf5d54c146104e457806363b20117146104f7578063677ab6671461050a578063680e354a1461051d5780636ad5b3ea14610536578063702efdf314610565578063707789c51461057857806374c950fb1461059757806375b4d78c146105aa57806378e97925146105bd5780638bc04eb7146105d05780638da5cb5b146105e35780638ea64376146105f65780639a02edfe146106095780639b19251a1461061c578063a5bc770c1461063b578063a9a615e91461064e578063ac1a386a14610670578063adcf59ee1461068f578063aed396c6146106ae578063b3f05b97146106c7578063ba9bb827146106da578063bcc13d1d146106ed578063c0b6f56114610700578063c4d66de81461071f578063c7091c5e1461073e578063c7a0206114610751578063d153b60c14610764578063d18e81b314610777578063d7bb913f1461078a578063e6400bbe146107a9578063e71a7811146107bc578063ec8ac4d8146107cf578063ef326c6d146107e3578063f18e120b14610802578063f527c85614610818578063fc0c546a1461082b575b6102823361083e565b50005b341561029057600080fd5b610298610854565b604051901515815260200160405180910390f35b34156102b757600080fd5b6102986004356108be565b34156102cd57600080fd5b610298600435610926565b34156102e357600080fd5b6102eb61098c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561032757808201518382015260200161030f565b50505050905090810190601f1680156103545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036d57600080fd5b6103786004356109c3565b60405190815260200160405180910390f35b341561039557600080fd5b6102986109d5565b34156103a857600080fd5b6102eb610a4a565b34156103bb57600080fd5b610298600160a060020a0360043516610a81565b34156103da57600080fd5b610378610a95565b34156103ed57600080fd5b610378610a9d565b341561040057600080fd5b610298600435610aa3565b341561041657600080fd5b610298610b1b565b341561042957600080fd5b610378610cf7565b341561043c57600080fd5b610298610cfc565b341561044f57600080fd5b61029860046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496505093359350610da492505050565b34156104a057600080fd5b610378610e12565b34156104b357600080fd5b610378610e18565b34156104c657600080fd5b6104ce610e26565b60405160ff909116815260200160405180910390f35b34156104ef57600080fd5b610378610e2b565b341561050257600080fd5b610378610e31565b341561051557600080fd5b610378610e37565b341561052857600080fd5b610298600435602435610e3f565b341561054157600080fd5b610549610ebf565b604051600160a060020a03909116815260200160405180910390f35b341561057057600080fd5b610298610ece565b341561058357600080fd5b610298600160a060020a0360043516610ed7565b34156105a257600080fd5b610378610f82565b34156105b557600080fd5b610378610f92565b34156105c857600080fd5b610378610f98565b34156105db57600080fd5b610378610f9e565b34156105ee57600080fd5b610549610faa565b341561060157600080fd5b610549610fb9565b341561061457600080fd5b610378610fc8565b341561062757600080fd5b610378600160a060020a0360043516610fce565b341561064657600080fd5b610378610fe0565b341561065957600080fd5b610298600160a060020a0360043516602435610fe6565b341561067b57600080fd5b610298600160a060020a036004351661100d565b341561069a57600080fd5b610298600160a060020a03600435166110ea565b34156106b957600080fd5b610298600435602435611104565b34156106d257600080fd5b6102986111ae565b34156106e557600080fd5b6103786111cf565b34156106f857600080fd5b6103786111db565b341561070b57600080fd5b610298600160a060020a03600435166111e1565b341561072a57600080fd5b610298600160a060020a03600435166112a1565b341561074957600080fd5b61037861141f565b341561075c57600080fd5b610378611424565b341561076f57600080fd5b61054961142a565b341561078257600080fd5b610378611439565b341561079557600080fd5b610378600160a060020a036004351661143d565b34156107b457600080fd5b61029861144f565b34156107c757600080fd5b6102986114bf565b610378600160a060020a036004351661083e565b34156107ee57600080fd5b610298600160a060020a036004351661153a565b341561080d57600080fd5b610298600435611567565b341561082357600080fd5b6103786115c0565b341561083657600080fd5b6105496115c7565b600061084c826007546115d6565b90505b919050565b600061085f33610a81565b151560011461086d57600080fd5b60055460ff161515610881575060006108bb565b6005805460ff191690557fbcbdbf400d5c713d9679ffa947f717848591ab5a7d1608c49119db603c4942cb60405160405180910390a15060015b90565b60006108c933610a81565b15156001146108d757600080fd5b6127108211156108e657600080fd5b60078290557f04a7ca0e55f887a637b560614f621b92b79423e20152fea70bc4be66edaee3d68260405190815260200160405180910390a1506001919050565b600061093133610a81565b151560011461093f57600080fd5b6000821161094c57600080fd5b60068290557fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab8260405190815260200160405180910390a1506001919050565b60408051908101604052600e81527f426c757a656c6c6520546f6b656e000000000000000000000000000000000000602082015281565b60106020526000908152604090205481565b60006109e033610a81565b15156001146109ee57600080fd5b600154600160a060020a03161515610a08575060016108bb565b60018054600160a060020a03191690557f670699162ea7ba4de638b5a57c2148aed9ee8bd69740a5e6a7db727e3886c88b60405160405180910390a150600190565b60408051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015281565b600054600160a060020a0390811691161490565b635a73c62081565b60045481565b6000610aae33610a81565b1515600114610abc57600080fd5b60008211610ac957600080fd5b81600f541415610adb5750600061084f565b600f8290557fbd102993c090f400138a05c1b5b0c9eadb8d94399c432f6522fab9cf26bd180b8260405190815260200160405180910390a1506001919050565b6000806000610b2933610a81565b1515600114610b3757600080fd5b600c54600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b9057600080fd5b6102c65a03f11515610ba157600080fd5b5050506040518051925050811515610bbc5760009250610cf2565b600c54600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610c0457600080fd5b6102c65a03f11515610c1557600080fd5b5050506040518051915050600160a060020a0381161515610c3557600080fd5b600c54600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c9457600080fd5b6102c65a03f11515610ca557600080fd5b505050604051805190501515610cba57600080fd5b7fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8260405190815260200160405180910390a1600192505b505090565b600081565b6000610d0733610a81565b1515600114610d1557600080fd5b60015474010000000000000000000000000000000000000000900460ff1615610d3d57600080fd5b6001805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b600080610db0336110ea565b1515610dbb57600080fd5b6000845111610dc957600080fd5b5060005b8351811015610e0857610df5848281518110610de557fe5b90602001906020020151846116ec565b1515610e0057600080fd5b600101610dcd565b5060019392505050565b600a5481565b69039992648a23c8a0000081565b601281565b600f5481565b600d5481565b635a5fffa081565b6000610e4a33610a81565b1515600114610e5857600080fd5b60008311610e6557600080fd5b828211610e7157600080fd5b600383905560048290557f7291acdf619347e3dd338a8b65d1788570a0f1bc413e94e9e7333d0561c6ed58838360405191825260208201526040908101905180910390a15060015b92915050565b600b54600160a060020a031681565b60055460ff1681565b6000610ee233610a81565b1515600114610ef057600080fd5b600054600160a060020a0383811691161415610f0b57600080fd5b30600160a060020a031682600160a060020a031614151515610f2c57600080fd5b60028054600160a060020a031916600160a060020a038481169190911791829055167f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650860405160405180910390a2506001919050565b6b019d971e4fe8401e7400000081565b60075481565b60035481565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b60085481565b60126020526000908152604090205481565b60065481565b6000610ff1336110ea565b1515610ffc57600080fd5b61100683836116ec565b9392505050565b600061101833610a81565b151560011461102657600080fd5b600160a060020a038216151561103b57600080fd5b30600160a060020a031682600160a060020a03161415151561105c57600080fd5b600c54600160a060020a038381169116141561107757600080fd5b611080826110ea565b1561108a57600080fd5b600b8054600160a060020a031916600160a060020a0384161790557f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d82604051600160a060020a03909116815260200160405180910390a1506001919050565b60006110f582610a81565b8061084c575061084c8261153a565b600061110f33610a81565b151560011461111d57600080fd5b6000831161112a57600080fd5b61271082111561113957600080fd5b60008381526010602052604090205482141561115757506000610eb9565b600083815260106020526040908190208390557f1744d5a5c185d64a1877cf5e5950b2e4043b955c9923252820fb9cf6ad2b257590849084905191825260208201526040908101905180910390a150600192915050565b60015474010000000000000000000000000000000000000000900460ff1681565b67016345785d8a000081565b60095481565b60006111ec33610a81565b15156001146111fa57600080fd5b600160a060020a038216151561120f57600080fd5b30600160a060020a031682600160a060020a03161415151561123057600080fd5b600054600160a060020a038381169116141561124b57600080fd5b60018054600160a060020a031916600160a060020a038481169190911791829055167f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b60006112ac33610a81565b15156001146112ba57600080fd5b600c54600160a060020a0316156112d057600080fd5b600160a060020a03821615156112e557600080fd5b30600160a060020a031682600160a060020a03161415151561130657600080fd5b600b54600160a060020a038381169116141561132157600080fd5b61132a826110ea565b1561133457600080fd5b600c8054600160a060020a031916600160a060020a0384169081179091556113d5906004906113c990600390829063313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561139e57600080fd5b6102c65a03f115156113af57600080fd5b50505060405180516012915060ff1663ffffffff61179816565b9063ffffffff6117ad16565b600a90810a90819055600090116113eb57600080fd5b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a1506001919050565b600181565b600e5481565b600154600160a060020a031681565b4290565b60116020526000908152604090205481565b600061145a33610a81565b151560011461146857600080fd5b60055460ff16151560011415611480575060006108bb565b6005805460ff191660011790557fe14916b4c867f32e91547d295f9b845b805d5b8c813daa3adbc1597f80a0c5eb60405160405180910390a150600190565b60015460009033600160a060020a039081169116146114dd57600080fd5b60008054600160a060020a03338116600160a060020a0319928316179283905560018054909216909155167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b600254600090600160a060020a03161580159061084c575050600254600160a060020a0390811691161490565b600061157233610a81565b151560011461158057600080fd5b60088290557f2de896f66f29831ace4b07f5658ac41de20910c13ce8b8db17bc102a80beff268260405190815260200160405180910390a1506001919050565b6219f0a081565b600c54600160a060020a031681565b600160a060020a03331660009081526012602052604081205481908190819081901161160157600080fd5b600160a060020a0386166000908152601260205260408120541161162457600080fd5b600160a060020a033316600090815260126020526040902054600f54101561164b57600080fd5b600160a060020a038616600090815260126020526040902054600f549093508390101561167757600080fd5b6000838152601060205260409020549150811515611693578491505b61169d86836117bf565b600160a060020a0387166000908152601160205260409020549091506116c9908263ffffffff6117ad16565b600160a060020a0387166000908152601160205260409020559250505092915050565b6000600160a060020a038316151561170357600080fd5b30600160a060020a031683600160a060020a03161415151561172457600080fd5b600b54600160a060020a038481169116141561173f57600080fd5b600160a060020a038316600081815260126020526040908190208490557f5beb3f610f1d5275b6ce198b03b5f6ebdeee3f94c2ed7c2941109390a303cd0f9084905190815260200160405180910390a250600192915050565b6000818310156117a757600080fd5b50900390565b60008282018381101561100657600080fd5b6000806000806000806000806000600160149054906101000a900460ff161515156117e957600080fd5b60055460ff16156117f957600080fd5b600354611804611439565b101561180f57600080fd5b60045461181a611439565b111561182557600080fd5b60095434101561183457600080fd5b600160a060020a038b16151561184957600080fd5b30600160a060020a03168b600160a060020a03161415151561186a57600080fd5b600c54600160a060020a038c81169116141561188557600080fd5b600b5433600160a060020a03908116911614156118a157600080fd5b600c54600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156118fa57600080fd5b6102c65a03f1151561190b57600080fd5b50505060405180519850506000881161192357600080fd5b600a5461196b9061195f61193f8d61271063ffffffff6117ad16565b60065461195390349063ffffffff611bd516565b9063ffffffff611bd516565b9063ffffffff611bfc16565b96506000871161197a57600080fd5b34955060009450879350600060085411156119ca576119988b611c11565b60085490935083106119a957600080fd5b6008546119bc908463ffffffff61179816565b9150878210156119ca578193505b600084116119d757600080fd5b83871115611a3c579295508592611a1f611a0b6119fc8c61271063ffffffff6117ad16565b6006549063ffffffff611bd516565b600a5461195f908a9063ffffffff611bd516565b955085341115611a3c57611a39348763ffffffff61179816565b94505b611a4c348663ffffffff61179816565b600b54909150600160a060020a031681156108fc0282604051600060405180830381858888f193505050501515611a8257600080fd5b600d54611a95908863ffffffff6117ad16565b600d55600e54611aab908263ffffffff6117ad16565b600e55600c54600160a060020a031663a9059cbb8c8960006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611b0d57600080fd5b6102c65a03f11515611b1e57600080fd5b505050604051805190501515611b3357600080fd5b6000851115611b6d57600160a060020a03331685156108fc0286604051600060405180830381858888f193505050501515611b6d57600080fd5b7f8fafebcaf9d154343dad25669bfa277f4fbacd7ac6b0c4fed522580e040a0f338b87896040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150949998505050505050505050565b6000828202831580611bf15750828482811515611bee57fe5b04145b151561100657600080fd5b60008183811515611c0957fe5b049392505050565b600160a060020a0316600090815260116020526040902054905600a165627a7a72305820c8dbbe176deeed0a10c085b277755263dd5fa9e252d70dd1a0720fb7a5a0784d0029

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

000000000000000000000000e9638c2d07eac8774d46b85e47cf53f52d60239f

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e9638c2d07eac8774d46b85e47cf53f52d60239f


Swarm Source

bzzr://c8dbbe176deeed0a10c085b277755263dd5fa9e252d70dd1a0720fb7a5a0784d

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.