ETH Price: $2,476.95 (-19.98%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
End Sale66151432018-10-31 3:13:142287 days ago1540955594IN
0x4DC9268e...2FeB77285
0 ETH0.0005222115
Transfer66109222018-10-30 10:30:062287 days ago1540895406IN
0x4DC9268e...2FeB77285
25.21843202 ETH0.0057671460
Transfer66105572018-10-30 9:07:352287 days ago1540890455IN
0x4DC9268e...2FeB77285
2 ETH0.0045558741
Transfer66099302018-10-30 6:36:232287 days ago1540881383IN
0x4DC9268e...2FeB77285
10.985039 ETH0.0045558741
Transfer66097912018-10-30 6:06:242287 days ago1540879584IN
0x4DC9268e...2FeB77285
4.01 ETH0.0052727365
Transfer66097522018-10-30 5:57:542287 days ago1540879074IN
0x4DC9268e...2FeB77285
10 ETH0.0048059550
Transfer66091942018-10-30 3:45:572288 days ago1540871157IN
0x4DC9268e...2FeB77285
4.57417333 ETH0.0077783370
Transfer66088362018-10-30 2:21:292288 days ago1540866089IN
0x4DC9268e...2FeB77285
4.59263555 ETH0.0020392141
Add Many To Whit...66085922018-10-30 1:20:022288 days ago1540862402IN
0x4DC9268e...2FeB77285
0 ETH0.0020123430
Transfer66048192018-10-29 10:39:502288 days ago1540809590IN
0x4DC9268e...2FeB77285
1 ETH0.0014601418
Transfer66042182018-10-29 8:16:302288 days ago1540800990IN
0x4DC9268e...2FeB77285
11.5 ETH0.0048671460
Transfer66032752018-10-29 4:26:332289 days ago1540787193IN
0x4DC9268e...2FeB77285
4 ETH0.0066671460
Add Many To Whit...66031372018-10-29 3:54:272289 days ago1540785267IN
0x4DC9268e...2FeB77285
0 ETH0.0054815341
Transfer65962392018-10-28 0:49:282290 days ago1540687768IN
0x4DC9268e...2FeB77285
3.5 ETH0.0033258741
Transfer65892652018-10-26 21:30:152291 days ago1540589415IN
0x4DC9268e...2FeB77285
2.8 ETH0.0045558741
Transfer65890812018-10-26 20:46:542291 days ago1540586814IN
0x4DC9268e...2FeB77285
2.8 ETH0.00086141
Transfer65869522018-10-26 12:26:362291 days ago1540556796IN
0x4DC9268e...2FeB77285
1 ETH0.0066671460
Transfer65869232018-10-26 12:19:442291 days ago1540556384IN
0x4DC9268e...2FeB77285
1 ETH0.00086141
Transfer65868182018-10-26 11:52:332291 days ago1540554753IN
0x4DC9268e...2FeB77285
0.55450959 ETH0.000888958
Transfer65862392018-10-26 9:31:412291 days ago1540546301IN
0x4DC9268e...2FeB77285
4 ETH0.001000079
Transfer65841102018-10-26 1:09:582292 days ago1540516198IN
0x4DC9268e...2FeB77285
1 ETH0.0030002127
Transfer65810602018-10-25 13:17:252292 days ago1540473445IN
0x4DC9268e...2FeB77285
1.04 ETH0.0057671460
Transfer65809692018-10-25 12:56:532292 days ago1540472213IN
0x4DC9268e...2FeB77285
29 ETH0.0048671460
Add Many To Whit...65807532018-10-25 12:08:282292 days ago1540469308IN
0x4DC9268e...2FeB77285
0 ETH0.0027501941
Transfer65794172018-10-25 6:47:562292 days ago1540450076IN
0x4DC9268e...2FeB77285
1 ETH0.0066671460
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
66109222018-10-30 10:30:062287 days ago1540895406
0x4DC9268e...2FeB77285
25.21843202 ETH
66105572018-10-30 9:07:352287 days ago1540890455
0x4DC9268e...2FeB77285
2 ETH
66099302018-10-30 6:36:232287 days ago1540881383
0x4DC9268e...2FeB77285
10.985039 ETH
66097912018-10-30 6:06:242287 days ago1540879584
0x4DC9268e...2FeB77285
4.01 ETH
66097522018-10-30 5:57:542287 days ago1540879074
0x4DC9268e...2FeB77285
10 ETH
66091942018-10-30 3:45:572288 days ago1540871157
0x4DC9268e...2FeB77285
4.57417333 ETH
66048192018-10-29 10:39:502288 days ago1540809590
0x4DC9268e...2FeB77285
1 ETH
66042182018-10-29 8:16:302288 days ago1540800990
0x4DC9268e...2FeB77285
11.5 ETH
66032752018-10-29 4:26:332289 days ago1540787193
0x4DC9268e...2FeB77285
4 ETH
65962392018-10-28 0:49:282290 days ago1540687768
0x4DC9268e...2FeB77285
3.5 ETH
65892652018-10-26 21:30:152291 days ago1540589415
0x4DC9268e...2FeB77285
2.8 ETH
65869522018-10-26 12:26:362291 days ago1540556796
0x4DC9268e...2FeB77285
1 ETH
65868182018-10-26 11:52:332291 days ago1540554753
0x4DC9268e...2FeB77285
0.55450959 ETH
65862392018-10-26 9:31:412291 days ago1540546301
0x4DC9268e...2FeB77285
4 ETH
65841102018-10-26 1:09:582292 days ago1540516198
0x4DC9268e...2FeB77285
1 ETH
65810602018-10-25 13:17:252292 days ago1540473445
0x4DC9268e...2FeB77285
1.04 ETH
65809692018-10-25 12:56:532292 days ago1540472213
0x4DC9268e...2FeB77285
29 ETH
65794172018-10-25 6:47:562292 days ago1540450076
0x4DC9268e...2FeB77285
1 ETH
65739212018-10-24 9:21:542293 days ago1540372914
0x4DC9268e...2FeB77285
0.479 ETH
65737452018-10-24 8:37:272293 days ago1540370247
0x4DC9268e...2FeB77285
1.6 ETH
65723832018-10-24 3:16:522294 days ago1540351012
0x4DC9268e...2FeB77285
4 ETH
65720592018-10-24 2:03:052294 days ago1540346585
0x4DC9268e...2FeB77285
20 ETH
65719772018-10-24 1:44:422294 days ago1540345482
0x4DC9268e...2FeB77285
8 ETH
65717302018-10-24 0:45:152294 days ago1540341915
0x4DC9268e...2FeB77285
1.5 ETH
65702872018-10-23 19:06:142294 days ago1540321574
0x4DC9268e...2FeB77285
0.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CloudbricSale

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-21
*/

pragma solidity ^0.4.18;

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


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


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

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

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

}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
  }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}

