ETH Price: $3,390.22 (+4.36%)
Gas: 2 Gwei

Contract

0x99287f6A84d56Fc3bB2ad95a4bBE783403f825f0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Distribute Token...64952572018-10-11 13:23:282117 days ago1539264208IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...57869012018-06-14 10:19:072237 days ago1528971547IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...57868982018-06-14 10:18:422237 days ago1528971522IN
0x99287f6A...403f825f0
0 ETH0.0024011665
Distribute Token...57863282018-06-14 7:59:462237 days ago1528963186IN
0x99287f6A...403f825f0
0 ETH0.0064369565
Distribute Token...57863282018-06-14 7:59:462237 days ago1528963186IN
0x99287f6A...403f825f0
0 ETH0.0064368865
Distribute Token...57862602018-06-14 7:42:212237 days ago1528962141IN
0x99287f6A...403f825f0
0 ETH0.0021735365
Distribute Token...57407472018-06-06 6:53:092245 days ago1528267989IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...56571932018-05-22 11:12:242259 days ago1526987544IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...56571892018-05-22 11:10:492259 days ago1526987449IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...55765622018-05-08 7:03:492274 days ago1525763029IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...55765512018-05-08 7:01:522274 days ago1525762912IN
0x99287f6A...403f825f0
0 ETH0.0016901965
Distribute Token...55436272018-05-02 13:16:172279 days ago1525266977IN
0x99287f6A...403f825f0
0 ETH0.0016901965
Distribute Token...55436172018-05-02 13:13:532279 days ago1525266833IN
0x99287f6A...403f825f0
0 ETH0.0024011665
Distribute Token...55436132018-05-02 13:13:062279 days ago1525266786IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...54614052018-04-18 7:35:182294 days ago1524036918IN
0x99287f6A...403f825f0
0 ETH0.0021756165
Distribute Token...53739502018-04-03 16:13:322308 days ago1522772012IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...53739492018-04-03 16:13:162308 days ago1522771996IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute To Al...53739492018-04-03 16:13:162308 days ago1522771996IN
0x99287f6A...403f825f0
0 ETH0.0031203265
Distribute Token...53739492018-04-03 16:13:162308 days ago1522771996IN
0x99287f6A...403f825f0
0 ETH0.0016881165
Distribute Token...53014862018-03-22 13:55:032320 days ago1521726903IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...53014862018-03-22 13:55:032320 days ago1521726903IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...52652272018-03-16 11:11:102326 days ago1521198670IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...52652252018-03-16 11:10:432326 days ago1521198643IN
0x99287f6A...403f825f0
0 ETH0.0024053265
Distribute Token...52595682018-03-15 12:21:492327 days ago1521116509IN
0x99287f6A...403f825f0
0 ETH0.0021776965
Distribute Token...52595542018-03-15 12:17:282327 days ago1521116248IN
0x99287f6A...403f825f0
0 ETH0.0064369565
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
0.78 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
0.5 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
0.20413654 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
0.99284594 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
1.3918401 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
1.11347208 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.63946701 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
2.63946701 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.63946701 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.63946701 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.63 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.6 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
4.639 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
9.27 ETH
49535962018-01-22 18:02:452379 days ago1516644165
0x99287f6A...403f825f0
2 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
2 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
5 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
0.02893403 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
1.48462944 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
1.8557868 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
4.00386003 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
5.5 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
1 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
9.27893403 ETH
49535952018-01-22 18:02:212379 days ago1516644141
0x99287f6A...403f825f0
0.2 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DadiPreSale

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-01-21
*/

pragma solidity ^0.4.11;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

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


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() 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) onlyOwner public {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public constant returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, 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;

  /**
  * @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));

    // 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 constant returns (uint256 balance) {
    return balances[_owner];
  }

}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public constant 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 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)) 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));

    uint256 _allowance = allowed[_from][msg.sender];

    // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
    // require (_value <= _allowance);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = _allowance.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 constant returns (uint256 remaining) {
    return allowed[_owner][_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
   */
  function increaseApproval (address _spender, uint _addedValue) public returns (bool success) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval (address _spender, uint _subtractedValue) public returns (bool success) {
    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;
  }
}


