ETH Price: $1,594.37 (-2.65%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Distribute Token...66044372018-10-29 9:03:042360 days ago1540803784IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...65756792018-10-24 16:11:132365 days ago1540397473IN
0x29880855...f286d914E
0 ETH0.0024991640
Distribute Token...65756772018-10-24 16:10:362365 days ago1540397436IN
0x29880855...f286d914E
0 ETH0.0030991640
Distribute Token...64952592018-10-11 13:23:482378 days ago1539264228IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...64952572018-10-11 13:23:282378 days ago1539264208IN
0x29880855...f286d914E
0 ETH0.0030991640
Distribute Token...63302162018-09-14 12:43:192405 days ago1536928999IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...63302152018-09-14 12:43:132405 days ago1536928993IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63302132018-09-14 12:42:332405 days ago1536928953IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112452018-09-11 9:11:172408 days ago1536657077IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...63112432018-09-11 9:10:542408 days ago1536657054IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112412018-09-11 9:10:292408 days ago1536657029IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112392018-09-11 9:09:592408 days ago1536656999IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112372018-09-11 9:08:592408 days ago1536656939IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112352018-09-11 9:08:292408 days ago1536656909IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63112332018-09-11 9:08:202408 days ago1536656900IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...63111352018-09-11 8:48:062408 days ago1536655686IN
0x29880855...f286d914E
0 ETH0.0019017240
Distribute Token...63111332018-09-11 8:47:312408 days ago1536655651IN
0x29880855...f286d914E
0 ETH0.0030991640
Distribute Token...63111312018-09-11 8:47:082408 days ago1536655628IN
0x29880855...f286d914E
0 ETH0.0031017240
Transfer61452932018-08-14 10:01:502436 days ago1534240910IN
0x29880855...f286d914E
0.32 ETH0.00086141
Transfer61214032018-08-10 8:57:492440 days ago1533891469IN
0x29880855...f286d914E
0.2 ETH0.0008771141
Distribute Token...60327572018-07-26 9:50:432455 days ago1532598643IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...60327572018-07-26 9:50:432455 days ago1532598643IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...59495532018-07-12 7:47:242469 days ago1531381644IN
0x29880855...f286d914E
0 ETH0.0025017240
Distribute Token...59495532018-07-12 7:47:242469 days ago1531381644IN
0x29880855...f286d914E
0 ETH0.0031017240
Distribute Token...59047292018-07-04 15:07:472477 days ago1530716867IN
0x29880855...f286d914E
0 ETH0.0025017240
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer49943252018-01-29 14:38:142633 days ago1517236694
0x29880855...f286d914E
0.1 ETH
Transfer49943172018-01-29 14:35:572633 days ago1517236557
0x29880855...f286d914E
4.264 ETH
Transfer49940452018-01-29 13:25:332633 days ago1517232333
0x29880855...f286d914E
0.00221002 ETH
Transfer49939742018-01-29 13:04:272633 days ago1517231067
0x29880855...f286d914E
0.001 ETH
Transfer49939702018-01-29 13:03:422633 days ago1517231022
0x29880855...f286d914E
0.005 ETH
Transfer49939692018-01-29 13:03:212633 days ago1517231001
0x29880855...f286d914E
0.5756635 ETH
Transfer49939212018-01-29 12:51:022633 days ago1517230262
0x29880855...f286d914E
0.01 ETH
Transfer49939162018-01-29 12:47:062633 days ago1517230026
0x29880855...f286d914E
0.00000411 ETH
Transfer49939162018-01-29 12:47:062633 days ago1517230026
0x29880855...f286d914E
0.00243301 ETH
Transfer49939112018-01-29 12:46:202633 days ago1517229980
0x29880855...f286d914E
0.00046905 ETH
Transfer49939112018-01-29 12:46:202633 days ago1517229980
0x29880855...f286d914E
0.028 ETH
Transfer49939112018-01-29 12:46:202633 days ago1517229980
0x29880855...f286d914E
0.05 ETH
Transfer49939112018-01-29 12:46:202633 days ago1517229980
0x29880855...f286d914E
0.1 ETH
Transfer49939112018-01-29 12:46:202633 days ago1517229980
0x29880855...f286d914E
0.25 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.2 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.256 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.256 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.18762366 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.55 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
1.25 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.40336 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
3.05997134 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
2.98492188 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.95 ETH
Transfer49939102018-01-29 12:46:122633 days ago1517229972
0x29880855...f286d914E
0.1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DadiPublicSale

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-29
*/

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;
    require(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // require(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // require(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) {
    require(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(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 Public sale Contract
*/
contract DadiPublicSale is Ownable {
    using SafeMath for uint256;

    StandardToken public token;                         // The DADI ERC20 token */

    uint256 public tokenSupply;
    uint256 public tokensPurchased = 0;
    uint256 public individualCap = 5000 * 1000;         // USD$5,000
    uint256 public tokenPrice = 500;                    // USD$0.50
    uint256 public ethRate;                             // ETH to USD Rate, set by owner: 1 ETH = ethRate USD
    uint256 public maxGasPrice;                         // Max gas price for contributing transactions.
 
    address[] public saleWallets;
    mapping(address => Investor) private investors;
    address[] private investorIndex;

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

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

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

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

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

        token = StandardToken(_token);
        tokenSupply = _tokenSupply * (uint256(10) ** 18);
        maxGasPrice = 60000000000;       // 60 Gwei
    }

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

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

        saleWallets.push(_wallet);
        return true;
    }

    /*****
    * @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 / tokenPrice;
        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 start the Public sale
    * @param rate   uint256  the current ETH USD rate, multiplied by 1000
    */
    function startPublicSale (uint256 rate) public onlyOwner {
        state = SaleState.PublicSale;
        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 successful
    */
    function updateEthRate (uint256 rate) public onlyOwner returns (bool) {
        require(rate >= 100000);
        
        ethRate = rate;
        return true;
    }

    /*****
    * @dev Allow updating the max gas price
    * @param _maxGasPrice   uint256  the maximum gas price for a transaction, in Gwei
    */
    function updateMaxGasPrice(uint256 _maxGasPrice) public onlyOwner {
        require(_maxGasPrice > 0);

        maxGasPrice = _maxGasPrice;
    }

    /*****
    * @dev Allows transfer of tokens to a recipient who has purchased offline, during the PublicSale
    * @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 sale 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);

        require(investors[_address].distributed == false);

        investors[_address].distributed = true;
        // 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);

        require(investors[_purchaseAddress].distributed == false);

        investors[_purchaseAddress].distributed = true;

        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);
        require(investors[investorAddress].distributed == false);
        
        // remove tokens, so they can't be redistributed
        // investors[investorAddress].tokens = 0;
        investors[investorAddress].distributed = true;
        token.transfer(recipient, tokens);

        LogRedistributeTokens(recipient, state, tokens);
    }

    /*****
    * @dev Get the amount of 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
    * @return uint256 the count of tokens purchased
    */
    function getTokensPurchased () public constant returns (uint256) {
        return tokensPurchased;
    }

    /*****
    * @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 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, bool distributed, uint index) {
        require(isInvested(_address));
        return(investors[_address].contribution, investors[_address].tokens, investors[_address].distributed, investors[_address].index);
    }

    /*****
    * @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);
        investors[_address].distributed = false;
    }

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

        // move funds to a random saleWallet
        if (saleWallets.length > 0) {
            accountNumber = getRandom(saleWallets.length) - 1;
            account = saleWallets[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(tx.gasprice <= maxGasPrice);

        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
        require(boughtTokens <= getTokensAvailable());

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

        forwardFunds(_value);

        updateSaleParameters(boughtTokens);

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

        return true;
    }

    /*****
    * @dev Check that the amount sent in the transaction is below the individual cap
    * Factors in previous transactions by the same investor
    * @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) {
        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);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"individualCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"addSaleWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"saleWallets","outputs":[{"name":"","type":"address"}],"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":true,"inputs":[],"name":"maxGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"_maxGasPrice","type":"uint256"}],"name":"updateMaxGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeSale","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":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"calculateTokens","outputs":[{"name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rate","type":"uint256"}],"name":"startPublicSale","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"tokenPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getInvestor","outputs":[{"name":"contribution","type":"uint256"},{"name":"tokens","type":"uint256"},{"name":"distributed","type":"bool"},{"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":"state","outputs":[{"name":"","type":"uint8"}],"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":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":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526000600355624c4b406004556101f46005556000600b60006101000a81548160ff0219169083600581111561003557fe5b0217905550341561004557600080fd5b60405160408061260c83398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156100e657600080fd5b600081141515156100f657600080fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012600a0a8102600281905550640df847580060078190555050506124ab806101616000396000f300606060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630276650b146101c657806308d9a77b146101ef5780631ccea71b146102405780633d1e215d146102a35780633de39c11146102fb5780633f6f7ed614610324578063481463411461035f57806358a687ec14610382578063616d1fab1461039757806371aa60fd1461040757806374817d9b1461043e5780637824407f14610461578063794913701461048a5780637ff9b596146104c35780638da5cb5b146104ec5780638f35a75e1461054157806391667aef146105a7578063946d1480146105d0578063960524e3146106075780639640639114610630578063a9e966b714610645578063aaa5ad6114610668578063b1d17c9814610691578063c19d93fb146106e2578063cc4d819c14610719578063d2d93f9014610742578063f2fde38b1461076b578063f54e7a40146107a4578063fc0c546a146107fe575b6000341415151561018557600080fd5b6001600581111561019257fe5b600b60009054906101000a900460ff1660058111156101ad57fe5b1415156101b957600080fd5b6101c33334610853565b50005b34156101d157600080fd5b6101d9610942565b6040518082815260200191505060405180910390f35b34156101fa57600080fd5b610226600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610948565b604051808215151515815260200191505060405180910390f35b341561024b57600080fd5b6102616004808035906020019091905050610a4d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102f9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a8c565b005b341561030657600080fd5b61030e610d78565b6040518082815260200191505060405180910390f35b341561032f57600080fd5b6103456004808035906020019091905050610d7e565b604051808215151515815260200191505060405180910390f35b341561036a57600080fd5b6103806004808035906020019091905050610dfd565b005b341561038d57600080fd5b610395610e71565b005b34156103a257600080fd5b6103ed600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f87565b604051808215151515815260200191505060405180910390f35b341561041257600080fd5b6104286004808035906020019091905050611289565b6040518082815260200191505060405180910390f35b341561044957600080fd5b61045f60048080359060200190919050506112a7565b005b341561046c57600080fd5b610474611387565b6040518082815260200191505060405180910390f35b341561049557600080fd5b6104c1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061138d565b005b34156104ce57600080fd5b6104d66115fc565b6040518082815260200191505060405180910390f35b34156104f757600080fd5b6104ff611602565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054c57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611627565b604051808581526020018481526020018315151515815260200182815260200194505050505060405180910390f35b34156105b257600080fd5b6105ba611769565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105f16004808035906020019091905050611773565b6040518082815260200191505060405180910390f35b341561061257600080fd5b61061a611790565b6040518082815260200191505060405180910390f35b341561063b57600080fd5b61064361179d565b005b341561065057600080fd5b6106666004808035906020019091905050611872565b005b341561067357600080fd5b61067b611952565b6040518082815260200191505060405180910390f35b341561069c57600080fd5b6106c8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611960565b604051808215151515815260200191505060405180910390f35b34156106ed57600080fd5b6106f5611c61565b6040518082600581111561070557fe5b60ff16815260200191505060405180910390f35b341561072457600080fd5b61072c611c74565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610755611c7a565b6040518082815260200191505060405180910390f35b341561077657600080fd5b6107a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c80565b005b34156107af57600080fd5b6107e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611dd5565b604051808215151515815260200191505060405180910390f35b341561080957600080fd5b610811611ef1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806007543a1115151561086757600080fd5b6108718484611f17565b151561087c57600080fd5b61088583611289565b90506000811415151561089757600080fd5b61089f611952565b81111515156108ad57600080fd5b6108b8848483611f6e565b6108c1836121bf565b6108ca816122d1565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d8584604051808381526020018281526020019250505060405180910390a3600191505092915050565b60045481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156109e157600080fd5b600880548060010182816109f5919061242e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b600881815481101515610a5c57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ae957600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515610b3d57600080fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515141515610b9f57600080fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610cc757600080fd5b6102c65a03f11515610cd857600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600b60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836005811115610d5857fe5b60ff168152602001828152602001935050505060405180910390a1505050565b60075481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ddb57600080fd5b620186a08210151515610ded57600080fd5b8160068190555060019050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e5857600080fd5b600081111515610e6757600080fd5b8060078190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ecc57600080fd5b6003600b60006101000a81548160ff02191690836005811115610eeb57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff1660405180826005811115610f3157fe5b60ff16815260200191505060405180910390a160003073ffffffffffffffffffffffffffffffffffffffff16311115610f8557610f843073ffffffffffffffffffffffffffffffffffffffff16316121bf565b5b565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe557600080fd5b60046005811115610ff257fe5b600b60009054906101000a900460ff16600581111561100d57fe5b14151561101957600080fd5b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111151561106d57600080fd5b60001515600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615151415156110cf57600080fd5b6001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156111f757600080fd5b6102c65a03f1151561120857600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600191505092915050565b6000600554600654830281151561129c57fe5b049050809050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561130257600080fd5b6001600b60006101000a81548160ff0219169083600581111561132157fe5b021790555061132f81610d7e565b507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561137157fe5b60ff16815260200191505060405180910390a150565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ea57600080fd5b6005600b60006101000a81548160ff0219169083600581111561140957fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561144f57fe5b60ff16815260200191505060405180910390a161146a611952565b9050611475816122d1565b60008111156115f857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561154b57600080fd5b6102c65a03f1151561155c57600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600b60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018360058111156115dc57fe5b60ff168152602001828152602001935050505060405180910390a15b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080611636856122ef565b151561164157600080fd5b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff16600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015493509350935093509193509193565b6000600354905090565b60006012600a0a600654830281151561178857fe5b049050919050565b6000600a80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117f857600080fd5b6004600b60006101000a81548160ff0219169083600581111561181757fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561185d57fe5b60ff16815260200191505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118cd57600080fd5b8060058111156118d957fe5b600b60006101000a81548160ff021916908360058111156118f657fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561193c57fe5b60ff16815260200191505060405180910390a150565b600060035460025403905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119be57600080fd5b600460058111156119cb57fe5b600b60009054906101000a900460ff1660058111156119e657fe5b1415156119f257600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515611a4657600080fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515141515611aa857600080fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611bd057600080fd5b6102c65a03f11515611be157600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050919050565b600b60009054906101000a900460ff1681565b60035481565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cdb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d1757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e3357600080fd5b600083111515611e4257600080fd5b601260ff16600a0a83029050611e56611952565b81101515611e6357600080fd5b611e6f84600083611f6e565b611e78816122d1565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d600084604051808381526020018281526020019250505060405180910390a3600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611f66600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015483016123ba565b905092915050565b611f77836122ef565b1515612029576001600a8054806001018281611f93919061242e565b9160005260206000209001600086909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b61207e81600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546123d090919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061211982600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546123d090919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550505050565b600080600060088054905011156122cc5760016121e06008805490506123f1565b0391506008828154811015156121f257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561226057600080fd5b7f35c019e24e057e2b74358b61c59c75be70dc488b1c5f97fd5b9dfe58f6df04e88184604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b6122e6816003546123d090919063ffffffff16565b60038190555050565b600080600a80549050141561230757600090506123b5565b8173ffffffffffffffffffffffffffffffffffffffff16600a600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015481548110151561236f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60006004546123c883611773565b109050919050565b60008082840190508381101515156123e757600080fd5b8091505092915050565b6000600182600143034060405180826000191660001916815260200191505060405180910390206001900481151561242557fe5b06019050919050565b81548183558181151161245557818360005260206000209182019101612454919061245a565b5b505050565b61247c91905b80821115612478576000816000905550600101612460565b5090565b905600a165627a7a72305820f0f35fa61d76143be553ce4f4fe922e18e9ecdb73017b4b62d4493f816f4fe630029000000000000000000000000fb2f26f266fb2805a387230f2aa0a331b4d96fba0000000000000000000000000000000000000000000000000000000002faf080

Deployed Bytecode

0x606060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630276650b146101c657806308d9a77b146101ef5780631ccea71b146102405780633d1e215d146102a35780633de39c11146102fb5780633f6f7ed614610324578063481463411461035f57806358a687ec14610382578063616d1fab1461039757806371aa60fd1461040757806374817d9b1461043e5780637824407f14610461578063794913701461048a5780637ff9b596146104c35780638da5cb5b146104ec5780638f35a75e1461054157806391667aef146105a7578063946d1480146105d0578063960524e3146106075780639640639114610630578063a9e966b714610645578063aaa5ad6114610668578063b1d17c9814610691578063c19d93fb146106e2578063cc4d819c14610719578063d2d93f9014610742578063f2fde38b1461076b578063f54e7a40146107a4578063fc0c546a146107fe575b6000341415151561018557600080fd5b6001600581111561019257fe5b600b60009054906101000a900460ff1660058111156101ad57fe5b1415156101b957600080fd5b6101c33334610853565b50005b34156101d157600080fd5b6101d9610942565b6040518082815260200191505060405180910390f35b34156101fa57600080fd5b610226600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610948565b604051808215151515815260200191505060405180910390f35b341561024b57600080fd5b6102616004808035906020019091905050610a4d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102f9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a8c565b005b341561030657600080fd5b61030e610d78565b6040518082815260200191505060405180910390f35b341561032f57600080fd5b6103456004808035906020019091905050610d7e565b604051808215151515815260200191505060405180910390f35b341561036a57600080fd5b6103806004808035906020019091905050610dfd565b005b341561038d57600080fd5b610395610e71565b005b34156103a257600080fd5b6103ed600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f87565b604051808215151515815260200191505060405180910390f35b341561041257600080fd5b6104286004808035906020019091905050611289565b6040518082815260200191505060405180910390f35b341561044957600080fd5b61045f60048080359060200190919050506112a7565b005b341561046c57600080fd5b610474611387565b6040518082815260200191505060405180910390f35b341561049557600080fd5b6104c1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061138d565b005b34156104ce57600080fd5b6104d66115fc565b6040518082815260200191505060405180910390f35b34156104f757600080fd5b6104ff611602565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054c57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611627565b604051808581526020018481526020018315151515815260200182815260200194505050505060405180910390f35b34156105b257600080fd5b6105ba611769565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105f16004808035906020019091905050611773565b6040518082815260200191505060405180910390f35b341561061257600080fd5b61061a611790565b6040518082815260200191505060405180910390f35b341561063b57600080fd5b61064361179d565b005b341561065057600080fd5b6106666004808035906020019091905050611872565b005b341561067357600080fd5b61067b611952565b6040518082815260200191505060405180910390f35b341561069c57600080fd5b6106c8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611960565b604051808215151515815260200191505060405180910390f35b34156106ed57600080fd5b6106f5611c61565b6040518082600581111561070557fe5b60ff16815260200191505060405180910390f35b341561072457600080fd5b61072c611c74565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610755611c7a565b6040518082815260200191505060405180910390f35b341561077657600080fd5b6107a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c80565b005b34156107af57600080fd5b6107e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611dd5565b604051808215151515815260200191505060405180910390f35b341561080957600080fd5b610811611ef1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806007543a1115151561086757600080fd5b6108718484611f17565b151561087c57600080fd5b61088583611289565b90506000811415151561089757600080fd5b61089f611952565b81111515156108ad57600080fd5b6108b8848483611f6e565b6108c1836121bf565b6108ca816122d1565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d8584604051808381526020018281526020019250505060405180910390a3600191505092915050565b60045481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156109e157600080fd5b600880548060010182816109f5919061242e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b600881815481101515610a5c57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ae957600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515610b3d57600080fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515141515610b9f57600080fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610cc757600080fd5b6102c65a03f11515610cd857600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600b60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836005811115610d5857fe5b60ff168152602001828152602001935050505060405180910390a1505050565b60075481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ddb57600080fd5b620186a08210151515610ded57600080fd5b8160068190555060019050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e5857600080fd5b600081111515610e6757600080fd5b8060078190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ecc57600080fd5b6003600b60006101000a81548160ff02191690836005811115610eeb57fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff1660405180826005811115610f3157fe5b60ff16815260200191505060405180910390a160003073ffffffffffffffffffffffffffffffffffffffff16311115610f8557610f843073ffffffffffffffffffffffffffffffffffffffff16316121bf565b5b565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe557600080fd5b60046005811115610ff257fe5b600b60009054906101000a900460ff16600581111561100d57fe5b14151561101957600080fd5b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111151561106d57600080fd5b60001515600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615151415156110cf57600080fd5b6001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156111f757600080fd5b6102c65a03f1151561120857600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600191505092915050565b6000600554600654830281151561129c57fe5b049050809050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561130257600080fd5b6001600b60006101000a81548160ff0219169083600581111561132157fe5b021790555061132f81610d7e565b507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561137157fe5b60ff16815260200191505060405180910390a150565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ea57600080fd5b6005600b60006101000a81548160ff0219169083600581111561140957fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561144f57fe5b60ff16815260200191505060405180910390a161146a611952565b9050611475816122d1565b60008111156115f857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561154b57600080fd5b6102c65a03f1151561155c57600080fd5b50505060405180519050507f8a1bda63f5f60920a84caac25ec9eb9f26a6c01e1682229db0268c5a5c92453482600b60009054906101000a900460ff1683604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018360058111156115dc57fe5b60ff168152602001828152602001935050505060405180910390a15b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080611636856122ef565b151561164157600080fd5b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff16600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015493509350935093509193509193565b6000600354905090565b60006012600a0a600654830281151561178857fe5b049050919050565b6000600a80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117f857600080fd5b6004600b60006101000a81548160ff0219169083600581111561181757fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561185d57fe5b60ff16815260200191505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118cd57600080fd5b8060058111156118d957fe5b600b60006101000a81548160ff021916908360058111156118f657fe5b02179055507fc33408924c47a75c436c6caca09732b718f7c974a19cebe04dc816a990d0c174600b60009054906101000a900460ff166040518082600581111561193c57fe5b60ff16815260200191505060405180910390a150565b600060035460025403905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119be57600080fd5b600460058111156119cb57fe5b600b60009054906101000a900460ff1660058111156119e657fe5b1415156119f257600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111515611a4657600080fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff161515141515611aa857600080fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611bd057600080fd5b6102c65a03f11515611be157600080fd5b50505060405180519050507f388b9f37b6cbb3a30ba34c69072e43e77eb3714381366d456e84dcd1430968678382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050919050565b600b60009054906101000a900460ff1681565b60035481565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cdb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d1757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e3357600080fd5b600083111515611e4257600080fd5b601260ff16600a0a83029050611e56611952565b81101515611e6357600080fd5b611e6f84600083611f6e565b611e78816122d1565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff370ff51765588b4b12b4ccf319b865dd3499a57df818acfe82c2740e41c878d600084604051808381526020018281526020019250505060405180910390a3600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611f66600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015483016123ba565b905092915050565b611f77836122ef565b1515612029576001600a8054806001018281611f93919061242e565b9160005260206000209001600086909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b61207e81600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546123d090919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061211982600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546123d090919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff021916908315150217905550505050565b600080600060088054905011156122cc5760016121e06008805490506123f1565b0391506008828154811015156121f257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561226057600080fd5b7f35c019e24e057e2b74358b61c59c75be70dc488b1c5f97fd5b9dfe58f6df04e88184604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b6122e6816003546123d090919063ffffffff16565b60038190555050565b600080600a80549050141561230757600090506123b5565b8173ffffffffffffffffffffffffffffffffffffffff16600a600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015481548110151561236f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b60006004546123c883611773565b109050919050565b60008082840190508381101515156123e757600080fd5b8091505092915050565b6000600182600143034060405180826000191660001916815260200191505060405180910390206001900481151561242557fe5b06019050919050565b81548183558181151161245557818360005260206000209182019101612454919061245a565b5b505050565b61247c91905b80821115612478576000816000905550600101612460565b5090565b905600a165627a7a72305820f0f35fa61d76143be553ce4f4fe922e18e9ecdb73017b4b62d4493f816f4fe630029

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

000000000000000000000000fb2f26f266fb2805a387230f2aa0a331b4d96fba0000000000000000000000000000000000000000000000000000000002faf080

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

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


Swarm Source

bzzr://f0f35fa61d76143be553ce4f4fe922e18e9ecdb73017b4b62d4493f816f4fe63

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.