/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is BasicToken {

  event Burn(address indexed burner, uint256 value);

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value) public {
    require(_value <= balances[msg.sender]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    address burner = msg.sender;
    balances[burner] = balances[burner].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    Burn(burner, _value);
    Transfer(burner, address(0), _value);
  }
}


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

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


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract Cloudbric is StandardToken, BurnableToken, Ownable {
    using SafeMath for uint256;

    string public constant symbol = "CLB";
    string public constant name = "Cloudbric";
    uint8 public constant decimals = 18;
    uint256 public constant INITIAL_SUPPLY = 1000000000 * (10 ** uint256(decimals));
    uint256 public constant TOKEN_SALE_ALLOWANCE = 540000000 * (10 ** uint256(decimals));
    uint256 public constant ADMIN_ALLOWANCE = INITIAL_SUPPLY - TOKEN_SALE_ALLOWANCE;

    // Address of token administrator
    address public adminAddr;

    // Address of token sale contract
    address public tokenSaleAddr;

    // Enable transfer after token sale is completed
    bool public transferEnabled = false;

    // Accounts to be locked for certain period
    mapping(address => uint256) private lockedAccounts;

    /*
     *
     * Permissions when transferEnabled is false :
     *              ContractOwner    Admin    SaleContract    Others
     * transfer            x           v            v           x
     * transferFrom        x           v            v           x
     *
     * Permissions when transferEnabled is true :
     *              ContractOwner    Admin    SaleContract    Others
     * transfer            v           v            v           v
     * transferFrom        v           v            v           v
     *
     */

    /*
     * Check if token transfer is allowed
     * Permission table above is result of this modifier
     */
    modifier onlyWhenTransferAllowed() {
        require(transferEnabled == true
            || msg.sender == adminAddr
            || msg.sender == tokenSaleAddr);
        _;
    }

    /*
     * Check if token sale address is not set
     */
    modifier onlyWhenTokenSaleAddrNotSet() {
        require(tokenSaleAddr == address(0x0));
        _;
    }

    /*
     * Check if token transfer destination is valid
     */
    modifier onlyValidDestination(address to) {
        require(to != address(0x0)
            && to != address(this)
            && to != owner
            && to != adminAddr
            && to != tokenSaleAddr);
        _;
    }

    modifier onlyAllowedAmount(address from, uint256 amount) {
        require(balances[from].sub(amount) >= lockedAccounts[from]);
        _;
    }
    /*
     * The constructor of Cloudbric contract
     *
     * @param _adminAddr: Address of token administrator
     */
    function Cloudbric(address _adminAddr) public {
        totalSupply_ = INITIAL_SUPPLY;

        balances[msg.sender] = totalSupply_;
        Transfer(address(0x0), msg.sender, totalSupply_);

        adminAddr = _adminAddr;
        approve(adminAddr, ADMIN_ALLOWANCE);
    }

    /*
     * Set amount of token sale to approve allowance for sale contract
     *
     * @param _tokenSaleAddr: Address of sale contract
     * @param _amountForSale: Amount of token for sale
     */
    function setTokenSaleAmount(address _tokenSaleAddr, uint256 amountForSale)
        external
        onlyOwner
        onlyWhenTokenSaleAddrNotSet
    {
        require(!transferEnabled);

        uint256 amount = (amountForSale == 0) ? TOKEN_SALE_ALLOWANCE : amountForSale;
        require(amount <= TOKEN_SALE_ALLOWANCE);

        approve(_tokenSaleAddr, amount);
        tokenSaleAddr = _tokenSaleAddr;
    }

    /*
     * Set transferEnabled variable to true
     */
    function enableTransfer() external onlyOwner {
        transferEnabled = true;
        approve(tokenSaleAddr, 0);
    }

    /*
     * Set transferEnabled variable to false
     */
    function disableTransfer() external onlyOwner {
        transferEnabled = false;
    }

    /*
     * Transfer token from message sender to another
     *
     * @param to: Destination address
     * @param value: Amount of AMO token to transfer
     */
    function transfer(address to, uint256 value)
        public
        onlyWhenTransferAllowed
        onlyValidDestination(to)
        onlyAllowedAmount(msg.sender, value)
        returns (bool)
    {
        return super.transfer(to, value);
    }

    /*
     * Transfer token from 'from' address to 'to' addreess
     *
     * @param from: Origin address
     * @param to: Destination address
     * @param value: Amount of tokens to transfer
     */
    function transferFrom(address from, address to, uint256 value)
        public
        onlyWhenTransferAllowed
        onlyValidDestination(to)
        onlyAllowedAmount(from, value)
        returns (bool)
    {
        return super.transferFrom(from, to, value);
    }

    /*
     * Burn token, only owner is allowed
     *
     * @param value: Amount of tokens to burn
     */
    function burn(uint256 value) public onlyOwner {
        require(transferEnabled);
        super.burn(value);
    }

    /*
     * Disable transfering tokens more than allowed amount from certain account
     *
     * @param addr: Account to set allowed amount
     * @param amount: Amount of tokens to allow
     */
    function lockAccount(address addr, uint256 amount)
        external
        onlyOwner
        onlyValidDestination(addr)
    {
        require(amount > 0);
        lockedAccounts[addr] = amount;
    }

    /*
     * Enable transfering tokens of locked account
     *
     * @param addr: Account to unlock
     */

    function unlockAccount(address addr)
        external
        onlyOwner
        onlyValidDestination(addr)
    {
        lockedAccounts[addr] = 0;
    }
}