/*****
* @title The DADI Presale Contract
*/
contract DadiPreSale is Ownable {
    using SafeMath for uint256;

    StandardToken public token;                         // The DADI ERC20 token */
    address public owner;
    address[] public preSaleWallets;

    struct WhitelistUser {
      uint256 pledged;
      uint index;
    }

    struct Investor {
      uint256 tokens;
      uint256 contribution;
      uint index;
    }

    uint256 public tokenSupply;
    uint256 public tokensPurchased = 0;
    uint256 public individualCap = 10000 * 1000;        // USD$10,000
    uint256 public preSaleTokenPrice = 400;             // USD$0.40
    uint256 public ethRate;                             // ETH to USD Rate, set by owner: 1 ETH = ethRate USD
 
    mapping(address => WhitelistUser) private whitelisted;
    address[] private whitelistedIndex;
    mapping(address => Investor) private investors;
    address[] private investorIndex;

    /*****
    * State for Sale Modes
    *  0 - Preparing:            All contract initialization calls
    *  1 - PreSale:              Contract is in the Presale Period
    *  2 - PreSaleFinalized      Presale period is finalized, no more payments are allowed
    *  3 - Success:              Presale Successful
    *  4 - TokenDistribution:    Presale finished, tokens can be distributed
    *  5 - Closed:               Presale closed, no tokens more can be distributed
    */
    enum SaleState { Preparing, PreSale, PreSaleFinalized, Success, TokenDistribution, Closed }
    SaleState public state = SaleState.Preparing;

    /*****
    * State for Purchase Periods
    *  0 - Preparing:            All contract initialization calls
    *  1 - Whitelist:            Only whitelisted users can make payments
    *  2 - WhitelistApplicant:   Only whitelisted users and whitelist applicants can make payments
    *  3 - Public:               Sale open to all
    */
    enum PurchasePeriod { Preparing, Whitelist, WhitelistApplicant, Public }
    PurchasePeriod public purchasePeriod = PurchasePeriod.Preparing;

    /**
    * event for token purchase logging
    * @param purchaser who paid for the tokens
    * @param beneficiary who got the tokens
    * @param value weis paid for purchase
    * @param tokens amount of tokens purchased
    */
    event LogTokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 tokens);
    event LogTokenDistribution(address recipient, uint256 tokens);
    event LogRedistributeTokens(address recipient, SaleState _state, uint256 tokens);
    event LogFundTransfer(address wallet, uint256 value);
    event LogRefund(address wallet, uint256 value);
    event LogStateChange(SaleState _state);
    event LogNewWhitelistUser(address indexed userAddress, uint index, uint256 value);

    /*****
    * @dev Modifier to check that amount transferred is not 0
    */
    modifier nonZero() {
        require(msg.value != 0);
        _;
    }

    /*****
    * @dev The constructor function to initialize the Presale
    * @param _token                         address   the address of the ERC20 token for the sale
    * @param _tokenSupply                   uint256   the amount of tokens available
    */
    function DadiPreSale (StandardToken _token,uint256 _tokenSupply) public {
        require(_token != address(0));
        require(_tokenSupply != 0);

        owner = msg.sender;

        token = StandardToken(_token);
        tokenSupply = _tokenSupply * (uint256(10) ** 18);
    }

    /*****
    * @dev Fallback Function to buy the tokens
    */
    function () public nonZero payable {
        require(state == SaleState.PreSale);
        buyTokens(msg.sender, msg.value);
    }

    /*****
    * @dev Allows the contract owner to add a new PreSale wallet, used to hold funds safely
    * @param _wallet        address     The address of the wallet
    * @return success       bool        Returns true if executed successfully
    */
    function addPreSaleWallet (address _wallet) public onlyOwner returns (bool) {
        require(_wallet != address(0));
        preSaleWallets.push(_wallet);
        return true;
    }

    /*****
    * @dev Allows the contract owner to add multiple whitelist users, each with a wallet address and a pledged contribution
    * @param userAddresses   address[]     The array of whitelist wallet addresses
    * @param pledges         uint256[]     The array of whitelist pledges
    */
    function addWhitelistUsers(address[] userAddresses, uint256[] pledges) public onlyOwner {
        for (uint i = 0; i < userAddresses.length; i++) {
            addWhitelistUser(userAddresses[i], pledges[i]);
        }
    }

    /*****
    * @dev Allows the contract owner to a single whitelist user
    * @param userAddress     address      The wallet address to whitelist
    * @param pledged         uint256      The amount pledged by the user
    */
    function addWhitelistUser(address userAddress, uint256 pledged) public onlyOwner {
        if (!isWhitelisted(userAddress)) {
            whitelisted[userAddress].pledged = pledged * 1000;
            whitelisted[userAddress].index = whitelistedIndex.push(userAddress) - 1;
          
            LogNewWhitelistUser(userAddress, whitelisted[userAddress].index, pledged);
        }
    }

    /*****
    * @dev Calculates the number of tokens that can be bought for the amount of Wei transferred
    * @param _amount    uint256     The amount of money invested by the investor
    * @return tokens    uint256     The number of tokens purchased for the amount invested
    */
    function calculateTokens (uint256 _amount) public constant returns (uint256 tokens) {
        tokens = _amount * ethRate / preSaleTokenPrice;
        return tokens;
    }

    /*****
    * @dev Called by the owner of the contract to modify the sale state
    */
    function setState (uint256 _state) public onlyOwner {
        state = SaleState(uint(_state));
        LogStateChange(state);
    }

    /*****
    * @dev Called by the owner of the contract to open the WhitelistApplicant/Public periods
    */
    function setPurchasePeriod (uint256 phase) public onlyOwner {
        purchasePeriod = PurchasePeriod(uint(phase));
    }

    /*****
    * @dev Called by the owner of the contract to start the Presale
    * @param rate   uint256  the current ETH USD rate, multiplied by 1000
    */
    function startPreSale (uint256 rate) public onlyOwner {
        state = SaleState.PreSale;
        purchasePeriod = PurchasePeriod.Whitelist;
        updateEthRate(rate);
        LogStateChange(state);
    }

    /*****
    * @dev Allow updating the ETH USD exchange rate
    * @param rate   uint256  the current ETH USD rate, multiplied by 1000
    * @return bool  Return true if the contract is in PartnerSale Period
    */
    function updateEthRate (uint256 rate) public onlyOwner returns (bool) {
        require(rate >= 100000);
        
        ethRate = rate;
        return true;
    }

    /*****
    * @dev Allows transfer of tokens to a recipient who has purchased offline, during the PreSale
    * @param _recipient     address     The address of the recipient of the tokens
    * @param _tokens        uint256     The number of tokens purchased by the recipient
    * @return success       bool        Returns true if executed successfully
    */
    function offlineTransaction (address _recipient, uint256 _tokens) public onlyOwner returns (bool) {
        require(_tokens > 0);

        // Convert to a token with decimals 
        uint256 tokens = _tokens * (uint256(10) ** uint8(18));

        // if the number of tokens is greater than available, reject tx
        if (tokens >= getTokensAvailable()) {
            revert();
        }

        addToInvestor(_recipient, 0, tokens);

        // Increase the count of tokens purchased in the sale
        updateSaleParameters(tokens);

        LogTokenPurchase(msg.sender, _recipient, 0, tokens);

        return true;
    }

    /*****
    * @dev Called by the owner of the contract to finalize the ICO
    *      and redistribute funds (if any)
    */
    function finalizeSale () public onlyOwner {
        state = SaleState.Success;
        LogStateChange(state);

        // Transfer any ETH to one of the Presale wallets
        if (this.balance > 0) {
            forwardFunds(this.balance);
        }
    }

    /*****
    * @dev Called by the owner of the contract to close the Sale and redistribute any crumbs.
    * @param recipient     address     The address of the recipient of the tokens
    */
    function closeSale (address recipient) public onlyOwner {
        state = SaleState.Closed;
        LogStateChange(state);

        // redistribute unsold tokens to DADI ecosystem
        uint256 remaining = getTokensAvailable();
        updateSaleParameters(remaining);

        if (remaining > 0) {
            token.transfer(recipient, remaining);
            LogRedistributeTokens(recipient, state, remaining);
        }
    }

    /*****
    * @dev Called by the owner of the contract to allow tokens to be distributed
    */
    function setTokenDistribution () public onlyOwner {
        state = SaleState.TokenDistribution;
        LogStateChange(state);
    }

    /*****
    * @dev Called by the owner of the contract to distribute tokens to investors
    * @param _address       address     The address of the investor for which to distribute tokens
    * @return success       bool        Returns true if executed successfully
    */
    function distributeTokens (address _address) public onlyOwner returns (bool) {
        require(state == SaleState.TokenDistribution);
        
        // get the tokens available for the investor
        uint256 tokens = investors[_address].tokens;
        require(tokens > 0);

        investors[_address].tokens = 0;
        investors[_address].contribution = 0;

        token.transfer(_address, tokens);
      
        LogTokenDistribution(_address, tokens);
        return true;
    }

    /*****
    * @dev Called by the owner of the contract to distribute tokens to investors who used a non-ERC20 wallet address
    * @param _purchaseAddress        address     The address the investor used to buy tokens
    * @param _tokenAddress           address     The address to send the tokens to
    * @return success                bool        Returns true if executed successfully
    */
    function distributeToAlternateAddress (address _purchaseAddress, address _tokenAddress) public onlyOwner returns (bool) {
        require(state == SaleState.TokenDistribution);
        
        // get the tokens available for the investor
        uint256 tokens = investors[_purchaseAddress].tokens;
        require(tokens > 0);

        investors[_purchaseAddress].tokens = 0;

        token.transfer(_tokenAddress, tokens);
      
        LogTokenDistribution(_tokenAddress, tokens);
        return true;
    }

    /*****
    * @dev Called by the owner of the contract to redistribute tokens if an investor has been refunded offline
    * @param investorAddress         address     The address the investor used to buy tokens
    * @param recipient               address     The address to send the tokens to
    */
    function redistributeTokens (address investorAddress, address recipient) public onlyOwner {
        uint256 tokens = investors[investorAddress].tokens;
        require(tokens > 0);
        
        // remove tokens, so they can't be redistributed
        investors[investorAddress].tokens = 0;
        token.transfer(recipient, tokens);

        LogRedistributeTokens(recipient, state, tokens);
    }

    /*****
    * @dev Get the amount of PreSale tokens left for purchase
    * @return uint256 the count of tokens available
    */
    function getTokensAvailable () public constant returns (uint256) {
        return tokenSupply - tokensPurchased;
    }

    /*****
    * @dev Get the total count of tokens purchased in all the Sale periods
    * @return uint256 the count of tokens purchased
    */
    function getTokensPurchased () public constant returns (uint256) {
        return tokensPurchased;
    }

    /*****
    * @dev Get the balance sent to the contract
    * @return uint256 the amount sent to this contract, in Wei
    */
    function getBalance () public constant returns (uint256) {
        return this.balance;
    }

    /*****
    * @dev Converts an amount sent in Wei to the equivalent in USD
    * @param _amount      uint256       the amount sent to the contract, in Wei
    * @return uint256  the amount sent to this contract, in USD
    */
    function ethToUsd (uint256 _amount) public constant returns (uint256) {
        return (_amount * ethRate) / (uint256(10) ** 18);
    }

    /*****
    * @dev Get the overall success state of the ICO
    * @return bool whether the state is successful, or not
    */
    function isSuccessful () public constant returns (bool) {
        return state == SaleState.Success;
    }

    /*****
    * @dev Get a whitelisted user
    * @param userAddress      address       the wallet address of the user
    * @return uint256  the amount pledged by the user
    * @return uint     the index of the user
    */
    function getWhitelistUser (address userAddress) public constant returns (uint256 pledged, uint index) {
        require(isWhitelisted(userAddress));
        return(whitelisted[userAddress].pledged, whitelisted[userAddress].index);
    }

    /*****
    * @dev Get count of contributors
    * @return uint     the number of unique contributors
    */
    function getInvestorCount () public constant returns (uint count) {
        return investorIndex.length;
    }


    /*****
    * @dev Get an investor
    * @param _address      address       the wallet address of the investor
    * @return uint256  the amount contributed by the user
    * @return uint256  the number of tokens assigned to the user
    * @return uint     the index of the user
    */
    function getInvestor (address _address) public constant returns (uint256 contribution, uint256 tokens, uint index) {
        require(isInvested(_address));
        return(investors[_address].contribution, investors[_address].tokens, investors[_address].index);
    }

    /*****
    * @dev Get a user's whitelisted state
    * @param userAddress      address       the wallet address of the user
    * @return bool  true if the user is in the whitelist
    */
    function isWhitelisted (address userAddress) internal constant returns (bool isIndeed) {
        if (whitelistedIndex.length == 0) return false;
        return (whitelistedIndex[whitelisted[userAddress].index] == userAddress);
    }

    /*****
    * @dev Get a user's invested state
    * @param _address      address       the wallet address of the user
    * @return bool  true if the user has already contributed
    */
    function isInvested (address _address) internal constant returns (bool isIndeed) {
        if (investorIndex.length == 0) return false;
        return (investorIndex[investors[_address].index] == _address);
    }

    /*****
    * @dev Update a user's invested state
    * @param _address      address       the wallet address of the user
    * @param _value        uint256       the amount contributed in this transaction
    * @param _tokens       uint256       the number of tokens assigned in this transaction
    */
    function addToInvestor(address _address, uint256 _value, uint256 _tokens) internal {
        // add the user to the investorIndex if this is their first contribution
        if (!isInvested(_address)) {
            investors[_address].index = investorIndex.push(_address) - 1;
        }
      
        investors[_address].tokens = investors[_address].tokens.add(_tokens);
        investors[_address].contribution = investors[_address].contribution.add(_value);
    }

    /*****
    * @dev Send ether to the presale collection wallets
    */
    function forwardFunds (uint256 _value) internal {
        uint accountNumber;
        address account;

        // move funds to a random preSaleWallet
        if (preSaleWallets.length > 0) {
            accountNumber = getRandom(preSaleWallets.length) - 1;
            account = preSaleWallets[accountNumber];
            account.transfer(_value);
            LogFundTransfer(account, _value);
        }
    }

    /*****
    * @dev Internal function to assign tokens to the contributor
    * @param _address       address     The address of the contributing investor
    * @param _value         uint256     The amount invested 
    * @return success       bool        Returns true if executed successfully
    */
    function buyTokens (address _address, uint256 _value) internal returns (bool) {
        require(isBelowCap(_value));

        if (isWhitelistPeriod()) {
            require(isWhitelisted(_address));
        }

        require(isValidContribution(_address, _value));

        uint256 boughtTokens = calculateTokens(_value);
        require(boughtTokens != 0);

        // if the number of tokens calculated for the given value is 
        // greater than the tokens available, reject the payment
        if (boughtTokens >= getTokensAvailable()) {
            revert();
        }

        // update investor state
        addToInvestor(_address, _value, boughtTokens);

        LogTokenPurchase(msg.sender, _address, _value, boughtTokens);

        forwardFunds(_value);

        updateSaleParameters(boughtTokens);

        return true;
    }

    /*****
    * @dev Check that the amount sent in the transaction is below the individual cap, or below the pledged
    * amount if the user is whitelisted and the sale is in the whitelist period. Factors in previous
    * transaction by the same user
    * @param _address         address     The address of the user making the transaction
    * @param _amount          uint256     The amount sent in the transaction
    * @return        bool        Returns true if the amount is valid
    */
    function isValidContribution (address _address, uint256 _amount) internal constant returns (bool valid) {
        if (isWhitelistPeriod() && isWhitelisted(_address)) {
            return ethToUsd(_amount + investors[_address].contribution) <= whitelisted[_address].pledged;
        }

        return isBelowCap(_amount + investors[_address].contribution); 
    }

    /*****
    * @dev Check that the amount sent in the transaction is below the individual cap
    * @param _amount         uint256     The amount sent in the transaction
    * @return        bool        Returns true if the amount is below the individual cap
    */
    function isBelowCap (uint256 _amount) internal constant returns (bool) {
        return ethToUsd(_amount) < individualCap;
    }

    /*****
    * @dev Generates a random number from 1 to max based on the last block hash
    * @param max     uint  the maximum value 
    * @return a random number
    */
    function getRandom(uint max) internal constant returns (uint randomNumber) {
        return (uint(keccak256(block.blockhash(block.number - 1))) % max) + 1;
    }

    /*****
    * @dev Internal function to modify parameters based on tokens bought
    * @param _tokens        uint256     The number of tokens purchased
    */
    function updateSaleParameters (uint256 _tokens) internal {
        tokensPurchased = tokensPurchased.add(_tokens);
    }

    /*****
    * @dev Check the state of the contract
    * @return bool  Return true if the contract is in the Whitelist period
    */
    function isWhitelistPeriod () private constant returns (bool) {
        return purchasePeriod == PurchasePeriod.Whitelist;
    }

    /*****
    * @dev Check the state of the contract
    * @return bool  Return true if the contract is in the WhitelistApplicant period
    */
    function isWhitelistApplicantPeriod () private constant returns (bool) {
        return purchasePeriod == PurchasePeriod.WhitelistApplicant;
    }

    /*****
    * @dev Check the state of the contract
    * @return bool  Return true if the contract is in the Public period
    */
    function isPublicPeriod () private constant returns (bool) {
        return purchasePeriod == PurchasePeriod.Public;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"individualCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"investorAddress","type":"address"},{"name":"recipient","type":"address"}],"name":"redistributeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"rate","type":"uint256"}],"name":"updateEthRate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"rate","type":"uint256"}],"name":"startPreSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_purchaseAddress","type":"address"},{"name":"_tokenAddress","type":"address"}],"name":"distributeToAlternateAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"phase","type":"uint256"}],"name":"setPurchasePeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"calculateTokens","outputs":[{"name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preSaleTokenPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"}],"name":"closeSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"pledged","type":"uint256"}],"name":"addWhitelistUser","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":"_address","type":"address"}],"name":"getInvestor","outputs":[{"name":"contribution","type":"uint256"},{"name":"tokens","type":"uint256"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokensPurchased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"ethToUsd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInvestorCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setTokenDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_state","type":"uint256"}],"name":"setState","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokensAvailable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"distributeTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"getWhitelistUser","outputs":[{"name":"pledged","type":"uint256"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"preSaleWallets","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensPurchased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"purchasePeriod","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"addPreSaleWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isSuccessful","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddresses","type":"address[]"},{"name":"pledges","type":"uint256[]"}],"name":"addWhitelistUsers","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":"_recipient","type":"address"},{"name":"_tokens","type":"uint256"}],"name":"offlineTransaction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_tokenSupply","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"LogTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"LogTokenDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"_state","type":"uint8"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"LogRedistributeTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"LogFundTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"LogRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_state","type":"uint8"}],"name":"LogStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"index","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"}],"name":"LogNewWhitelistUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526000600555629896806006556101906007556000600d60006101000a81548160ff0219169083600581111561003557fe5b02179055506000600d60016101000a81548160ff0219169083600381111561005957fe5b0217905550341561006957600080fd5b60405160408062002c2783398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561010b57600080fd5b6000811415151561011b57600080fd5b33600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012600a0a81026004819055505050612a6b80620001bc6000396000f3006060604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630276650b146101fd57806312065fe0146102265780633d1e215d1461024f5780633f6f7ed6146102a757806358a687ec146102e25780635b91c510146102f7578063616d1fab1461031a5780636648cb521461038a57806371aa60fd146103ad5780637259bce3146103e45780637824407f1461040d57806379491370146104365780637ba8c12d1461046f5780638da5cb5b146104b15780638f35a75e1461050657806391667aef14610561578063946d14801461058a578063960524e3146105c157806396406391146105ea578063a9e966b7146105ff578063aaa5ad6114610622578063b1d17c981461064b578063b36c14fe1461069c578063c19d93fb146106f0578063c3c2686c14610727578063cc4d819c1461078a578063d2d93f90146107b3578063df0f093b146107dc578063e03c639c14610813578063ec4cd0cf14610864578063ed621e9a14610891578063f2fde38b1461092b578063f54e7a4014610964578063fc0c546a146109be575b600034141515156101bc57600080fd5b600160058111156101c957fe5b600d60009054906101000a900460ff1660058111156101e457fe5b1415156101f057600080fd5b6101fa3334610a13565b50005b341561020857600080fd5b610210610b26565b6040518082815260200191505060405180910390f35b341561023157600080fd5b610239610b2c565b6040518082815260200191505060405180910390f35b341561025a57600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b4b565b005b34156102b257600080fd5b6102c86004808035906020019091905050610dc2565b604051808215151515815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610e41565b005b341561030257600080fd5b6103186004808035906020019091905050610f57565b005b341561032557600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061105b565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103ab60048080359060200190919050506112e8565b005b34156103b857600080fd5b6103ce6004808035906020019091905050611374565b6040518082815260200191505060405180910390f35b34156103ef57600080fd5b6103f7611392565b6040518082815260200191505060405180910390f35b341561041857600080fd5b610420611398565b6040518082815260200191505060405180910390f35b341561044157600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061139e565b005b341561047a57600080fd5b6104af600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061160d565b005b34156104bc57600080fd5b6104c461180a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561051157600080fd5b61053d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561056c57600080fd5b61057461191f565b6040518082815260200191505060405180910390f35b341561059557600080fd5b6105ab6004808035906020019091905050611929565b6040518082815260200191505060405180910390f35b34156105cc57600080fd5b6105d4611946565b6040518082815260200191505060405180910390f35b34156105f557600080fd5b6105fd611953565b005b341561060a57600080fd5b6106206004808035906020019091905050611a28565b005b341561062d57600080fd5b610635611b08565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b16565b604051808215151515815260200191505060405180910390f35b34156106a757600080fd5b6106d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611dea565b604051808381526020018281526020019250505060405180910390f35b34156106fb57600080fd5b610703611e90565b6040518082600581111561071357fe5b60ff16815260200191505060405180910390f35b341561073257600080fd5b6107486004808035906020019091905050611ea3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079557600080fd5b61079d611ee2565b6040518082815260200191505060405180910390f35b34156107be57600080fd5b6107c6611ee8565b6040518082815260200191505060405180910390f35b34156107e757600080fd5b6107ef611eee565b604051808260038111156107ff57fe5b60ff16815260200191505060405180910390f35b341561081e57600080fd5b61084a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f01565b604051808215151515815260200191505060405180910390f35b341561086f57600080fd5b610877612006565b604051808215151515815260200191505060405180910390f35b341561089c57600080fd5b61092960048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050612036565b005b341561093657600080fd5b610962600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120eb565b005b341561096f57600080fd5b6109a4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612240565b604051808215151515815260200191505060405180910390f35b34156109c957600080fd5b6109d161235c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080610a1f83612382565b1515610a2a57600080fd5b610a32612398565b15610a4c57610a40846123c8565b1515610a4b57600080fd5b5b610a568484612493565b1515610a6157600080fd5b610a6a83611374565b905060008114151515610a7c57600080fd5b610a84611b08565b81101515610a9157600080fd5b610a9c8484836125a2565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d8584604051808381526020018281526020019250505060405180910390a3610b1283612798565b610b1b816128aa565b600191505092915050565b60065481565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ba857600080fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515610bfc57600080fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610d1157600080fd5b6102c65a03f11515610d2257600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600d60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836005811115610da257fe5b60ff168152602001828152602001935050505060405180910390a1505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1f57600080fd5b620186a08210151515610e3157600080fd5b8160088190555060019050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e9c57600080fd5b6003600d60006101000a81548160ff02191690836005811115610ebb57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115610f0157fe5b60ff16815260200191505060405180910390a160003073ffffffffffffffffffffffffffffffffffffffff16311115610f5557610f543073ffffffffffffffffffffffffffffffffffffffff1631612798565b5b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fb257600080fd5b6001600d60006101000a81548160ff02191690836005811115610fd157fe5b02179055506001600d60016101000a81548160ff02191690836003811115610ff557fe5b021790555061100381610dc2565b507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff166040518082600581111561104557fe5b60ff16815260200191505060405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110b957600080fd5b600460058111156110c657fe5b600d60009054906101000a900460ff1660058111156110e157fe5b1415156110ed57600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111151561114157600080fd5b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561125657600080fd5b6102c65a03f1151561126757600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600191505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561134357600080fd5b80600381111561134f57fe5b600d60016101000a81548160ff0219169083600381111561136c57fe5b021790555050565b6000600754600854830281151561138757fe5b049050809050919050565b60075481565b60045481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113fb57600080fd5b6005600d60006101000a81548160ff0219169083600581111561141a57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff166040518082600581111561146057fe5b60ff16815260200191505060405180910390a161147b611b08565b9050611486816128aa565b600081111561160957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561155c57600080fd5b6102c65a03f1151561156d57600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600d60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018360058111156115ed57fe5b60ff168152602001828152602001935050505060405180910390a15b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561166857600080fd5b611671826123c8565b1515611806576103e88102600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506001600a80548060010182816116d891906129ee565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508173ffffffffffffffffffffffffffffffffffffffff167f66731e9585532396e86cce538ac325969df87ba505a0913c37b798d30e95215d600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015483604051808381526020018281526020019250505060405180910390a25b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061183e846128c8565b151561184957600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600554905090565b60006012600a0a600854830281151561193e57fe5b049050919050565b6000600c80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119ae57600080fd5b6004600d60006101000a81548160ff021916908360058111156119cd57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115611a1357fe5b60ff16815260200191505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a8357600080fd5b806005811115611a8f57fe5b600d60006101000a81548160ff02191690836005811115611aac57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115611af257fe5b60ff16815260200191505060405180910390a150565b600060055460045403905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7457600080fd5b60046005811115611b8157fe5b600d60009054906101000a900460ff166005811115611b9c57fe5b141515611ba857600080fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515611bfc57600080fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611d5957600080fd5b6102c65a03f11515611d6a57600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050919050565b600080611df6836123c8565b1515611e0157600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015491509150915091565b600d60009054906101000a900460ff1681565b600381815481101515611eb257fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60085481565b600d60019054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f5e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f9a57600080fd5b60038054806001018281611fae91906129ee565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b60006003600581111561201557fe5b600d60009054906101000a900460ff16600581111561203057fe5b14905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561209357600080fd5b600090505b82518110156120e6576120d983828151811015156120b257fe5b9060200190602002015183838151811015156120ca57fe5b9060200190602002015161160d565b8080600101915050612098565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561214657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561218257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229e57600080fd5b6000831115156122ad57600080fd5b601260ff16600a0a830290506122c1611b08565b811015156122ce57600080fd5b6122da846000836125a2565b6122e3816128aa565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d600084604051808381526020018281526020019250505060405180910390a3600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060065461239083611929565b109050919050565b6000600160038111156123a757fe5b600d60019054906101000a900460ff1660038111156123c257fe5b14905090565b600080600a8054905014156123e0576000905061248e565b8173ffffffffffffffffffffffffffffffffffffffff16600a600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481548110151561244857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b600061249d612398565b80156124ae57506124ad836123c8565b5b1561254c57600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612543600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548401611929565b1115905061259c565b612599600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548301612382565b90505b92915050565b6125ab836128c8565b151561265d576001600c80548060010182816125c791906129ee565b9160005260206000209001600086909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b6126b281600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461299390919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061274d82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461299390919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b600080600060038054905011156128a55760016127b96003805490506129b1565b0391506003828154811015156127cb57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561283957600080fd5b7f35c019e24e057e2b74358b61c59c75be70dc488b1c5f97fd5b9dfe58f6df04e88184604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b6128bf8160055461299390919063ffffffff16565b60058190555050565b600080600c8054905014156128e0576000905061298e565b8173ffffffffffffffffffffffffffffffffffffffff16600c600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015481548110151561294857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60008082840190508381101515156129a757fe5b8091505092915050565b600060018260014303406040518082600019166000191681526020019150506040518091039020600190048115156129e557fe5b06019050919050565b815481835581811511612a1557818360005260206000209182019101612a149190612a1a565b5b505050565b612a3c91905b80821115612a38576000816000905550600101612a20565b5090565b905600a165627a7a7230582031f0f524ada83e60eaa8366139b70f02d7ec18aa896b88952e26028c5978748a0029000000000000000000000000fb2f26f266fb2805a387230f2aa0a331b4d96fba0000000000000000000000000000000000000000000000000000000000989680

Deployed Bytecode

0x6060604052600436106101ac576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630276650b146101fd57806312065fe0146102265780633d1e215d1461024f5780633f6f7ed6146102a757806358a687ec146102e25780635b91c510146102f7578063616d1fab1461031a5780636648cb521461038a57806371aa60fd146103ad5780637259bce3146103e45780637824407f1461040d57806379491370146104365780637ba8c12d1461046f5780638da5cb5b146104b15780638f35a75e1461050657806391667aef14610561578063946d14801461058a578063960524e3146105c157806396406391146105ea578063a9e966b7146105ff578063aaa5ad6114610622578063b1d17c981461064b578063b36c14fe1461069c578063c19d93fb146106f0578063c3c2686c14610727578063cc4d819c1461078a578063d2d93f90146107b3578063df0f093b146107dc578063e03c639c14610813578063ec4cd0cf14610864578063ed621e9a14610891578063f2fde38b1461092b578063f54e7a4014610964578063fc0c546a146109be575b600034141515156101bc57600080fd5b600160058111156101c957fe5b600d60009054906101000a900460ff1660058111156101e457fe5b1415156101f057600080fd5b6101fa3334610a13565b50005b341561020857600080fd5b610210610b26565b6040518082815260200191505060405180910390f35b341561023157600080fd5b610239610b2c565b6040518082815260200191505060405180910390f35b341561025a57600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b4b565b005b34156102b257600080fd5b6102c86004808035906020019091905050610dc2565b604051808215151515815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610e41565b005b341561030257600080fd5b6103186004808035906020019091905050610f57565b005b341561032557600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061105b565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103ab60048080359060200190919050506112e8565b005b34156103b857600080fd5b6103ce6004808035906020019091905050611374565b6040518082815260200191505060405180910390f35b34156103ef57600080fd5b6103f7611392565b6040518082815260200191505060405180910390f35b341561041857600080fd5b610420611398565b6040518082815260200191505060405180910390f35b341561044157600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061139e565b005b341561047a57600080fd5b6104af600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061160d565b005b34156104bc57600080fd5b6104c461180a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561051157600080fd5b61053d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561056c57600080fd5b61057461191f565b6040518082815260200191505060405180910390f35b341561059557600080fd5b6105ab6004808035906020019091905050611929565b6040518082815260200191505060405180910390f35b34156105cc57600080fd5b6105d4611946565b6040518082815260200191505060405180910390f35b34156105f557600080fd5b6105fd611953565b005b341561060a57600080fd5b6106206004808035906020019091905050611a28565b005b341561062d57600080fd5b610635611b08565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b16565b604051808215151515815260200191505060405180910390f35b34156106a757600080fd5b6106d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611dea565b604051808381526020018281526020019250505060405180910390f35b34156106fb57600080fd5b610703611e90565b6040518082600581111561071357fe5b60ff16815260200191505060405180910390f35b341561073257600080fd5b6107486004808035906020019091905050611ea3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079557600080fd5b61079d611ee2565b6040518082815260200191505060405180910390f35b34156107be57600080fd5b6107c6611ee8565b6040518082815260200191505060405180910390f35b34156107e757600080fd5b6107ef611eee565b604051808260038111156107ff57fe5b60ff16815260200191505060405180910390f35b341561081e57600080fd5b61084a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f01565b604051808215151515815260200191505060405180910390f35b341561086f57600080fd5b610877612006565b604051808215151515815260200191505060405180910390f35b341561089c57600080fd5b61092960048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050612036565b005b341561093657600080fd5b610962600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120eb565b005b341561096f57600080fd5b6109a4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612240565b604051808215151515815260200191505060405180910390f35b34156109c957600080fd5b6109d161235c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080610a1f83612382565b1515610a2a57600080fd5b610a32612398565b15610a4c57610a40846123c8565b1515610a4b57600080fd5b5b610a568484612493565b1515610a6157600080fd5b610a6a83611374565b905060008114151515610a7c57600080fd5b610a84611b08565b81101515610a9157600080fd5b610a9c8484836125a2565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d8584604051808381526020018281526020019250505060405180910390a3610b1283612798565b610b1b816128aa565b600191505092915050565b60065481565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ba857600080fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515610bfc57600080fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610d1157600080fd5b6102c65a03f11515610d2257600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600d60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836005811115610da257fe5b60ff168152602001828152602001935050505060405180910390a1505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1f57600080fd5b620186a08210151515610e3157600080fd5b8160088190555060019050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e9c57600080fd5b6003600d60006101000a81548160ff02191690836005811115610ebb57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115610f0157fe5b60ff16815260200191505060405180910390a160003073ffffffffffffffffffffffffffffffffffffffff16311115610f5557610f543073ffffffffffffffffffffffffffffffffffffffff1631612798565b5b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fb257600080fd5b6001600d60006101000a81548160ff02191690836005811115610fd157fe5b02179055506001600d60016101000a81548160ff02191690836003811115610ff557fe5b021790555061100381610dc2565b507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff166040518082600581111561104557fe5b60ff16815260200191505060405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110b957600080fd5b600460058111156110c657fe5b600d60009054906101000a900460ff1660058111156110e157fe5b1415156110ed57600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111151561114157600080fd5b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561125657600080fd5b6102c65a03f1151561126757600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600191505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561134357600080fd5b80600381111561134f57fe5b600d60016101000a81548160ff0219169083600381111561136c57fe5b021790555050565b6000600754600854830281151561138757fe5b049050809050919050565b60075481565b60045481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113fb57600080fd5b6005600d60006101000a81548160ff0219169083600581111561141a57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff166040518082600581111561146057fe5b60ff16815260200191505060405180910390a161147b611b08565b9050611486816128aa565b600081111561160957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561155c57600080fd5b6102c65a03f1151561156d57600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600d60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018360058111156115ed57fe5b60ff168152602001828152602001935050505060405180910390a15b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561166857600080fd5b611671826123c8565b1515611806576103e88102600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506001600a80548060010182816116d891906129ee565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508173ffffffffffffffffffffffffffffffffffffffff167f66731e9585532396e86cce538ac325969df87ba505a0913c37b798d30e95215d600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015483604051808381526020018281526020019250505060405180910390a25b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061183e846128c8565b151561184957600080fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600554905090565b60006012600a0a600854830281151561193e57fe5b049050919050565b6000600c80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119ae57600080fd5b6004600d60006101000a81548160ff021916908360058111156119cd57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115611a1357fe5b60ff16815260200191505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a8357600080fd5b806005811115611a8f57fe5b600d60006101000a81548160ff02191690836005811115611aac57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600d60009054906101000a900460ff1660405180826005811115611af257fe5b60ff16815260200191505060405180910390a150565b600060055460045403905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7457600080fd5b60046005811115611b8157fe5b600d60009054906101000a900460ff166005811115611b9c57fe5b141515611ba857600080fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515611bfc57600080fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611d5957600080fd5b6102c65a03f11515611d6a57600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050919050565b600080611df6836123c8565b1515611e0157600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015491509150915091565b600d60009054906101000a900460ff1681565b600381815481101515611eb257fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60085481565b600d60019054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f5e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f9a57600080fd5b60038054806001018281611fae91906129ee565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b60006003600581111561201557fe5b600d60009054906101000a900460ff16600581111561203057fe5b14905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561209357600080fd5b600090505b82518110156120e6576120d983828151811015156120b257fe5b9060200190602002015183838151811015156120ca57fe5b9060200190602002015161160d565b8080600101915050612098565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561214657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561218257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229e57600080fd5b6000831115156122ad57600080fd5b601260ff16600a0a830290506122c1611b08565b811015156122ce57600080fd5b6122da846000836125a2565b6122e3816128aa565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d600084604051808381526020018281526020019250505060405180910390a3600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060065461239083611929565b109050919050565b6000600160038111156123a757fe5b600d60019054906101000a900460ff1660038111156123c257fe5b14905090565b600080600a8054905014156123e0576000905061248e565b8173ffffffffffffffffffffffffffffffffffffffff16600a600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481548110151561244857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b600061249d612398565b80156124ae57506124ad836123c8565b5b1561254c57600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612543600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548401611929565b1115905061259c565b612599600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101548301612382565b90505b92915050565b6125ab836128c8565b151561265d576001600c80548060010182816125c791906129ee565b9160005260206000209001600086909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b6126b281600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461299390919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061274d82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461299390919063ffffffff16565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b600080600060038054905011156128a55760016127b96003805490506129b1565b0391506003828154811015156127cb57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561283957600080fd5b7f35c019e24e057e2b74358b61c59c75be70dc488b1c5f97fd5b9dfe58f6df04e88184604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b6128bf8160055461299390919063ffffffff16565b60058190555050565b600080600c8054905014156128e0576000905061298e565b8173ffffffffffffffffffffffffffffffffffffffff16600c600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015481548110151561294857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60008082840190508381101515156129a757fe5b8091505092915050565b600060018260014303406040518082600019166000191681526020019150506040518091039020600190048115156129e557fe5b06019050919050565b815481835581811511612a1557818360005260206000209182019101612a149190612a1a565b5b505050565b612a3c91905b80821115612a38576000816000905550600101612a20565b5090565b905600a165627a7a7230582031f0f524ada83e60eaa8366139b70f02d7ec18aa896b88952e26028c5978748a0029

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

000000000000000000000000fb2f26f266fb2805a387230f2aa0a331b4d96fba0000000000000000000000000000000000000000000000000000000000989680

-----Decoded View---------------
Arg [0] : _token (address): 0xFb2f26F266Fb2805a387230f2aa0a331b4d96Fba
Arg [1] : _tokenSupply (uint256): 10000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000fb2f26f266fb2805a387230f2aa0a331b4d96fba
Arg [1] : 0000000000000000000000000000000000000000000000000000000000989680


Swarm Source

bzzr://31f0f524ada83e60eaa8366139b70f02d7ec18aa896b88952e26028c5978748a

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.