Contract Overview
ETH Balance: 0 Ether
No Of Transactions: 4 txns
  Latest 4 txns

TxHash Age From To Value [TxFee]
0x3b7325a8c9c3e01c695ca361f9beae60ce61938c46378889491ef5db8d2e639266 days 7 hrs ago0x1d0d0a2dd342a6f5cfd455449487a73b7cdd5b5f  IN   0x4ae83d78d9601d253b39239d6c1d66ceb89d82f70.02 Ether0.0063
0x8b536f83c5ba1d4e3839c789264e24bfd7a4def8054387f7f0b0b30b13a1dad166 days 8 hrs ago0x1d0d0a2dd342a6f5cfd455449487a73b7cdd5b5f  IN   0x4ae83d78d9601d253b39239d6c1d66ceb89d82f70.025 Ether0.0063
0xd849416d12a64a91b07a223029e05a876c4e4d5c9e1de5aaadbe2567a7cba1e166 days 8 hrs ago0x525af434f9ed52d3b44f4d37a0e9fcada026cd7c  IN   0x4ae83d78d9601d253b39239d6c1d66ceb89d82f70 Ether0.0045577
0x6d17b1f93ecbe288bbfe17498060cbdea61615d3a74c319f7674735de1c176d466 days 8 hrs ago0x525af434f9ed52d3b44f4d37a0e9fcada026cd7c  IN    Contract Creation0 Ether0.28249068
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity) Solidity compiler bugs.

Contract Source Code Verified
Contract Name: MintedTokenCappedCrowdsale
Compiler Version: v0.4.14+commit.c2215d46
Optimization Enabled: Yes
Runs (Optimiser):  500



  Contract Source Code   Find Similiar Contracts
/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */


/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */




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

  function div(uint256 a, uint256 b) internal constant 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 constant returns (uint256) {
    assert(b <= a);
    return a - b;
  }

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

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */




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


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

}


/*
 * Haltable
 *
 * Abstract contract that allows children to implement an
 * emergency stop mechanism. Differs from Pausable by causing a throw when in halt mode.
 *
 *
 * Originally envisioned in FirstBlood ICO contract.
 */
contract Haltable is Ownable {
  bool public halted;

  modifier stopInEmergency {
    if (halted) throw;
    _;
  }

  modifier stopNonOwnersInEmergency {
    if (halted && msg.sender != owner) throw;
    _;
  }

  modifier onlyInEmergency {
    if (!halted) throw;
    _;
  }

  // called by the owner on emergency, triggers stopped state
  function halt() external onlyOwner {
    halted = true;
  }

  // called by the owner on end of emergency, returns to normal state
  function unhalt() external onlyOwner onlyInEmergency {
    halted = false;
  }

}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */


/**
 * Interface for defining crowdsale pricing.
 */
contract PricingStrategy {

  /** Interface declaration. */
  function isPricingStrategy() public constant returns (bool) {
    return true;
  }

  /** Self check if all references are correctly set.
   *
   * Checks that pricing strategy matches crowdsale parameters.
   */
  function isSane(address crowdsale) public constant returns (bool) {
    return true;
  }

  /**
   * @dev Pricing tells if this is a presale purchase or not.
     @param purchaser Address of the purchaser
     @return False by default, true if a presale purchaser
   */
  function isPresalePurchase(address purchaser) public constant returns (bool) {
    return false;
  }

  /**
   * When somebody tries to buy tokens for X eth, calculate how many tokens they get.
   *
   *
   * @param value - What is the value of the transaction send in as wei
   * @param tokensSold - how much tokens have been sold this far
   * @param weiRaised - how much money has been raised this far in the main token sale - this number excludes presale
   * @param msgSender - who is the investor of this transaction
   * @param decimals - how many decimal units the token has
   * @return Amount of tokens the investor receives
   */
  function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint tokenAmount);
}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */


/**
 * Finalize agent defines what happens at the end of succeseful crowdsale.
 *
 * - Allocate tokens for founders, bounties and community
 * - Make tokens transferable
 * - etc.
 */
contract FinalizeAgent {

  function isFinalizeAgent() public constant returns(bool) {
    return true;
  }

  /** Return true if we can run finalizeCrowdsale() properly.
   *
   * This is a safety check function that doesn't allow crowdsale to begin
   * unless the finalizer has been set up properly.
   */
  function isSane() public constant returns (bool);

  /** Called once by crowdsale finalize() if the sale was success. */
  function finalizeCrowdsale();

}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */






/**
 * @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) constant returns (uint256);
  function transfer(address to, uint256 value) returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}



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


/**
 * A token that defines fractional units as decimals.
 */
contract FractionalERC20 is ERC20 {

  uint public decimals;

}



/**
 * Abstract base contract for token sales.
 *
 * Handle
 * - start and end dates
 * - accepting investments
 * - minimum funding goal and refund
 * - various statistics during the crowdfund
 * - different pricing strategies
 * - different investment policies (require server side customer id, allow only whitelisted addresses)
 *
 */