contract CloudbricSale is Pausable {
    using SafeMath for uint256;

    // Start time of sale
    uint256 public startTime;
    // End time of sale
    uint256 public endTime;
    // Address to collect fund
    address private fundAddr;
    // Token contract instance
    Cloudbric public token;
    // Amount of raised in Wei (1 ether)
    uint256 public totalWeiRaised;
    // Base hard cap for each round in ether
    uint256 public constant BASE_HARD_CAP_PER_ROUND = 20000 * 1 ether;

    uint256 public constant UINT256_MAX = ~uint256(0);
    // Base CLB to Ether rate
    uint256 public constant BASE_CLB_TO_ETH_RATE = 10000;
    // Base minimum contribution
    uint256 public constant BASE_MIN_CONTRIBUTION = 0.1 * 1 ether;
    // Whitelisted addresses
    mapping(address => bool) public whitelist;
    // Whitelisted users' contributions per round
    mapping(address => mapping(uint8 => uint256)) public contPerRound;

    // For each round, there are three stages.
    enum Stages {
        SetUp,
        Started,
        Ended
    }
    // The current stage of the sale
    Stages public stage;

    // There are three rounds in sale
    enum SaleRounds {
        EarlyInvestment,
        PreSale1,
        PreSale2,
        CrowdSale
    }
    // The current round of the sale
    SaleRounds public round;

    // Each round has different inforamation
    struct RoundInfo {
        uint256 minContribution;
        uint256 maxContribution;
        uint256 hardCap;
        uint256 rate;
        uint256 weiRaised;
    }

    // SaleRounds(key) : RoundInfo(value) map
    // Since solidity does not support enum as key of map, converted enum to uint8
    mapping(uint8 => RoundInfo) public roundInfos;

    struct AllocationInfo {
        bool isAllowed;
        uint256 allowedAmount;
    }

    // List of users who will be allocated tokens and their allowed amount
    mapping(address => AllocationInfo) private allocationList;

    /*
     * Event for sale start logging
     *
     * @param startTime: Start date of sale
     * @param endTime: End date of sale
     * @param round: Round of sale started
     */
    event SaleStarted(uint256 startTime, uint256 endTime, SaleRounds round);

    /*
     * Event for sale end logging
     *
     * @param endTime: End date of sale
     * @param totalWeiRaised: Total amount of raised in Wei after sale ended
     * @param round: Round of sale ended
     */
    event SaleEnded(uint256 endTime, uint256 totalWeiRaised, SaleRounds round);

    /*
     * Event for token purchase
     *
     * @param purchaser: Who paid for the tokens
     * @param value: Amount in Wei paid for purchase
     * @param amount: Amount of tokens purchased
     */
    event TokenPurchase(address indexed purchaser, uint256 value, uint256 amount);

    /*
     * Modifier to check current stage is same as expected stage
     *
     * @param expectedStage: Expected current stage
     */
    modifier atStage(Stages expectedStage) {
        require(stage == expectedStage);
        _;
    }

    /*
     * Modifier to check current round is sane as expected round
     *
     * @param expectedRound: Expected current round
     */
    modifier atRound(SaleRounds expectedRound) {
        require(round == expectedRound);
        _;
    }

    /*
     * Modifier to check purchase is valid
     *
     * 1. Current round must be smaller than CrowdSale
     * 2. Current time must be within sale period
     * 3. Purchaser must be enrolled to whitelist
     * 4. Purchaser address must be correct
     * 5. Contribution must be bigger than minimum contribution for current round
     * 6. Sum of contributions must be smaller than max contribution for current round
     * 7. Total funds raised in current round must be smaller than hard cap for current round
     */
    modifier onlyValidPurchase() {
        require(round <= SaleRounds.CrowdSale);
        require(now >= startTime && now <= endTime);

        uint256 contributionInWei = msg.value;
        address purchaser = msg.sender;

        require(whitelist[purchaser]);
        require(purchaser != address(0));
        require(contributionInWei >= roundInfos[uint8(round)].minContribution);
        require(
            contPerRound[purchaser][uint8(round)].add(contributionInWei)
            <= roundInfos[uint8(round)].maxContribution
        );
        require(
            roundInfos[uint8(round)].weiRaised.add(contributionInWei)
            <= roundInfos[uint8(round)].hardCap
        );
        _;
    }

    /*
     * Constructor for CloudbricSale contract
     *
     * @param fundAddress: Address where funds are collected
     * @param tokenAddress: Address of Cloudbric Token Contract
     */
    function CloudbricSale(
        address fundAddress,
        address tokenAddress
    )
        public
    {
        require(fundAddress != address(0));
        require(tokenAddress != address(0));

        token = Cloudbric(tokenAddress);
        fundAddr = fundAddress;
        stage = Stages.Ended;
        round = SaleRounds.EarlyInvestment;
        uint8 roundIndex = uint8(round);

        roundInfos[roundIndex].minContribution = BASE_MIN_CONTRIBUTION;
        roundInfos[roundIndex].maxContribution = UINT256_MAX;
        roundInfos[roundIndex].hardCap = BASE_HARD_CAP_PER_ROUND;
        roundInfos[roundIndex].weiRaised = 0;
        roundInfos[roundIndex].rate = BASE_CLB_TO_ETH_RATE;
    }

    /*
     * Fallback function to buy Cloudbric tokens
     */
    function () public payable {
        buy();
    }

    /*
     * Withdraw ethers to fund address
     */
    function withdraw() external onlyOwner {
        fundAddr.transfer(this.balance);
    }

    /*
     * Add users to whitelist
     * Whitelisted users are accumulated on each round
     *
     * @param users: Addresses of users who passed KYC
     */
    function addManyToWhitelist(address[] users) external onlyOwner {
        for (uint32 i = 0; i < users.length; i++) {
            addToWhitelist(users[i]);
        }
    }

    /*
     * Add one user to whitelist
     *
     * @param user: Address of user who passed KYC
     */
    function addToWhitelist(address user) public onlyOwner {
        whitelist[user] = true;
    }

    /*
     * Remove users from whitelist
     *
     * @param users: Addresses of users who should not belong to whitelist
     */
    function removeManyFromWhitelist(address[] users) external onlyOwner {
        for (uint32 i = 0; i < users.length; i++) {
            removeFromWhitelist(users[i]);
        }
    }

    /*
     * Remove users from whitelist
     *
     * @param users: Addresses of users who should not belong to whitelist
     */
    function removeFromWhitelist(address user) public onlyOwner {
        whitelist[user] = false;
    }

    /*
     * Set minimum contribution for round
     * User have to send more ether than minimum contribution
     *
     * @param _round: Round to set
     * @param _minContribution: Minimum contribution in wei
     */
    function setMinContributionForRound(
        SaleRounds _round,
        uint256 _minContribution
    )
        public
        onlyOwner
        atStage(Stages.SetUp)
    {
        require(round <= _round);
        roundInfos[uint8(_round)].minContribution =
            (_minContribution == 0) ? BASE_MIN_CONTRIBUTION : _minContribution;
    }

    /*
     * Set max contribution for round
     * User can't send more ether than the max contributions in round
     *
     * @param _round: Round to set
     * @param _maxContribution: Max contribution in wei
     */
    function setMaxContributionForRound(
        SaleRounds _round,
        uint256 _maxContribution
    )
        public
        onlyOwner
        atStage(Stages.SetUp)
    {
        require(round <= _round);
        roundInfos[uint8(_round)].maxContribution =
            (_maxContribution == 0) ? UINT256_MAX : _maxContribution;
    }

    /*
     * Set hard cap for round
     * Total wei raised in round should be smaller than hard cap
     *
     * @param _round: Round to set
     * @param _hardCap: Hard cap in wei
     */
    function setHardCapForRound(
        SaleRounds _round,
        uint256 _hardCap
    )
        public
        onlyOwner
        atStage(Stages.SetUp)
    {
        require(round <= _round);
        roundInfos[uint8(_round)].hardCap =
            (_hardCap == 0) ? BASE_HARD_CAP_PER_ROUND : _hardCap;
    }

    /*
     * Set CLB to Ether rate for round
     *
     * @param _round: Round to set
     * @param _rate: CLB to Ether rate
     */
    function setRateForRound(
        SaleRounds _round,
        uint256 _rate
    )
        public
        onlyOwner
        atStage(Stages.SetUp)
    {
        require(round <= _round);
        roundInfos[uint8(_round)].rate =
            (_rate == 0) ? BASE_CLB_TO_ETH_RATE : _rate;
    }

    /*
     * Set up several information for next round
     * Only owner can call this method
     */
    function setUpSale(
        SaleRounds _round,
        uint256 _minContribution,
        uint256 _maxContribution,
        uint256 _hardCap,
        uint256 _rate
    )
        external
        onlyOwner
        atStage(Stages.Ended)
    {
        require(round <= _round);
        stage = Stages.SetUp;
        round = _round;
        setMinContributionForRound(_round, _minContribution);
        setMaxContributionForRound(_round, _maxContribution);
        setHardCapForRound(_round, _hardCap);
        setRateForRound(_round, _rate);
    }

    /*
     * Start sale in current round
     */
    function startSale(uint256 durationInSeconds)
        external
        onlyOwner
        atStage(Stages.SetUp)
    {
        require(roundInfos[uint8(round)].minContribution > 0
            && roundInfos[uint8(round)].hardCap > 0);
        stage = Stages.Started;
        startTime = now;
        endTime = startTime.add(durationInSeconds);
        SaleStarted(startTime, endTime, round);
    }

    /*
     * End sale in crrent round
     */
    function endSale() external onlyOwner atStage(Stages.Started) {
        endTime = now;
        stage = Stages.Ended;

        SaleEnded(endTime, totalWeiRaised, round);
    }

    function buy()
        public
        payable
        whenNotPaused
        atStage(Stages.Started)
        onlyValidPurchase()
        returns (bool)
    {
        address purchaser = msg.sender;
        uint256 contributionInWei = msg.value;
        uint256 tokenAmount = contributionInWei.mul(roundInfos[uint8(round)].rate);

        if (!token.transferFrom(token.owner(), purchaser, tokenAmount)) {
            revert();
        }

        totalWeiRaised = totalWeiRaised.add(contributionInWei);
        roundInfos[uint8(round)].weiRaised =
            roundInfos[uint8(round)].weiRaised.add(contributionInWei);

        contPerRound[purchaser][uint8(round)] =
            contPerRound[purchaser][uint8(round)].add(contributionInWei);

        // Transfer contributions to fund address
        fundAddr.transfer(contributionInWei);
        TokenPurchase(msg.sender, contributionInWei, tokenAmount);

        return true;
    }

    /*
     * Add user and his allowed amount to allocation list
     *
     * @param user: Address of user to be allocated tokens
     * @param amount: Allowed allocation amount of user
     */
    function addToAllocationList(address user, uint256 amount)
        public
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
    {
        allocationList[user].isAllowed = true;
        allocationList[user].allowedAmount = amount;
    }

    /*
     * Add users and their allowed amount to allocation list
     *
     * @param users: List of Address to be allocated tokens
     * @param amount: List of allowed allocation amount of each user
     */
    function addManyToAllocationList(address[] users, uint256[] amounts)
        external
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
    {
        require(users.length == amounts.length);

        for (uint32 i = 0; i < users.length; i++) {
            addToAllocationList(users[i], amounts[i]);
        }
    }

    /*
     * Remove user from allocation list
     *
     * @param user: Address of user to be removed
     */
    function removeFromAllocationList(address user)
        public
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
    {
        allocationList[user].isAllowed = false;
    }

    /*
     * Remove users from allocation list
     *
     * @param user: Address list of users to be removed
     */
    function removeManyFromAllocationList(address[] users)
        external
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
    {
        for (uint32 i = 0; i < users.length; i++) {
            removeFromAllocationList(users[i]);
        }
    }


    /*
     * Allocate  tokens to user
     * Only avaliable on early investment
     *
     * @param to: Address of user to be allocated tokens
     * @param tokenAmount: Amount of tokens to be allocated
     */
    function allocateTokens(address to, uint256 tokenAmount)
        public
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
        returns (bool)
    {
        require(allocationList[to].isAllowed
            && tokenAmount <= allocationList[to].allowedAmount);

        if (!token.transferFrom(token.owner(), to, tokenAmount)) {
            revert();
        }
        return true;
    }

    /*
     * Allocate  tokens to user
     * Only avaliable on early investment
     *
     * @param toList: List of addresses to be allocated tokens
     * @param tokenAmountList: List of token amount to be allocated to each address
     */
    function allocateTokensToMany(address[] toList, uint256[] tokenAmountList)
        external
        onlyOwner
        atRound(SaleRounds.EarlyInvestment)
        returns (bool)
    {
        require(toList.length == tokenAmountList.length);

        for (uint32 i = 0; i < toList.length; i++) {
            allocateTokens(toList[i], tokenAmountList[i]);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"BASE_MIN_CONTRIBUTION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_round","type":"uint8"},{"name":"_maxContribution","type":"uint256"}],"name":"setMaxContributionForRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"durationInSeconds","type":"uint256"}],"name":"startSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"removeFromAllocationList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"round","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_round","type":"uint8"},{"name":"_rate","type":"uint256"}],"name":"setRateForRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"users","type":"address[]"}],"name":"removeManyFromAllocationList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_round","type":"uint8"},{"name":"_hardCap","type":"uint256"}],"name":"setHardCapForRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalWeiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"roundInfos","outputs":[{"name":"minContribution","type":"uint256"},{"name":"maxContribution","type":"uint256"},{"name":"hardCap","type":"uint256"},{"name":"rate","type":"uint256"},{"name":"weiRaised","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"toList","type":"address[]"},{"name":"tokenAmountList","type":"uint256[]"}],"name":"allocateTokensToMany","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"users","type":"address[]"},{"name":"amounts","type":"uint256[]"}],"name":"addManyToAllocationList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_round","type":"uint8"},{"name":"_minContribution","type":"uint256"},{"name":"_maxContribution","type":"uint256"},{"name":"_hardCap","type":"uint256"},{"name":"_rate","type":"uint256"}],"name":"setUpSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenAmount","type":"uint256"}],"name":"allocateTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"removeFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"users","type":"address[]"}],"name":"addManyToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"amount","type":"uint256"}],"name":"addToAllocationList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BASE_HARD_CAP_PER_ROUND","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UINT256_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_round","type":"uint8"},{"name":"_minContribution","type":"uint256"}],"name":"setMinContributionForRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"addToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"users","type":"address[]"}],"name":"removeManyFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint8"}],"name":"contPerRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BASE_CLB_TO_ETH_RATE","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":"fundAddress","type":"address"},{"name":"tokenAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"startTime","type":"uint256"},{"indexed":false,"name":"endTime","type":"uint256"},{"indexed":false,"name":"round","type":"uint8"}],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"endTime","type":"uint256"},{"indexed":false,"name":"totalWeiRaised","type":"uint256"},{"indexed":false,"name":"round","type":"uint8"}],"name":"SaleEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405260008060146101000a81548160ff02191690831515021790555034156200002a57600080fd5b60405160408062002cbe833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515620000cf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156200010c57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600860006101000a81548160ff02191690836002811115620001ae57fe5b02179055506000600860016101000a81548160ff02191690836003811115620001d357fe5b0217905550600860019054906101000a900460ff166003811115620001f457fe5b905067016345785d8a0000600960008360ff1660ff16815260200190815260200160002060000181905550600019600960008360ff1660ff1681526020019081526020016000206001018190555069043c33c1937564800000600960008360ff1660ff168152602001908152602001600020600201819055506000600960008360ff1660ff16815260200190815260200160002060040181905550612710600960008360ff1660ff168152602001908152602001600020600301819055505050506129f980620002c56000396000f3006060604052600436106101cd576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304892c9f146101d85780630bee3800146102015780630e3ab61d14610230578063146091f114610253578063146ca5311461028c57806325a1bb47146102c35780632819598d146102f25780633197cbb614610320578063380d831b146103495780633ccfd60b1461035e5780633f4ba83a14610373578063497bf6811461038857806353f4db01146103b757806357738e8f146103e05780635885c626146104365780635b24f87d146104905780635c975abb146104d25780636e5a6d1b146104ff57806378e97925146105495780638456cb591461057257806386ce0285146105875780638ab1d681146105e15780638c10671c1461061a5780638da5cb5b146106485780639b19251a1461069d578063a6f2ae3a146106ee578063ad9ac1bc14610710578063c040e6b814610752578063ce14eeb814610789578063d0949f99146107b2578063e1ab36f0146107db578063e43252d71461080a578063f2fde38b14610843578063f674d7991461087c578063f9810ba5146108aa578063fbfbb62e14610903578063fc0c546a1461092c575b6101d5610981565b50005b34156101e357600080fd5b6101eb6110db565b6040518082815260200191505060405180910390f35b341561020c57600080fd5b61022e600480803560ff169060200190919080359060200190919050506110e7565b005b341561023b57600080fd5b61025160048080359060200190919050506111ed565b005b341561025e57600080fd5b61028a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113b6565b005b341561029757600080fd5b61029f6114a5565b604051808260038111156102af57fe5b60ff16815260200191505060405180910390f35b34156102ce57600080fd5b6102f0600480803560ff169060200190919080359060200190919050506114b8565b005b34156102fd57600080fd5b61031e600480803590602001908201803590602001919091929050506115be565b005b341561032b57600080fd5b6103336116b2565b6040518082815260200191505060405180910390f35b341561035457600080fd5b61035c6116b8565b005b341561036957600080fd5b6103716117de565b005b341561037e57600080fd5b6103866118b4565b005b341561039357600080fd5b6103b5600480803560ff16906020019091908035906020019091905050611972565b005b34156103c257600080fd5b6103ca611a80565b6040518082815260200191505060405180910390f35b34156103eb57600080fd5b610404600480803560ff16906020019091905050611a86565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561044157600080fd5b610476600480803590602001908201803590602001919091929080359060200190820180359060200191909192905050611abc565b604051808215151515815260200191505060405180910390f35b341561049b57600080fd5b6104d0600480803590602001908201803590602001919091929080359060200190820180359060200191909192905050611be9565b005b34156104dd57600080fd5b6104e5611d0e565b604051808215151515815260200191505060405180910390f35b341561050a57600080fd5b610547600480803560ff16906020019091908035906020019091908035906020019091908035906020019091908035906020019091905050611d21565b005b341561055457600080fd5b61055c611e5c565b6040518082815260200191505060405180910390f35b341561057d57600080fd5b610585611e62565b005b341561059257600080fd5b6105c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611f22565b604051808215151515815260200191505060405180910390f35b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612237565b005b341561062557600080fd5b610646600480803590602001908201803590602001919091929050506122ed565b005b341561065357600080fd5b61065b6123ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106a857600080fd5b6106d4600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506123d0565b604051808215151515815260200191505060405180910390f35b6106f6610981565b604051808215151515815260200191505060405180910390f35b341561071b57600080fd5b610750600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506123f0565b005b341561075d57600080fd5b610765612527565b6040518082600281111561077557fe5b60ff16815260200191505060405180910390f35b341561079457600080fd5b61079c61253a565b6040518082815260200191505060405180910390f35b34156107bd57600080fd5b6107c5612548565b6040518082815260200191505060405180910390f35b34156107e657600080fd5b610808600480803560ff1690602001909190803590602001909190505061254e565b005b341561081557600080fd5b610841600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061265a565b005b341561084e57600080fd5b61087a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612710565b005b341561088757600080fd5b6108a860048080359060200190820180359060200191909192905050612865565b005b34156108b557600080fd5b6108ed600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff16906020019091905050612923565b6040518082815260200191505060405180910390f35b341561090e57600080fd5b610916612948565b6040518082815260200191505060405180910390f35b341561093757600080fd5b61093f61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080600080600060149054906101000a900460ff161515156109a357600080fd5b60018060028111156109b157fe5b600860009054906101000a900460ff1660028111156109cc57fe5b1415156109d857600080fd5b6000806003808111156109e757fe5b600860019054906101000a900460ff166003811115610a0257fe5b11151515610a0f57600080fd5b6001544210158015610a2357506002544211155b1515610a2e57600080fd5b349150339050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610a8c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610ac857600080fd5b60096000600860019054906101000a900460ff166003811115610ae757fe5b60ff1660ff168152602001908152602001600020600001548210151515610b0d57600080fd5b60096000600860019054906101000a900460ff166003811115610b2c57fe5b60ff1660ff16815260200190815260200160002060010154610bc783600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610ba457fe5b60ff1660ff1681526020019081526020016000205461297490919063ffffffff16565b11151515610bd457600080fd5b60096000600860019054906101000a900460ff166003811115610bf357fe5b60ff1660ff16815260200190815260200160002060020154610c548360096000600860019054906101000a900460ff166003811115610c2e57fe5b60ff1660ff1681526020019081526020016000206004015461297490919063ffffffff16565b11151515610c6157600080fd5b339550349450610cb060096000600860019054906101000a900460ff166003811115610c8957fe5b60ff1660ff168152602001908152602001600020600301548661299290919063ffffffff16565b9350600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d7e57600080fd5b6102c65a03f11515610d8f57600080fd5b5050506040518051905088876000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610e5b57600080fd5b6102c65a03f11515610e6c57600080fd5b505050604051805190501515610e8157600080fd5b610e968560055461297490919063ffffffff16565b600581905550610ee58560096000600860019054906101000a900460ff166003811115610ebf57fe5b60ff1660ff1681526020019081526020016000206004015461297490919063ffffffff16565b60096000600860019054906101000a900460ff166003811115610f0457fe5b60ff1660ff16815260200190815260200160002060040181905550610fa285600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610f7f57fe5b60ff1660ff1681526020019081526020016000205461297490919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610ffe57fe5b60ff1660ff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561107857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8686604051808381526020018281526020019250505060405180910390a26001965050505050505090565b67016345785d8a000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114257600080fd5b600080600281111561115057fe5b600860009054906101000a900460ff16600281111561116b57fe5b14151561117757600080fd5b82600381111561118357fe5b600860019054906101000a900460ff16600381111561119e57fe5b111515156111ab57600080fd5b600082146111b957816111bd565b6000195b600960008560038111156111cd57fe5b60ff1660ff16815260200190815260200160002060010181905550505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124857600080fd5b600080600281111561125657fe5b600860009054906101000a900460ff16600281111561127157fe5b14151561127d57600080fd5b600060096000600860019054906101000a900460ff16600381111561129e57fe5b60ff1660ff168152602001908152602001600020600001541180156112f95750600060096000600860019054906101000a900460ff1660038111156112df57fe5b60ff1660ff16815260200190815260200160002060020154115b151561130457600080fd5b6001600860006101000a81548160ff0219169083600281111561132357fe5b0217905550426001819055506113448260015461297490919063ffffffff16565b6002819055507fa16b9341b2bb91f44d120a07517e11fcd77857ad47263a1659b59223276fc475600154600254600860019054906101000a900460ff166040518084815260200183815260200182600381111561139d57fe5b60ff168152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561141157600080fd5b600080600381111561141f57fe5b600860019054906101000a900460ff16600381111561143a57fe5b14151561144657600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055505050565b600860019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151357600080fd5b600080600281111561152157fe5b600860009054906101000a900460ff16600281111561153c57fe5b14151561154857600080fd5b82600381111561155457fe5b600860019054906101000a900460ff16600381111561156f57fe5b1115151561157c57600080fd5b6000821461158a578161158e565b6127105b6009600085600381111561159e57fe5b60ff1660ff16815260200190815260200160002060030181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561161b57600080fd5b600080600381111561162957fe5b600860019054906101000a900460ff16600381111561164457fe5b14151561165057600080fd5b600091505b838390508263ffffffff1610156116ac5761169f84848463ffffffff16818110151561167d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166113b6565b8180600101925050611655565b50505050565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561171357600080fd5b600180600281111561172157fe5b600860009054906101000a900460ff16600281111561173c57fe5b14151561174857600080fd5b426002819055506002600860006101000a81548160ff0219169083600281111561176e57fe5b02179055507f91c0395cbf43e0c73c36b85814d72a8d148e5ca8cd293b143146a7457de94369600254600554600860019054906101000a900460ff16604051808481526020018381526020018260038111156117c657fe5b60ff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561183957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156118b257600080fd5b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561190f57600080fd5b600060149054906101000a900460ff16151561192a57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119cd57600080fd5b60008060028111156119db57fe5b600860009054906101000a900460ff1660028111156119f657fe5b141515611a0257600080fd5b826003811115611a0e57fe5b600860019054906101000a900460ff166003811115611a2957fe5b11151515611a3657600080fd5b60008214611a445781611a50565b69043c33c19375648000005b60096000856003811115611a6057fe5b60ff1660ff16815260200190815260200160002060020181905550505050565b60055481565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1a57600080fd5b6000806003811115611b2857fe5b600860019054906101000a900460ff166003811115611b4357fe5b141515611b4f57600080fd5b8484905087879050141515611b6357600080fd5b600091505b868690508263ffffffff161015611bdb57611bcd87878463ffffffff168181101515611b9057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686868563ffffffff168181101515611bc157fe5b90506020020135611f22565b508180600101925050611b68565b600192505050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c4657600080fd5b6000806003811115611c5457fe5b600860019054906101000a900460ff166003811115611c6f57fe5b141515611c7b57600080fd5b8383905086869050141515611c8f57600080fd5b600091505b858590508263ffffffff161015611d0657611cf986868463ffffffff168181101515611cbc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1685858563ffffffff168181101515611ced57fe5b905060200201356123f0565b8180600101925050611c94565b505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d7c57600080fd5b6002806002811115611d8a57fe5b600860009054906101000a900460ff166002811115611da557fe5b141515611db157600080fd5b856003811115611dbd57fe5b600860019054906101000a900460ff166003811115611dd857fe5b11151515611de557600080fd5b6000600860006101000a81548160ff02191690836002811115611e0457fe5b021790555085600860016101000a81548160ff02191690836003811115611e2757fe5b0217905550611e36868661254e565b611e4086856110e7565b611e4a8684611972565b611e5486836114b8565b505050505050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ebd57600080fd5b600060149054906101000a900460ff16151515611ed957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7f57600080fd5b6000806003811115611f8d57fe5b600860019054906101000a900460ff166003811115611fa857fe5b141515611fb457600080fd5b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156120525750600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548311155b151561205d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561212957600080fd5b6102c65a03f1151561213a57600080fd5b5050506040518051905086866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561220657600080fd5b6102c65a03f1151561221757600080fd5b50505060405180519050151561222c57600080fd5b600191505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229257600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234a57600080fd5b600090505b828290508163ffffffff1610156123a65761239983838363ffffffff16818110151561237757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1661265a565b808060010191505061234f565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561244b57600080fd5b600080600381111561245957fe5b600860019054906101000a900460ff16600381111561247457fe5b14151561248057600080fd5b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b600860009054906101000a900460ff1681565b69043c33c193756480000081565b60001981565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125a957600080fd5b60008060028111156125b757fe5b600860009054906101000a900460ff1660028111156125d257fe5b1415156125de57600080fd5b8260038111156125ea57fe5b600860019054906101000a900460ff16600381111561260557fe5b1115151561261257600080fd5b60008214612620578161262a565b67016345785d8a00005b6009600085600381111561263a57fe5b60ff1660ff16815260200190815260200160002060000181905550505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126b557600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561276b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156127a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156128c257600080fd5b600090505b828290508163ffffffff16101561291e5761291183838363ffffffff1681811015156128ef57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16612237565b80806001019150506128c7565b505050565b6007602052816000526040600020602052806000526040600020600091509150505481565b61271081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080828401905083811015151561298857fe5b8091505092915050565b60008060008414156129a757600091506129c6565b82840290508284828115156129b857fe5b041415156129c257fe5b8091505b50929150505600a165627a7a72305820f9b2122d3d272e189b1d1a13827c581afda8a50a5927f275f0c7dd483bf9a5260029000000000000000000000000ce54a3ff220e62e3a7fcd50355941d6a9bc707f4000000000000000000000000b1c1cb8c7c1992dba24e628bf7d38e71dad46aeb

Deployed Bytecode

0x6060604052600436106101cd576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304892c9f146101d85780630bee3800146102015780630e3ab61d14610230578063146091f114610253578063146ca5311461028c57806325a1bb47146102c35780632819598d146102f25780633197cbb614610320578063380d831b146103495780633ccfd60b1461035e5780633f4ba83a14610373578063497bf6811461038857806353f4db01146103b757806357738e8f146103e05780635885c626146104365780635b24f87d146104905780635c975abb146104d25780636e5a6d1b146104ff57806378e97925146105495780638456cb591461057257806386ce0285146105875780638ab1d681146105e15780638c10671c1461061a5780638da5cb5b146106485780639b19251a1461069d578063a6f2ae3a146106ee578063ad9ac1bc14610710578063c040e6b814610752578063ce14eeb814610789578063d0949f99146107b2578063e1ab36f0146107db578063e43252d71461080a578063f2fde38b14610843578063f674d7991461087c578063f9810ba5146108aa578063fbfbb62e14610903578063fc0c546a1461092c575b6101d5610981565b50005b34156101e357600080fd5b6101eb6110db565b6040518082815260200191505060405180910390f35b341561020c57600080fd5b61022e600480803560ff169060200190919080359060200190919050506110e7565b005b341561023b57600080fd5b61025160048080359060200190919050506111ed565b005b341561025e57600080fd5b61028a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113b6565b005b341561029757600080fd5b61029f6114a5565b604051808260038111156102af57fe5b60ff16815260200191505060405180910390f35b34156102ce57600080fd5b6102f0600480803560ff169060200190919080359060200190919050506114b8565b005b34156102fd57600080fd5b61031e600480803590602001908201803590602001919091929050506115be565b005b341561032b57600080fd5b6103336116b2565b6040518082815260200191505060405180910390f35b341561035457600080fd5b61035c6116b8565b005b341561036957600080fd5b6103716117de565b005b341561037e57600080fd5b6103866118b4565b005b341561039357600080fd5b6103b5600480803560ff16906020019091908035906020019091905050611972565b005b34156103c257600080fd5b6103ca611a80565b6040518082815260200191505060405180910390f35b34156103eb57600080fd5b610404600480803560ff16906020019091905050611a86565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561044157600080fd5b610476600480803590602001908201803590602001919091929080359060200190820180359060200191909192905050611abc565b604051808215151515815260200191505060405180910390f35b341561049b57600080fd5b6104d0600480803590602001908201803590602001919091929080359060200190820180359060200191909192905050611be9565b005b34156104dd57600080fd5b6104e5611d0e565b604051808215151515815260200191505060405180910390f35b341561050a57600080fd5b610547600480803560ff16906020019091908035906020019091908035906020019091908035906020019091908035906020019091905050611d21565b005b341561055457600080fd5b61055c611e5c565b6040518082815260200191505060405180910390f35b341561057d57600080fd5b610585611e62565b005b341561059257600080fd5b6105c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611f22565b604051808215151515815260200191505060405180910390f35b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612237565b005b341561062557600080fd5b610646600480803590602001908201803590602001919091929050506122ed565b005b341561065357600080fd5b61065b6123ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106a857600080fd5b6106d4600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506123d0565b604051808215151515815260200191505060405180910390f35b6106f6610981565b604051808215151515815260200191505060405180910390f35b341561071b57600080fd5b610750600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506123f0565b005b341561075d57600080fd5b610765612527565b6040518082600281111561077557fe5b60ff16815260200191505060405180910390f35b341561079457600080fd5b61079c61253a565b6040518082815260200191505060405180910390f35b34156107bd57600080fd5b6107c5612548565b6040518082815260200191505060405180910390f35b34156107e657600080fd5b610808600480803560ff1690602001909190803590602001909190505061254e565b005b341561081557600080fd5b610841600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061265a565b005b341561084e57600080fd5b61087a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612710565b005b341561088757600080fd5b6108a860048080359060200190820180359060200191909192905050612865565b005b34156108b557600080fd5b6108ed600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560ff16906020019091905050612923565b6040518082815260200191505060405180910390f35b341561090e57600080fd5b610916612948565b6040518082815260200191505060405180910390f35b341561093757600080fd5b61093f61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080600080600060149054906101000a900460ff161515156109a357600080fd5b60018060028111156109b157fe5b600860009054906101000a900460ff1660028111156109cc57fe5b1415156109d857600080fd5b6000806003808111156109e757fe5b600860019054906101000a900460ff166003811115610a0257fe5b11151515610a0f57600080fd5b6001544210158015610a2357506002544211155b1515610a2e57600080fd5b349150339050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610a8c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610ac857600080fd5b60096000600860019054906101000a900460ff166003811115610ae757fe5b60ff1660ff168152602001908152602001600020600001548210151515610b0d57600080fd5b60096000600860019054906101000a900460ff166003811115610b2c57fe5b60ff1660ff16815260200190815260200160002060010154610bc783600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610ba457fe5b60ff1660ff1681526020019081526020016000205461297490919063ffffffff16565b11151515610bd457600080fd5b60096000600860019054906101000a900460ff166003811115610bf357fe5b60ff1660ff16815260200190815260200160002060020154610c548360096000600860019054906101000a900460ff166003811115610c2e57fe5b60ff1660ff1681526020019081526020016000206004015461297490919063ffffffff16565b11151515610c6157600080fd5b339550349450610cb060096000600860019054906101000a900460ff166003811115610c8957fe5b60ff1660ff168152602001908152602001600020600301548661299290919063ffffffff16565b9350600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d7e57600080fd5b6102c65a03f11515610d8f57600080fd5b5050506040518051905088876000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610e5b57600080fd5b6102c65a03f11515610e6c57600080fd5b505050604051805190501515610e8157600080fd5b610e968560055461297490919063ffffffff16565b600581905550610ee58560096000600860019054906101000a900460ff166003811115610ebf57fe5b60ff1660ff1681526020019081526020016000206004015461297490919063ffffffff16565b60096000600860019054906101000a900460ff166003811115610f0457fe5b60ff1660ff16815260200190815260200160002060040181905550610fa285600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610f7f57fe5b60ff1660ff1681526020019081526020016000205461297490919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600860019054906101000a900460ff166003811115610ffe57fe5b60ff1660ff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561107857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8686604051808381526020018281526020019250505060405180910390a26001965050505050505090565b67016345785d8a000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114257600080fd5b600080600281111561115057fe5b600860009054906101000a900460ff16600281111561116b57fe5b14151561117757600080fd5b82600381111561118357fe5b600860019054906101000a900460ff16600381111561119e57fe5b111515156111ab57600080fd5b600082146111b957816111bd565b6000195b600960008560038111156111cd57fe5b60ff1660ff16815260200190815260200160002060010181905550505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124857600080fd5b600080600281111561125657fe5b600860009054906101000a900460ff16600281111561127157fe5b14151561127d57600080fd5b600060096000600860019054906101000a900460ff16600381111561129e57fe5b60ff1660ff168152602001908152602001600020600001541180156112f95750600060096000600860019054906101000a900460ff1660038111156112df57fe5b60ff1660ff16815260200190815260200160002060020154115b151561130457600080fd5b6001600860006101000a81548160ff0219169083600281111561132357fe5b0217905550426001819055506113448260015461297490919063ffffffff16565b6002819055507fa16b9341b2bb91f44d120a07517e11fcd77857ad47263a1659b59223276fc475600154600254600860019054906101000a900460ff166040518084815260200183815260200182600381111561139d57fe5b60ff168152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561141157600080fd5b600080600381111561141f57fe5b600860019054906101000a900460ff16600381111561143a57fe5b14151561144657600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055505050565b600860019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151357600080fd5b600080600281111561152157fe5b600860009054906101000a900460ff16600281111561153c57fe5b14151561154857600080fd5b82600381111561155457fe5b600860019054906101000a900460ff16600381111561156f57fe5b1115151561157c57600080fd5b6000821461158a578161158e565b6127105b6009600085600381111561159e57fe5b60ff1660ff16815260200190815260200160002060030181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561161b57600080fd5b600080600381111561162957fe5b600860019054906101000a900460ff16600381111561164457fe5b14151561165057600080fd5b600091505b838390508263ffffffff1610156116ac5761169f84848463ffffffff16818110151561167d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166113b6565b8180600101925050611655565b50505050565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561171357600080fd5b600180600281111561172157fe5b600860009054906101000a900460ff16600281111561173c57fe5b14151561174857600080fd5b426002819055506002600860006101000a81548160ff0219169083600281111561176e57fe5b02179055507f91c0395cbf43e0c73c36b85814d72a8d148e5ca8cd293b143146a7457de94369600254600554600860019054906101000a900460ff16604051808481526020018381526020018260038111156117c657fe5b60ff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561183957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156118b257600080fd5b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561190f57600080fd5b600060149054906101000a900460ff16151561192a57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119cd57600080fd5b60008060028111156119db57fe5b600860009054906101000a900460ff1660028111156119f657fe5b141515611a0257600080fd5b826003811115611a0e57fe5b600860019054906101000a900460ff166003811115611a2957fe5b11151515611a3657600080fd5b60008214611a445781611a50565b69043c33c19375648000005b60096000856003811115611a6057fe5b60ff1660ff16815260200190815260200160002060020181905550505050565b60055481565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1a57600080fd5b6000806003811115611b2857fe5b600860019054906101000a900460ff166003811115611b4357fe5b141515611b4f57600080fd5b8484905087879050141515611b6357600080fd5b600091505b868690508263ffffffff161015611bdb57611bcd87878463ffffffff168181101515611b9057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686868563ffffffff168181101515611bc157fe5b90506020020135611f22565b508180600101925050611b68565b600192505050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c4657600080fd5b6000806003811115611c5457fe5b600860019054906101000a900460ff166003811115611c6f57fe5b141515611c7b57600080fd5b8383905086869050141515611c8f57600080fd5b600091505b858590508263ffffffff161015611d0657611cf986868463ffffffff168181101515611cbc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1685858563ffffffff168181101515611ced57fe5b905060200201356123f0565b8180600101925050611c94565b505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d7c57600080fd5b6002806002811115611d8a57fe5b600860009054906101000a900460ff166002811115611da557fe5b141515611db157600080fd5b856003811115611dbd57fe5b600860019054906101000a900460ff166003811115611dd857fe5b11151515611de557600080fd5b6000600860006101000a81548160ff02191690836002811115611e0457fe5b021790555085600860016101000a81548160ff02191690836003811115611e2757fe5b0217905550611e36868661254e565b611e4086856110e7565b611e4a8684611972565b611e5486836114b8565b505050505050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ebd57600080fd5b600060149054906101000a900460ff16151515611ed957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7f57600080fd5b6000806003811115611f8d57fe5b600860019054906101000a900460ff166003811115611fa857fe5b141515611fb457600080fd5b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156120525750600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548311155b151561205d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561212957600080fd5b6102c65a03f1151561213a57600080fd5b5050506040518051905086866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561220657600080fd5b6102c65a03f1151561221757600080fd5b50505060405180519050151561222c57600080fd5b600191505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229257600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234a57600080fd5b600090505b828290508163ffffffff1610156123a65761239983838363ffffffff16818110151561237757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1661265a565b808060010191505061234f565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561244b57600080fd5b600080600381111561245957fe5b600860019054906101000a900460ff16600381111561247457fe5b14151561248057600080fd5b6001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b600860009054906101000a900460ff1681565b69043c33c193756480000081565b60001981565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125a957600080fd5b60008060028111156125b757fe5b600860009054906101000a900460ff1660028111156125d257fe5b1415156125de57600080fd5b8260038111156125ea57fe5b600860019054906101000a900460ff16600381111561260557fe5b1115151561261257600080fd5b60008214612620578161262a565b67016345785d8a00005b6009600085600381111561263a57fe5b60ff1660ff16815260200190815260200160002060000181905550505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126b557600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561276b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156127a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156128c257600080fd5b600090505b828290508163ffffffff16101561291e5761291183838363ffffffff1681811015156128ef57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16612237565b80806001019150506128c7565b505050565b6007602052816000526040600020602052806000526040600020600091509150505481565b61271081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080828401905083811015151561298857fe5b8091505092915050565b60008060008414156129a757600091506129c6565b82840290508284828115156129b857fe5b041415156129c257fe5b8091505b50929150505600a165627a7a72305820f9b2122d3d272e189b1d1a13827c581afda8a50a5927f275f0c7dd483bf9a5260029

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

000000000000000000000000ce54a3ff220e62e3a7fcd50355941d6a9bc707f4000000000000000000000000b1c1cb8c7c1992dba24e628bf7d38e71dad46aeb

-----Decoded View---------------
Arg [0] : fundAddress (address): 0xCe54A3Ff220E62E3A7fcd50355941D6A9BC707F4
Arg [1] : tokenAddress (address): 0xb1c1Cb8C7c1992dba24e628bF7d38E71daD46aeB

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ce54a3ff220e62e3a7fcd50355941d6a9bc707f4
Arg [1] : 000000000000000000000000b1c1cb8c7c1992dba24e628bf7d38e71dad46aeb


Swarm Source

bzzr://f9b2122d3d272e189b1d1a13827c581afda8a50a5927f275f0c7dd483bf9a526

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.