contract Crowdsale is Haltable {

  /* Max investment count when we are still allowed to change the multisig address */
  uint public MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE = 5;

  using SafeMath for uint;

  /* The token we are selling */
  FractionalERC20 public token;

  /* How we are going to price our offering */
  PricingStrategy public pricingStrategy;

  /* Post-success callback */
  FinalizeAgent public finalizeAgent;

  /* tokens will be transfered from this address */
  address public multisigWallet;

  /* if the funding goal is not reached, investors may withdraw their funds */
  uint public minimumFundingGoal;

  /* the UNIX timestamp start date of the crowdsale */
  uint public startsAt;

  /* the UNIX timestamp end date of the crowdsale */
  uint public endsAt;

  /* the number of tokens already sold through this contract*/
  uint public tokensSold = 0;

  /* How many wei of funding we have raised */
  uint public weiRaised = 0;

  /* Calculate incoming funds from presale contracts and addresses */
  uint public presaleWeiRaised = 0;

  /* How many distinct addresses have invested */
  uint public investorCount = 0;

  /* How much wei we have returned back to the contract after a failed crowdfund. */
  uint public loadedRefund = 0;

  /* How much wei we have given back to investors.*/
  uint public weiRefunded = 0;

  /* Has this crowdsale been finalized */
  bool public finalized;

  /* Do we need to have unique contributor id for each customer */
  bool public requireCustomerId;

  /**
    * Do we verify that contributor has been cleared on the server side (accredited investors only).
    * This method was first used in FirstBlood crowdsale to ensure all contributors have accepted terms on sale (on the web).
    */
  bool public requiredSignedAddress;

  /* Server side address that signed allowed contributors (Ethereum addresses) that can participate the crowdsale */
  address public signerAddress;

  /** How much ETH each address has invested to this crowdsale */
  mapping (address => uint256) public investedAmountOf;

  /** How much tokens this crowdsale has credited for each investor address */
  mapping (address => uint256) public tokenAmountOf;

  /** Addresses that are allowed to invest even before ICO offical opens. For testing, for ICO partners, etc. */
  mapping (address => bool) public earlyParticipantWhitelist;

  /** This is for manul testing for the interaction from owner wallet. You can set it to any value and inspect this in blockchain explorer to see that crowdsale interaction works. */
  uint public ownerTestValue;

  /** State machine
   *
   * - Preparing: All contract initialization calls and variables have not been set yet
   * - Prefunding: We have not passed start time yet
   * - Funding: Active crowdsale
   * - Success: Minimum funding goal reached
   * - Failure: Minimum funding goal not reached before ending time
   * - Finalized: The finalized has been called and succesfully executed
   * - Refunding: Refunds are loaded on the contract for reclaim.
   */
  enum State{Unknown, Preparing, PreFunding, Funding, Success, Failure, Finalized, Refunding}

  // A new investment was made
  event Invested(address investor, uint weiAmount, uint tokenAmount, uint128 customerId);

  // Refund was processed for a contributor
  event Refund(address investor, uint weiAmount);

  // The rules were changed what kind of investments we accept
  event InvestmentPolicyChanged(bool newRequireCustomerId, bool newRequiredSignedAddress, address newSignerAddress);

  // Address early participation whitelist status changed
  event Whitelisted(address addr, bool status);

  // Crowdsale end time has been changed
  event EndsAtChanged(uint newEndsAt);

  function Crowdsale(address _token, PricingStrategy _pricingStrategy, address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal) {

    owner = msg.sender;

    token = FractionalERC20(_token);

    setPricingStrategy(_pricingStrategy);

    multisigWallet = _multisigWallet;
    if(multisigWallet == 0) {
        throw;
    }

    if(_start == 0) {
        throw;
    }

    startsAt = _start;

    if(_end == 0) {
        throw;
    }

    endsAt = _end;

    // Don't mess the dates
    if(startsAt >= endsAt) {
        throw;
    }

    // Minimum funding goal can be zero
    minimumFundingGoal = _minimumFundingGoal;
  }

  /**
   * Don't expect to just send in money and get tokens.
   */
  function() payable {
    throw;
  }

  /**
   * Make an investment.
   *
   * Crowdsale must be running for one to invest.
   * We must have not pressed the emergency brake.
   *
   * @param receiver The Ethereum address who receives the tokens
   * @param customerId (optional) UUID v4 to track the successful payments on the server side
   *
   */
  function investInternal(address receiver, uint128 customerId) stopInEmergency private {

    // Determine if it's a good time to accept investment from this participant
    if(getState() == State.PreFunding) {
      // Are we whitelisted for early deposit
      if(!earlyParticipantWhitelist[receiver]) {
        throw;
      }
    } else if(getState() == State.Funding) {
      // Retail participants can only come in when the crowdsale is running
      // pass
    } else {
      // Unwanted state
      throw;
    }

    uint weiAmount = msg.value;

    // Account presale sales separately, so that they do not count against pricing tranches
    uint tokenAmount = pricingStrategy.calculatePrice(weiAmount, weiRaised.sub(presaleWeiRaised), tokensSold, msg.sender, token.decimals());

    if(tokenAmount == 0) {
      // Dust transaction
      throw;
    }

    if(investedAmountOf[receiver] == 0) {
       // A new investor
       investorCount++;
    }

    // Update investor
    investedAmountOf[receiver] = investedAmountOf[receiver].add(weiAmount);
    tokenAmountOf[receiver] = tokenAmountOf[receiver].add(tokenAmount);

    // Update totals
    weiRaised = weiRaised.add(weiAmount);
    tokensSold = tokensSold.add(tokenAmount);

    if(pricingStrategy.isPresalePurchase(receiver)) {
        presaleWeiRaised = presaleWeiRaised.add(weiAmount);
    }

    // Check that we did not bust the cap
    if(isBreakingCap(weiAmount, tokenAmount, weiRaised, tokensSold)) {
      throw;
    }

    assignTokens(receiver, tokenAmount);

    // Pocket the money
    if(!multisigWallet.send(weiAmount)) throw;

    // Tell us invest was success
    Invested(receiver, weiAmount, tokenAmount, customerId);
  }

  /**
   * Preallocate tokens for the early investors.
   *
   * Preallocated tokens have been sold before the actual crowdsale opens.
   * This function mints the tokens and moves the crowdsale needle.
   *
   * Investor count is not handled; it is assumed this goes for multiple investors
   * and the token distribution happens outside the smart contract flow.
   *
   * No money is exchanged, as the crowdsale team already have received the payment.
   *
   * @param fullTokens tokens as full tokens - decimal places added internally
   * @param weiPrice Price of a single full token in wei
   *
   */
  function preallocate(address receiver, uint fullTokens, uint weiPrice) public onlyOwner {

    require(receiver != address(0));

    uint tokenAmount = fullTokens.mul(10**token.decimals());
    require(tokenAmount != 0);
    uint weiAmount = weiPrice.mul(fullTokens); // This can be also 0, we give out tokens for free

    weiRaised = weiRaised.add(weiAmount);
    tokensSold = tokensSold.add(tokenAmount);

    investedAmountOf[receiver] = investedAmountOf[receiver].add(weiAmount);
    tokenAmountOf[receiver] = tokenAmountOf[receiver].add(tokenAmount);

    assignTokens(receiver, tokenAmount);

    // Tell us invest was success
    Invested(receiver, weiAmount, tokenAmount, 0);
  }

  /**
   * Allow anonymous contributions to this crowdsale.
   */
  function investWithSignedAddress(address addr, uint128 customerId, uint8 v, bytes32 r, bytes32 s) public payable {
     bytes32 hash = sha256(addr);
     if (ecrecover(hash, v, r, s) != signerAddress) throw;
     if(customerId == 0) throw;  // UUIDv4 sanity check
     investInternal(addr, customerId);
  }

  /**
   * Track who is the customer making the payment so we can send thank you email.
   */
  function investWithCustomerId(address addr, uint128 customerId) public payable {
    if(requiredSignedAddress) throw; // Crowdsale allows only server-side signed participants
    if(customerId == 0) throw;  // UUIDv4 sanity check
    investInternal(addr, customerId);
  }

  /**
   * Allow anonymous contributions to this crowdsale.
   */
  function invest(address addr) public payable {
    if(requireCustomerId) throw; // Crowdsale needs to track partipants for thank you email
    if(requiredSignedAddress) throw; // Crowdsale allows only server-side signed participants
    investInternal(addr, 0);
  }

  /**
   * Invest to tokens, recognize the payer and clear his address.
   *
   */
  function buyWithSignedAddress(uint128 customerId, uint8 v, bytes32 r, bytes32 s) public payable {
    investWithSignedAddress(msg.sender, customerId, v, r, s);
  }

  /**
   * Invest to tokens, recognize the payer.
   *
   */
  function buyWithCustomerId(uint128 customerId) public payable {
    investWithCustomerId(msg.sender, customerId);
  }

  /**
   * The basic entry point to participate the crowdsale process.
   *
   * Pay for funding, get invested tokens back in the sender address.
   */
  function buy() public payable {
    invest(msg.sender);
  }

  /**
   * Finalize a succcesful crowdsale.
   *
   * The owner can triggre a call the contract that provides post-crowdsale actions, like releasing the tokens.
   */
  function finalize() public inState(State.Success) onlyOwner stopInEmergency {

    // Already finalized
    if(finalized) {
      throw;
    }

    // Finalizing is optional. We only call it if we are given a finalizing agent.
    if(address(finalizeAgent) != 0) {
      finalizeAgent.finalizeCrowdsale();
    }

    finalized = true;
  }

  /**
   * Allow to (re)set finalize agent.
   *
   * Design choice: no state restrictions on setting this, so that we can fix fat finger mistakes.
   */
  function setFinalizeAgent(FinalizeAgent addr) onlyOwner {
    finalizeAgent = addr;

    // Don't allow setting bad agent
    if(!finalizeAgent.isFinalizeAgent()) {
      throw;
    }
  }

  /**
   * Set policy do we need to have server-side customer ids for the investments.
   *
   */
  function setRequireCustomerId(bool value) onlyOwner {
    requireCustomerId = value;
    InvestmentPolicyChanged(requireCustomerId, requiredSignedAddress, signerAddress);
  }

  /**
   * Set policy if all investors must be cleared on the server side first.
   *
   * This is e.g. for the accredited investor clearing.
   *
   */
  function setRequireSignedAddress(bool value, address _signerAddress) onlyOwner {
    requiredSignedAddress = value;
    signerAddress = _signerAddress;
    InvestmentPolicyChanged(requireCustomerId, requiredSignedAddress, signerAddress);
  }

  /**
   * Allow addresses to do early participation.
   *
   * TODO: Fix spelling error in the name
   */
  function setEarlyParicipantWhitelist(address addr, bool status) onlyOwner {
    earlyParticipantWhitelist[addr] = status;
    Whitelisted(addr, status);
  }

  /**
   * Allow crowdsale owner to close early or extend the crowdsale.
   *
   * This is useful e.g. for a manual soft cap implementation:
   * - after X amount is reached determine manual closing
   *
   * This may put the crowdsale to an invalid state,
   * but we trust owners know what they are doing.
   *
   */
  function setEndsAt(uint time) onlyOwner {

    if(now > time) {
      throw; // Don't change past
    }

    endsAt = time;
    EndsAtChanged(endsAt);
  }

  /**
   * Allow to (re)set pricing strategy.
   *
   * Design choice: no state restrictions on the set, so that we can fix fat finger mistakes.
   */
  function setPricingStrategy(PricingStrategy _pricingStrategy) onlyOwner {
    pricingStrategy = _pricingStrategy;

    // Don't allow setting bad agent
    if(!pricingStrategy.isPricingStrategy()) {
      throw;
    }
  }

  /**
   * Allow to change the team multisig address in the case of emergency.
   *
   * This allows to save a deployed crowdsale wallet in the case the crowdsale has not yet begun
   * (we have done only few test transactions). After the crowdsale is going
   * then multisig address stays locked for the safety reasons.
   */
  function setMultisig(address addr) public onlyOwner {

    // Change
    if(investorCount > MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE) {
      throw;
    }

    multisigWallet = addr;
  }

  /**
   * Allow load refunds back on the contract for the refunding.
   *
   * The team can transfer the funds back on the smart contract in the case the minimum goal was not reached..
   */
  function loadRefund() public payable inState(State.Failure) {
    if(msg.value == 0) throw;
    loadedRefund = loadedRefund.add(msg.value);
  }

  /**
   * Investors can claim refund.
   *
   * Note that any refunds from proxy buyers should be handled separately,
   * and not through this contract.
   */
  function refund() public inState(State.Refunding) {
    uint256 weiValue = investedAmountOf[msg.sender];
    if (weiValue == 0) throw;
    investedAmountOf[msg.sender] = 0;
    weiRefunded = weiRefunded.add(weiValue);
    Refund(msg.sender, weiValue);
    if (!msg.sender.send(weiValue)) throw;
  }

  /**
   * @return true if the crowdsale has raised enough money to be a successful.
   */
  function isMinimumGoalReached() public constant returns (bool reached) {
    return weiRaised >= minimumFundingGoal;
  }

  /**
   * Check if the contract relationship looks good.
   */
  function isFinalizerSane() public constant returns (bool sane) {
    return finalizeAgent.isSane();
  }

  /**
   * Check if the contract relationship looks good.
   */
  function isPricingSane() public constant returns (bool sane) {
    return pricingStrategy.isSane(address(this));
  }

  /**
   * Crowdfund state machine management.
   *
   * We make it a function and do not assign the result to a variable, so there is no chance of the variable being stale.
   */
  function getState() public constant returns (State) {
    if(finalized) return State.Finalized;
    else if (address(finalizeAgent) == 0) return State.Preparing;
    else if (!finalizeAgent.isSane()) return State.Preparing;
    else if (!pricingStrategy.isSane(address(this))) return State.Preparing;
    else if (block.timestamp < startsAt) return State.PreFunding;
    else if (block.timestamp <= endsAt && !isCrowdsaleFull()) return State.Funding;
    else if (isMinimumGoalReached()) return State.Success;
    else if (!isMinimumGoalReached() && weiRaised > 0 && loadedRefund >= weiRaised) return State.Refunding;
    else return State.Failure;
  }

  /** This is for manual testing of multisig wallet interaction */
  function setOwnerTestValue(uint val) onlyOwner {
    ownerTestValue = val;
  }

  /** Interface marker. */
  function isCrowdsale() public constant returns (bool) {
    return true;
  }

  //
  // Modifiers
  //

  /** Modified allowing execution only if the crowdsale is currently running.  */
  modifier inState(State state) {
    if(getState() != state) throw;
    _;
  }


  //
  // Abstract functions
  //

  /**
   * Check if the current invested breaks our cap rules.
   *
   *
   * The child contract must define their own cap setting rules.
   * We allow a lot of flexibility through different capping strategies (ETH, token count)
   * Called from invest().
   *
   * @param weiAmount The amount of wei the investor tries to invest in the current transaction
   * @param tokenAmount The amount of tokens we try to give to the investor in the current transaction
   * @param weiRaisedTotal What would be our total raised balance after this transaction
   * @param tokensSoldTotal What would be our total sold tokens count after this transaction
   *
   * @return true if taking this investment would break our cap rules
   */
  function isBreakingCap(uint weiAmount, uint tokenAmount, uint weiRaisedTotal, uint tokensSoldTotal) constant returns (bool limitBroken);

  /**
   * Check if the current crowdsale is full and we can no longer sell any tokens.
   */
  function isCrowdsaleFull() public constant returns (bool);

  /**
   * Create new tokens or transfer issued tokens to the investor depending on the cap model.
   */
  function assignTokens(address receiver, uint tokenAmount) private;
}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */







/**
 * Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
 *
 * Based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20 {

  using SafeMath for uint;

  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  /* Actual balances of token holders */
  mapping(address => uint) balances;

  /* approve() allowances */
  mapping (address => mapping (address => uint)) allowed;

  /* Interface declaration */
  function isToken() public constant returns (bool weAre) {
    return true;
  }

  function transfer(address _to, uint _value) returns (bool success) {
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

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

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) throw;

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}



/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableToken is StandardToken, Ownable {

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state  );

  /**
   * Create new tokens and allocate them to an address..
   *
   * Only callably by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent canMint public {
    totalSupply = totalSupply.add(amount);
    balances[receiver] = balances[receiver].add(amount);

    // This will make the mint transaction apper in EtherScan.io
    // We can remove this after there is a standardized minting event
    Transfer(0, receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  modifier onlyMintAgent() {
    // Only crowdsale contracts are allowed to mint new tokens
    if(!mintAgents[msg.sender]) {
        throw;
    }
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    if(mintingFinished) throw;
    _;
  }
}


/**
 * ICO crowdsale contract that is capped by amout of tokens.
 *
 * - Tokens are dynamically created during the crowdsale
 *
 *
 */
contract MintedTokenCappedCrowdsale is Crowdsale {

  /* Maximum amount of tokens this crowdsale can sell. */
  uint public maximumSellableTokens;

  function MintedTokenCappedCrowdsale(address _token, PricingStrategy _pricingStrategy, address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal, uint _maximumSellableTokens) Crowdsale(_token, _pricingStrategy, _multisigWallet, _start, _end, _minimumFundingGoal) {
    maximumSellableTokens = _maximumSellableTokens;
  }

  /**
   * Called from invest() to confirm if the curret investment does not break our cap rule.
   */
  function isBreakingCap(uint weiAmount, uint tokenAmount, uint weiRaisedTotal, uint tokensSoldTotal) constant returns (bool limitBroken) {
    return tokensSoldTotal > maximumSellableTokens;
  }

  function isCrowdsaleFull() public constant returns (bool) {
    return tokensSold >= maximumSellableTokens;
  }

  /**
   * Dynamically create tokens and assign them to the investor.
   */
  function assignTokens(address receiver, uint tokenAmount) private {
    MintableToken mintableToken = MintableToken(token);
    mintableToken.mint(receiver, tokenAmount);
  }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"ownerTestValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"requireCustomerId","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"invest","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"isPricingSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumFundingGoal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setFinalizeAgent","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"customerId","type":"uint128"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"investWithSignedAddress","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investedAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalizeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"fullTokens","type":"uint256"},{"name":"weiPrice","type":"uint256"}],"name":"preallocate","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maximumSellableTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsale","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_pricingStrategy","type":"address"}],"name":"setPricingStrategy","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"signerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRefunded","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"time","type":"uint256"}],"name":"setEndsAt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pricingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"loadedRefund","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isMinimumGoalReached","outputs":[{"name":"reached","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setRequireCustomerId","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"loadRefund","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setOwnerTestValue","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"multisigWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"customerId","type":"uint128"}],"name":"buyWithCustomerId","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"},{"name":"tokenAmount","type":"uint256"},{"name":"weiRaisedTotal","type":"uint256"},{"name":"tokensSoldTotal","type":"uint256"}],"name":"isBreakingCap","outputs":[{"name":"limitBroken","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"isFinalizerSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"earlyParticipantWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unhalt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"requiredSignedAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsaleFull","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"status","type":"bool"}],"name":"setEarlyParicipantWhitelist","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"},{"name":"_signerAddress","type":"address"}],"name":"setRequireSignedAddress","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"customerId","type":"uint128"}],"name":"investWithCustomerId","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setMultisig","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"customerId","type":"uint128"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"buyWithSignedAddress","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"presaleWeiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_pricingStrategy","type":"address"},{"name":"_multisigWallet","type":"address"},{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"},{"name":"_minimumFundingGoal","type":"uint256"},{"name":"_maximumSellableTokens","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint128"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequireCustomerId","type":"bool"},{"indexed":false,"name":"newRequiredSignedAddress","type":"bool"},{"indexed":false,"name":"newSignerAddress","type":"address"}],"name":"InvestmentPolicyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newEndsAt","type":"uint256"}],"name":"EndsAtChanged","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052600560015560006009556000600a556000600b556000600c556000600d556000600e5534156200003357600080fd5b60405160e08062002052833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b8686868686865b5b60008054600160a060020a03191633600160a060020a03161790555b60008054600160a060020a03338116600160a060020a0319928316179092556002805492891692909116919091179055620000e285640100000000620011766200016382021704565b60058054600160a060020a031916600160a060020a0386811691909117918290551615156200011057600080fd5b8215156200011d57600080fd5b60078390558115156200012f57600080fd5b60088290556007548290106200014457600080fd5b60068190555b50505060148490555050505b5050505050505062000224565b60005433600160a060020a039081169116146200017f57600080fd5b60038054600160a060020a031916600160a060020a038381169190911791829055166304bbc2556000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620001f757600080fd5b6102c65a03f115156200020957600080fd5b5050506040518051905015156200021f57600080fd5b5b5b50565b611e1e80620002346000396000f300606060405236156102615763ffffffff60e060020a6000350416630226401d811461026957806303ca0eed1461028e57806303f9c793146102b5578063062b01ce146102cb5780630a09284a146102f257806313f4e977146103175780631865c57d1461033c57806319b667da146103735780631a49803b146103945780631aae3460146103cb57806321d5c0f6146103fc57806332013ac31461042b5780633ad075ea146104525780634042b66f146104775780634551dd591461049c5780634bb278f3146104c357806350c67734146104d8578063518ab2a8146104f9578063590e1ae31461051e5780635b7633d0146105335780635da89ac0146105625780635ed7ca5b146105875780636203f09f1461059c5780636e50eb3f146105c157806378b99c24146105d9578063797d9437146106085780637c2e08a31461062d5780637f7d711e14610654578063876121021461066e5780638d51faec146106785780638da5cb5b146106905780639075becf146106bf57806397b150ca146106ee57806399e9376c1461071f5780639d3c663f1461073e578063a6f2ae3a14610771578063a7ba44c31461077b578063af468682146107a2578063b3f05b97146107c7578063b9b8af0b146107ee578063cb16e6d014610815578063cb3e64fd14610848578063d222dc041461085d578063d5d0902114610884578063d7e64c00146108ab578063eac24932146108d0578063ed68ff2c146108f6578063ef8694431461091c578063f2fde38b14610947578063f3283fba14610968578063f486972614610989578063f7c00e2f146109b4578063fc0c546a146109d9575b5b600080fd5b005b341561027457600080fd5b61027c610a08565b60405190815260200160405180910390f35b341561029957600080fd5b6102a1610a0e565b604051901515815260200160405180910390f35b610267600160a060020a0360043516610a1c565b005b34156102d657600080fd5b6102a1610a56565b604051901515815260200160405180910390f35b34156102fd57600080fd5b61027c610ad1565b60405190815260200160405180910390f35b341561032257600080fd5b61027c610ad7565b60405190815260200160405180910390f35b341561034757600080fd5b61034f610add565b6040518082600781111561035f57fe5b60ff16815260200191505060405180910390f35b341561037e57600080fd5b610267600160a060020a0360043516610c92565b005b610267600160a060020a03600435166fffffffffffffffffffffffffffffffff6024351660ff60443516606435608435610d43565b005b34156103d657600080fd5b61027c600160a060020a0360043516610e62565b60405190815260200160405180910390f35b341561040757600080fd5b61040f610e74565b604051600160a060020a03909116815260200160405180910390f35b341561043657600080fd5b610267600160a060020a0360043516602435604435610e83565b005b341561045d57600080fd5b61027c611077565b60405190815260200160405180910390f35b341561048257600080fd5b61027c61107d565b60405190815260200160405180910390f35b34156104a757600080fd5b6102a1611083565b604051901515815260200160405180910390f35b34156104ce57600080fd5b610267611089565b005b34156104e357600080fd5b610267600160a060020a0360043516611176565b005b341561050457600080fd5b61027c611227565b60405190815260200160405180910390f35b341561052957600080fd5b61026761122d565b005b341561053e57600080fd5b61040f611321565b604051600160a060020a03909116815260200160405180910390f35b341561056d57600080fd5b61027c611337565b60405190815260200160405180910390f35b341561059257600080fd5b61026761133d565b005b34156105a757600080fd5b61027c611391565b60405190815260200160405180910390f35b34156105cc57600080fd5b610267600435611397565b005b34156105e457600080fd5b61040f6113fc565b604051600160a060020a03909116815260200160405180910390f35b341561061357600080fd5b61027c61140b565b60405190815260200160405180910390f35b341561063857600080fd5b6102a1611411565b604051901515815260200160405180910390f35b341561065f57600080fd5b610267600435151561141d565b005b6102676114c6565b005b341561068357600080fd5b61026760043561150e565b005b341561069b57600080fd5b61040f611533565b604051600160a060020a03909116815260200160405180910390f35b34156106ca57600080fd5b61040f611542565b604051600160a060020a03909116815260200160405180910390f35b34156106f957600080fd5b61027c600160a060020a0360043516611551565b60405190815260200160405180910390f35b6102676fffffffffffffffffffffffffffffffff60043516611563565b005b341561074957600080fd5b6102a1600435602435604435606435611571565b604051901515815260200160405180910390f35b61026761157f565b005b341561078657600080fd5b6102a161158b565b604051901515815260200160405180910390f35b34156107ad57600080fd5b61027c6115f5565b60405190815260200160405180910390f35b34156107d257600080fd5b6102a16115fb565b604051901515815260200160405180910390f35b34156107f957600080fd5b6102a1611604565b604051901515815260200160405180910390f35b341561082057600080fd5b6102a1600160a060020a0360043516611625565b604051901515815260200160405180910390f35b341561085357600080fd5b61026761163a565b005b341561086857600080fd5b6102a16116a1565b604051901515815260200160405180910390f35b341561088f57600080fd5b6102a16116b0565b604051901515815260200160405180910390f35b34156108b657600080fd5b61027c6116bc565b60405190815260200160405180910390f35b34156108db57600080fd5b610267600160a060020a036004351660243515156116c2565b005b341561090157600080fd5b6102676004351515600160a060020a0360243516611750565b005b610267600160a060020a03600435166fffffffffffffffffffffffffffffffff6024351661181e565b005b341561095257600080fd5b610267600160a060020a0360043516611861565b005b341561097357600080fd5b610267600160a060020a03600435166118be565b005b6102676fffffffffffffffffffffffffffffffff6004351660ff60243516604435606435611917565b005b34156109bf57600080fd5b61027c61192b565b60405190815260200160405180910390f35b34156109e457600080fd5b61040f611931565b604051600160a060020a03909116815260200160405180910390f35b60135481565b600f54610100900460ff1681565b600f54610100900460ff1615610a3157600080fd5b600f5462010000900460ff1615610a4757600080fd5b610a52816000611940565b5b50565b600354600090600160a060020a0316638e76828830836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ab157600080fd5b6102c65a03f11515610ac257600080fd5b50505060405180519150505b90565b60085481565b60065481565b600f5460009060ff1615610af357506006610ace565b600454600160a060020a03161515610b0d57506001610ace565b600454600160a060020a03166382771c8e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610b5557600080fd5b6102c65a03f11515610b6657600080fd5b505050604051805190501515610b7e57506001610ace565b600354600160a060020a0316638e7682883060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610bd757600080fd5b6102c65a03f11515610be857600080fd5b505050604051805190501515610c0057506001610ace565b600754421015610c1257506002610ace565b6008544211158015610c295750610c276116b0565b155b15610c3657506003610ace565b610c3e611411565b15610c4b57506004610ace565b610c53611411565b158015610c6257506000600a54115b8015610c725750600a54600d5410155b15610c7f57506007610ace565b506005610ace565b5b5b5b5b5b5b5b5b90565b60005433600160a060020a03908116911614610cad57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290551663614cb9046000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d1857600080fd5b6102c65a03f11515610d2957600080fd5b505050604051805190501515610a5257600080fd5b5b5b50565b6000600286600060405160200152604051600160a060020a03919091166c0100000000000000000000000002815260140160206040518083038160008661646e5a03f11515610d9157600080fd5b50506040518051600f5490925063010000009004600160a060020a031690506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f11515610e1557600080fd5b505060206040510351600160a060020a031614610e3157600080fd5b6fffffffffffffffffffffffffffffffff85161515610e4f57600080fd5b610e598686611940565b5b505050505050565b60106020526000908152604090205481565b600454600160a060020a031681565b60008054819033600160a060020a03908116911614610ea157600080fd5b600160a060020a0385161515610eb657600080fd5b600254610f2c90600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f0257600080fd5b6102c65a03f11515610f1357600080fd5b5050506040518051869150600a0a63ffffffff611d2116565b9150811515610f3a57600080fd5b610f4a838563ffffffff611d2116565b600a54909150610f60908263ffffffff611d5016565b600a55600954610f76908363ffffffff611d5016565b600955600160a060020a038516600090815260106020526040902054610fa2908263ffffffff611d5016565b600160a060020a038616600090815260106020908152604080832093909355601190522054610fd7908363ffffffff611d5016565b600160a060020a038616600090815260116020526040902055610ffa8583611d6a565b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335085828460006040518085600160a060020a0316600160a060020a03168152602001848152602001838152602001826fffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a15b5b5050505050565b60145481565b600a5481565b60015b90565b6004805b611095610add565b60078111156110a057fe5b146110aa57600080fd5b60005433600160a060020a039081169116146110c557600080fd5b60005474010000000000000000000000000000000000000000900460ff16156110ed57600080fd5b600f5460ff16156110fd57600080fd5b600454600160a060020a03161561116257600454600160a060020a0316630bf318a36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561114d57600080fd5b6102c65a03f1151561115e57600080fd5b5050505b600f805460ff191660011790555b5b5b5b50565b60005433600160a060020a0390811691161461119157600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911791829055166304bbc2556000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d1857600080fd5b6102c65a03f11515610d2957600080fd5b505050604051805190501515610a5257600080fd5b5b5b50565b60095481565b60006007805b61123b610add565b600781111561124657fe5b1461125057600080fd5b600160a060020a033316600090815260106020526040902054915081151561127757600080fd5b600160a060020a033316600090815260106020526040812055600e546112a3908363ffffffff611d5016565b600e557fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d3383604051600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331682156108fc0283604051600060405180830381858888f19350505050151561131b57600080fd5b5b5b5050565b600f5463010000009004600160a060020a031681565b600e5481565b60005433600160a060020a0390811691161461135857600080fd5b6000805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790555b5b565b60015481565b60005433600160a060020a039081169116146113b257600080fd5b804211156113bf57600080fd5b60088190557fd34bb772c4ae9baa99db852f622773b31c7827e8ee818449fef20d30980bd3108160405190815260200160405180910390a15b5b50565b600354600160a060020a031681565b600d5481565b600654600a5410155b90565b60005433600160a060020a0390811691161461143857600080fd5b600f805461ff001916610100831515810291909117918290557f48d826081348f5f00e8a33c9ae8ce89ed4c6e88400b585a478bc203d9e8177d39160ff918104821691620100008204169063010000009004600160a060020a031660405192151583529015156020830152600160a060020a03166040808301919091526060909101905180910390a15b5b50565b6005805b6114d2610add565b60078111156114dd57fe5b146114e757600080fd5b3415156114f357600080fd5b600d54611506903463ffffffff611d5016565b600d555b5b50565b60005433600160a060020a0390811691161461152957600080fd5b60138190555b5b50565b600054600160a060020a031681565b600554600160a060020a031681565b60116020526000908152604090205481565b610a52338261181e565b5b50565b60145481115b949350505050565b61138e33610a1c565b5b565b600454600090600160a060020a03166382771c8e82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ab157600080fd5b6102c65a03f11515610ac257600080fd5b50505060405180519150505b90565b60075481565b600f5460ff1681565b60005474010000000000000000000000000000000000000000900460ff1681565b60126020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461165557600080fd5b60005474010000000000000000000000000000000000000000900460ff16151561167e57600080fd5b6000805474ff0000000000000000000000000000000000000000191690555b5b5b565b600f5462010000900460ff1681565b60145460095410155b90565b600c5481565b60005433600160a060020a039081169116146116dd57600080fd5b600160a060020a03821660009081526012602052604090819020805460ff19168315151790557fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5050565b60005433600160a060020a0390811691161461176b57600080fd5b600f805462ff000019166201000084151581029190911776ffffffffffffffffffffffffffffffffffffffff00000019166301000000600160a060020a03858116820292909217938490557f48d826081348f5f00e8a33c9ae8ce89ed4c6e88400b585a478bc203d9e8177d39360ff6101008204811694820416929190041660405192151583529015156020830152600160a060020a03166040808301919091526060909101905180910390a15b5b5050565b600f5462010000900460ff161561183457600080fd5b6fffffffffffffffffffffffffffffffff8116151561185257600080fd5b61131b8282611940565b5b5050565b60005433600160a060020a0390811691161461187c57600080fd5b600160a060020a038116151561189157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60005433600160a060020a039081169116146118d957600080fd5b600154600c5411156118ea57600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6119243385858585610d43565b5b50505050565b600b5481565b600254600160a060020a031681565b60008054819074010000000000000000000000000000000000000000900460ff161561196b57600080fd5b60025b611976610add565b600781111561198157fe5b14156119b357600160a060020a03841660009081526012602052604090205460ff1615156119ae57600080fd5b6119d9565b60035b6119be610add565b60078111156119c957fe5b1415610261576119d9565b600080fd5b5b600354600b54600a54349450600160a060020a03909216916318a4155e918591611a099163ffffffff611ddb16565b6009546002543390600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611a5657600080fd5b6102c65a03f11515611a6757600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8816028152600481019590955260248501939093526044840191909152600160a060020a03166064830152608482015260a401602060405180830381600087803b1515611ad357600080fd5b6102c65a03f11515611ae457600080fd5b5050506040518051915050801515611afb57600080fd5b600160a060020a0384166000908152601060205260409020541515611b2457600c805460010190555b600160a060020a038416600090815260106020526040902054611b4d908363ffffffff611d5016565b600160a060020a038516600090815260106020908152604080832093909355601190522054611b82908263ffffffff611d5016565b600160a060020a038516600090815260116020526040902055600a54611bae908363ffffffff611d5016565b600a55600954611bc4908263ffffffff611d5016565b600955600354600160a060020a031663f14ae17d8560006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611c2057600080fd5b6102c65a03f11515611c3157600080fd5b5050506040518051905015611c5757600b54611c53908363ffffffff611d5016565b600b555b611c678282600a54600954611571565b15611c7157600080fd5b611c7b8482611d6a565b600554600160a060020a031682156108fc0283604051600060405180830381858888f193505050501515611cae57600080fd5b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335084838386604051600160a060020a03909416845260208401929092526040808401919091526fffffffffffffffffffffffffffffffff90911660608301526080909101905180910390a15b5b50505050565b6000828202831580611d3d5750828482811515611d3a57fe5b04145b1515611d4557fe5b8091505b5092915050565b600082820183811015611d4557fe5b8091505b5092915050565b600254600160a060020a0316806340c10f19848460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611dc157600080fd5b6102c65a03f11515610e5957600080fd5b5050505b505050565b600082821115611de757fe5b508082035b929150505600a165627a7a7230582069ce3990ddfa1c8b546598100aaa9872375f7a6e9f4f1a7e58b818524f065c6a00290000000000000000000000000cd3d377fd1c4fcfcd910bd7b4b184a7f3d2b9da000000000000000000000000a897fb82b19e09f822a16229dd5c6c3e5b9b1f36000000000000000000000000d9cc0b421b546fdde683d989865c2e775729c1fa0000000000000000000000000000000000000000000000000000000059ba02440000000000000000000000000000000000000000000000000000000059ba37000000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000003e8

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

-----Decoded View---------------
Found 7 constructor arguments :
Arg [0] : 0000000000000000000000000cd3d377fd1c4fcfcd910bd7b4b184a7f3d2b9da
Arg [1] : 000000000000000000000000a897fb82b19e09f822a16229dd5c6c3e5b9b1f36
Arg [2] : 000000000000000000000000d9cc0b421b546fdde683d989865c2e775729c1fa
Arg [3] : 0000000000000000000000000000000000000000000000000000000059ba0244
Arg [4] : 0000000000000000000000000000000000000000000000000000000059ba3700
Arg [5] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003e8


   Swarm Source:
bzzr://69ce3990ddfa1c8b546598100aaa9872375f7a6e9f4f1a7e58b818524f065c6a
View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward