ETH Price: $2,549.28 (-2.91%)
Gas: 1 Gwei

Contract

0x317B5D5dCf9bFcC6799BD76571C4171bdB40916a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Tokens80471132019-06-28 15:31:541871 days ago1561735914IN
0x317B5D5d...bdB40916a
0 ETH0.000168694.5
Claim Tokens73295252019-03-08 15:50:061983 days ago1552060206IN
0x317B5D5d...bdB40916a
0 ETH0.000196475.25
Claim Tokens73294492019-03-08 15:35:401983 days ago1552059340IN
0x317B5D5d...bdB40916a
0 ETH0.00023396.25
Claim Tokens73242532019-03-07 20:15:521984 days ago1551989752IN
0x317B5D5d...bdB40916a
0 ETH0.0037113199
Claim Tokens67024372018-11-14 10:41:532097 days ago1542192113IN
0x317B5D5d...bdB40916a
0 ETH0.00153741
Claim Tokens66612952018-11-07 16:57:022104 days ago1541609822IN
0x317B5D5d...bdB40916a
0 ETH0.0010496628
Claim Tokens65831162018-10-25 21:12:512117 days ago1540501971IN
0x317B5D5d...bdB40916a
0 ETH0.00153741
Claim Tokens63514992018-09-18 0:50:172155 days ago1537231817IN
0x317B5D5d...bdB40916a
0 ETH0.00153741
Claim Tokens60020902018-07-21 5:10:102213 days ago1532149810IN
0x317B5D5d...bdB40916a
0 ETH0.00153741
Claim Tokens59920962018-07-19 12:09:172215 days ago1532002157IN
0x317B5D5d...bdB40916a
0 ETH0.0005623215
Claim Tokens59512022018-07-12 14:26:082222 days ago1531405568IN
0x317B5D5d...bdB40916a
0 ETH0.00153741
Claim Tokens59300242018-07-08 23:47:052226 days ago1531093625IN
0x317B5D5d...bdB40916a
0 ETH0.000187445
Claim Tokens59278832018-07-08 15:01:272226 days ago1531062087IN
0x317B5D5d...bdB40916a
0 ETH0.0023242562
Claim Tokens59210582018-07-07 10:27:362227 days ago1530959256IN
0x317B5D5d...bdB40916a
0 ETH0.000935625
Claim Tokens59074442018-07-05 2:10:082229 days ago1530756608IN
0x317B5D5d...bdB40916a
0 ETH0.0005623215
Claim Tokens58794702018-06-30 7:31:482234 days ago1530343908IN
0x317B5D5d...bdB40916a
0 ETH0.0022492860
Claim Tokens58199782018-06-20 1:53:052245 days ago1529459585IN
0x317B5D5d...bdB40916a
0 ETH0.0009746826
Claim Tokens57953282018-06-15 21:20:032249 days ago1529097603IN
0x317B5D5d...bdB40916a
0 ETH0.0019118851
Claim Tokens57805862018-06-13 8:09:492251 days ago1528877389IN
0x317B5D5d...bdB40916a
0 ETH0.0014995240
Claim Tokens57750162018-06-12 8:42:422252 days ago1528792962IN
0x317B5D5d...bdB40916a
0 ETH0.001874450
Claim Tokens57636632018-06-10 8:33:262254 days ago1528619606IN
0x317B5D5d...bdB40916a
0 ETH0.0007872421
Claim Tokens57526122018-06-08 9:37:252256 days ago1528450645IN
0x317B5D5d...bdB40916a
0 ETH0.000224926
Claim Tokens57417552018-06-06 11:13:502258 days ago1528283630IN
0x317B5D5d...bdB40916a
0 ETH0.000289668
Claim Tokens57350832018-06-05 6:36:462259 days ago1528180606IN
0x317B5D5d...bdB40916a
0 ETH0.0037113199
Claim Tokens57348432018-06-05 5:32:572259 days ago1528176777IN
0x317B5D5d...bdB40916a
0 ETH0.0007872421
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
54866962018-04-22 15:59:142303 days ago1524412754
0x317B5D5d...bdB40916a
0.7 ETH
54866952018-04-22 15:59:102303 days ago1524412750
0x317B5D5d...bdB40916a
1.62 ETH
54866912018-04-22 15:57:362303 days ago1524412656
0x317B5D5d...bdB40916a
5 ETH
54866812018-04-22 15:55:162303 days ago1524412516
0x317B5D5d...bdB40916a
0.12731727 ETH
54866332018-04-22 15:42:172303 days ago1524411737
0x317B5D5d...bdB40916a
0.55 ETH
54865172018-04-22 15:10:412303 days ago1524409841
0x317B5D5d...bdB40916a
1 ETH
54858742018-04-22 12:35:382303 days ago1524400538
0x317B5D5d...bdB40916a
1.4 ETH
54858192018-04-22 12:22:162303 days ago1524399736
0x317B5D5d...bdB40916a
3 ETH
54856192018-04-22 11:39:502303 days ago1524397190
0x317B5D5d...bdB40916a
0.335 ETH
54850502018-04-22 9:27:332303 days ago1524389253
0x317B5D5d...bdB40916a
0.23 ETH
54850182018-04-22 9:19:052303 days ago1524388745
0x317B5D5d...bdB40916a
3 ETH
54846172018-04-22 7:34:052303 days ago1524382445
0x317B5D5d...bdB40916a
1.01 ETH
54832912018-04-22 2:04:472303 days ago1524362687
0x317B5D5d...bdB40916a
2 ETH
54824942018-04-21 22:45:572304 days ago1524350757
0x317B5D5d...bdB40916a
1.85 ETH
54817312018-04-21 19:41:122304 days ago1524339672
0x317B5D5d...bdB40916a
0.5 ETH
54816102018-04-21 19:12:032304 days ago1524337923
0x317B5D5d...bdB40916a
1 ETH
54812172018-04-21 17:33:092304 days ago1524331989
0x317B5D5d...bdB40916a
0.27854527 ETH
54803842018-04-21 14:13:312304 days ago1524320011
0x317B5D5d...bdB40916a
1.5 ETH
54791762018-04-21 9:18:492304 days ago1524302329
0x317B5D5d...bdB40916a
1 ETH
54787002018-04-21 7:18:192304 days ago1524295099
0x317B5D5d...bdB40916a
3 ETH
54761042018-04-20 20:36:002305 days ago1524256560
0x317B5D5d...bdB40916a
0.98905139 ETH
54753662018-04-20 17:35:042305 days ago1524245704
0x317B5D5d...bdB40916a
1 ETH
54750042018-04-20 16:04:452305 days ago1524240285
0x317B5D5d...bdB40916a
2 ETH
54747822018-04-20 15:13:222305 days ago1524237202
0x317B5D5d...bdB40916a
5 ETH
54747262018-04-20 14:58:472305 days ago1524236327
0x317B5D5d...bdB40916a
1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DmlContribution

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-15
*/

pragma solidity ^0.4.11;


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

}



/**
 * Math operations with safety checks
 */
library SafeMath {
  function mul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint a, uint b) internal returns (uint) {
    assert(b > 0);
    uint c = a / b;
    assert(a == b * c + a % b);
    return c;
  }

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

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

  function max64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a < b ? a : b;
  }
}
















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

  /**
  * @dev Fix for the ERC20 short address attack.
   */
  modifier onlyPayloadSize(uint size) {
    require(msg.data.length >= size + 4) ;
    _;
  }

  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 onlyPayloadSize(2 * 32) 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 {

  /**
  * @dev Fix for the ERC20 short address attack.
   */
  modifier onlyPayloadSize(uint size) {
    require(msg.data.length >= size + 4) ;
    _;
  }

  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 onlyPayloadSize(3 * 32) 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 Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


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

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

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

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


/**
 * @title DML Token Contract
 * @dev DML Token Contract
 * @dev inherite from StandardToken, Pasuable and Ownable by Zeppelin
 * @author DML team
 */

contract DmlToken is StandardToken, Pausable{
	using SafeMath for uint;

 	string public constant name = "DML Token";
	uint8 public constant decimals = 18;
	string public constant symbol = 'DML';

	uint public constant MAX_TOTAL_TOKEN_AMOUNT = 330000000 ether;
	address public minter;
	uint public endTime;

	mapping (address => uint) public lockedBalances;

	modifier onlyMinter {
    	  assert(msg.sender == minter);
    	  _;
    }

    modifier maxDmlTokenAmountNotReached (uint amount){
    	  assert(totalSupply.add(amount) <= MAX_TOTAL_TOKEN_AMOUNT);
    	  _;
    }

    /**
     * @dev Constructor
     * @param _minter Contribution Smart Contract
     * @return _endTime End of the contribution period
     */
	function DmlToken(address _minter, uint _endTime){
    	  minter = _minter;
    	  endTime = _endTime;
    }

    /**
     * @dev Mint Token
     * @param receipent address owning mint tokens    
     * @param amount amount of token
     */
    function mintToken(address receipent, uint amount)
        external
        onlyMinter
        maxDmlTokenAmountNotReached(amount)
        returns (bool)
    {
        require(now <= endTime);
      	lockedBalances[receipent] = lockedBalances[receipent].add(amount);
      	totalSupply = totalSupply.add(amount);
      	return true;
    }

    /**
     * @dev Unlock token for trade
     */
    function claimTokens(address receipent)
        public
        onlyMinter
    {
      	balances[receipent] = balances[receipent].add(lockedBalances[receipent]);
      	lockedBalances[receipent] = 0;
    }

    function lockedBalanceOf(address _owner) constant returns (uint balance) {
        return lockedBalances[_owner];
    }

	/**
	* @dev override to add validRecipient
	* @param _to The address to transfer to.
	* @param _value The amount to be transferred.
	*/
	function transfer(address _to, uint _value)
		public
		validRecipient(_to)
		returns (bool success)
	{
		return super.transfer(_to, _value);
	}

	/**
	* @dev override to add validRecipient
	* @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
		validRecipient(_spender)
		returns (bool)
	{
		return super.approve(_spender,  _value);
	}

	/**
	* @dev override to add validRecipient
	* @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
		validRecipient(_to)
		returns (bool)
	{
		return super.transferFrom(_from, _to, _value);
	}

	// MODIFIERS

 	modifier validRecipient(address _recipient) {
    	require(_recipient != address(this));
    	_;
  	}
}



/**
 * @title DML Contribution Contract
 * @dev DML Contribution Contract
 * @dev inherite from StandardToken, Ownable by Zeppelin
 * @author DML team
 */
contract DmlContribution is Ownable {
    using SafeMath for uint;

    /// Constant fields
    /// total tokens supply
    uint public constant DML_TOTAL_SUPPLY = 330000000 ether;
    uint public constant EARLY_CONTRIBUTION_DURATION = 24 hours;
    uint public constant MAX_CONTRIBUTION_DURATION = 5 days;

    /// Exchange rates
    uint public constant PRICE_RATE_FIRST = 3780;
    uint public constant PRICE_RATE_SECOND = 4158;

    /// ----------------------------------------------------------------------------------------------------
    /// |                                   |              |                    |             |            |
    /// |    SALE (PRESALE + PUBLIC SALE)   |  ECO SYSTEM  |  COMMUNITY BOUNTY  |  OPERATION  |  RESERVES  |
    /// |            36%                    |     9.9%     |         8.3%       |     30.8%   |     15%    |
    /// ----------------------------------------------------------------------------------------------------
    uint public constant SALE_STAKE = 360;  // 36% for open sale

    // Reserved stakes
    uint public constant ECO_SYSTEM_STAKE = 99;   // 9.9%
    uint public constant COMMUNITY_BOUNTY_STAKE = 83; // 8.3%
    uint public constant OPERATION_STAKE = 308;     // 30.8%
    uint public constant RESERVES_STAKE = 150;     // 15.0%

    uint public constant DIVISOR_STAKE = 1000;

    uint public constant PRESALE_RESERVERED_AMOUNT = 56899342578812412860512236;
    
    /// Holder address
    address public constant ECO_SYSTEM_HOLDER = 0x2D8C705a66b2E87A9249380d4Cdfe9D80BBF826B;
    address public constant COMMUNITY_BOUNTY_HOLDER = 0x68500ffEfb57D88A600E2f1c63Bb5866e7107b6B;
    address public constant OPERATION_HOLDER = 0xC7b6DFf52014E59Cb88fAc3b371FA955D0A9249F;
    address public constant RESERVES_HOLDER = 0xab376b3eC2ed446444911E549c7C953fB086070f;
    address public constant PRESALE_HOLDER = 0xcB52583D19fd42c0f85a0c83A45DEa6C73B9EBfb;
    
    uint public MAX_PUBLIC_SOLD = DML_TOTAL_SUPPLY * SALE_STAKE / DIVISOR_STAKE - PRESALE_RESERVERED_AMOUNT;

    /// Fields that are only changed in constructor    
    /// Address that storing all ETH
    address public dmlwallet;
    uint public earlyWhitelistBeginTime;
    uint public startTime;
    uint public endTime;

    /// Fields that can be changed by functions
    /// Accumulator for open sold tokens
    uint public openSoldTokens;
    /// Due to an emergency, set this to true to halt the contribution
    bool public halted; 
    /// ERC20 compilant DML token contact instance
    DmlToken public dmlToken; 

    mapping (address => WhitelistUser) private whitelisted;
    address[] private whitelistedIndex;

    struct WhitelistUser {
      uint256 quota;
      uint index;
      uint level;
    }
    /// level 1 Main Whitelist
    /// level 2 Early Whitelist
    /// level 3 Early Super Whitelist

    uint256 public maxBuyLimit = 68 ether;

    /*
     * EVENTS
     */

    event NewSale(address indexed destAddress, uint ethCost, uint gotTokens);
    event ToFundAmount(uint ethCost);
    event ValidFundAmount(uint ethCost);
    event Debug(uint number);
    event UserCallBuy();
    event ShowTokenAvailable(uint);
    event NowTime(uint, uint, uint, uint);

    /*
     * MODIFIERS
     */

    modifier notHalted() {
        require(!halted);
        _;
    }

    modifier initialized() {
        require(address(dmlwallet) != 0x0);
        _;
    }    

    modifier notEarlierThan(uint x) {
        require(now >= x);
        _;
    }

    modifier earlierThan(uint x) {
        require(now < x);
        _;
    }

    modifier ceilingNotReached() {
        require(openSoldTokens < MAX_PUBLIC_SOLD);
        _;
    }  

    modifier isSaleEnded() {
        require(now > endTime || openSoldTokens >= MAX_PUBLIC_SOLD);
        _;
    }


    /**
     * CONSTRUCTOR 
     * 
     * @dev Initialize the DML contribution contract
     * @param _dmlwallet The escrow account address, all ethers will be sent to this address.
     * @param _bootTime ICO boot time
     */
    function DmlContribution(address _dmlwallet, uint _bootTime){
        require(_dmlwallet != 0x0);

        halted = false;
        dmlwallet = _dmlwallet;
        earlyWhitelistBeginTime = _bootTime;
        startTime = earlyWhitelistBeginTime + EARLY_CONTRIBUTION_DURATION;
        endTime = startTime + MAX_CONTRIBUTION_DURATION;
        openSoldTokens = 0;
        dmlToken = new DmlToken(this, endTime);

        uint stakeMultiplier = DML_TOTAL_SUPPLY / DIVISOR_STAKE;
        
        dmlToken.mintToken(ECO_SYSTEM_HOLDER, ECO_SYSTEM_STAKE * stakeMultiplier);
        dmlToken.mintToken(COMMUNITY_BOUNTY_HOLDER, COMMUNITY_BOUNTY_STAKE * stakeMultiplier);
        dmlToken.mintToken(OPERATION_HOLDER, OPERATION_STAKE * stakeMultiplier);
        dmlToken.mintToken(RESERVES_HOLDER, RESERVES_STAKE * stakeMultiplier);

        dmlToken.mintToken(PRESALE_HOLDER, PRESALE_RESERVERED_AMOUNT);      
        
    }

    /**
     * Fallback function 
     * 
     * @dev Set it to buy Token if anyone send ETH
     */
    function () public payable {
        buyDmlCoin(msg.sender);
        //NowTime(now, earlyWhitelistBeginTime, startTime, endTime);
    }

    /*
     * PUBLIC FUNCTIONS
     */

    /// @dev Exchange msg.value ether to DML for account recepient
    /// @param receipient DML tokens receiver
    function buyDmlCoin(address receipient) 
        public 
        payable 
        notHalted 
        initialized 
        ceilingNotReached 
        notEarlierThan(earlyWhitelistBeginTime)
        earlierThan(endTime)
        returns (bool) 
    {
        require(receipient != 0x0);
        require(isWhitelisted(receipient));

        // Do not allow contracts to game the system
        require(!isContract(msg.sender));        
        require( tx.gasprice <= 99000000000 wei );

        if( now < startTime && now >= earlyWhitelistBeginTime)
        {
            if (whitelisted[receipient].level >= 2)
            {
                require(msg.value >= 1 ether);
            }
            else
            {
                require(msg.value >= 0.5 ether);
            }
            buyEarlyWhitelist(receipient);
        }
        else
        {
            require(msg.value >= 0.1 ether);
            require(msg.value <= maxBuyLimit);
            buyRemaining(receipient);
        }

        return true;
    }

    function setMaxBuyLimit(uint256 limit)
        public
        initialized
        onlyOwner
        earlierThan(endTime)
    {
        maxBuyLimit = limit;
    }


    /// @dev batch set quota for early user quota
    function addWhiteListUsers(address[] userAddresses, uint256[] quota, uint[] level)
        public
        onlyOwner
        earlierThan(endTime)
    {
        for( uint i = 0; i < userAddresses.length; i++) {
            addWhiteListUser(userAddresses[i], quota[i], level[i]);
        }
    }

    function addWhiteListUser(address userAddress, uint256 quota, uint level)
        public
        onlyOwner
        earlierThan(endTime)
    {
        if (!isWhitelisted(userAddress)) {
            whitelisted[userAddress].quota = quota;
            whitelisted[userAddress].level = level;
            whitelisted[userAddress].index = whitelistedIndex.push(userAddress) - 1;
        }
    }

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

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


    /// @dev Emergency situation that requires contribution period to stop.
    /// Contributing not possible anymore.
    function halt() public onlyOwner{
        halted = true;
    }

    /// @dev Emergency situation resolved.
    /// Contributing becomes possible again withing the outlined restrictions.
    function unHalt() public onlyOwner{
        halted = false;
    }

    /// @dev Emergency situation
    function changeWalletAddress(address newAddress) onlyOwner{ 
        dmlwallet = newAddress; 
    }

    /// @return true if sale not ended, false otherwise.
    function saleNotEnd() constant returns (bool) {
        return now < endTime && openSoldTokens < MAX_PUBLIC_SOLD;
    }

    /// CONSTANT METHODS
    /// @dev Get current exchange rate
    function priceRate() public constant returns (uint) {
        // Two price tiers
        if (earlyWhitelistBeginTime <= now && now < startTime)
        {
            if (whitelisted[msg.sender].level >= 2)
            {
                return PRICE_RATE_SECOND;
            }
            else
            {
                return PRICE_RATE_FIRST;
            }
        }
        if (startTime <= now && now < endTime)
        {
            return PRICE_RATE_FIRST;
        }
        // Should not be called before or after contribution period
        assert(false);
    }
    function claimTokens(address receipent)
        public
        isSaleEnded
    {
        dmlToken.claimTokens(receipent);
    }

    /*
     * INTERNAL FUNCTIONS
     */

    /// @dev early_whitelist to buy token with quota
    function buyEarlyWhitelist(address receipient) internal {
        uint quotaAvailable = whitelisted[receipient].quota;
        require(quotaAvailable > 0);

        uint tokenAvailable = MAX_PUBLIC_SOLD.sub(openSoldTokens);
        ShowTokenAvailable(tokenAvailable);
        require(tokenAvailable > 0);

        uint validFund = quotaAvailable.min256(msg.value);
        ValidFundAmount(validFund);

        uint toFund;
        uint toCollect;
        (toFund, toCollect) = costAndBuyTokens(tokenAvailable, validFund);

        whitelisted[receipient].quota = whitelisted[receipient].quota.sub(toFund);
        buyCommon(receipient, toFund, toCollect);
    }

    /// @dev early_whitelist and main whitelist to buy token with their quota + extra quota
    function buyRemaining(address receipient) internal {
        uint tokenAvailable = MAX_PUBLIC_SOLD.sub(openSoldTokens);
        ShowTokenAvailable(tokenAvailable);
        require(tokenAvailable > 0);

        uint toFund;
        uint toCollect;
        (toFund, toCollect) = costAndBuyTokens(tokenAvailable, msg.value);
        
        buyCommon(receipient, toFund, toCollect);
    }

    /// @dev Utility function for buy token
    function buyCommon(address receipient, uint toFund, uint dmlTokenCollect) internal {
        require(msg.value >= toFund); // double check

        if(toFund > 0) {
            require(dmlToken.mintToken(receipient, dmlTokenCollect));
            ToFundAmount(toFund);
            dmlwallet.transfer(toFund);
            openSoldTokens = openSoldTokens.add(dmlTokenCollect);
            NewSale(receipient, toFund, dmlTokenCollect);            
        }

        uint toReturn = msg.value.sub(toFund);
        if(toReturn > 0) {
            msg.sender.transfer(toReturn);
        }
    }

    /// @dev Utility function for calculate available tokens and cost ethers
    function costAndBuyTokens(uint availableToken, uint validFund) constant internal returns (uint costValue, uint getTokens){
        // all conditions has checked in the caller functions
        uint exchangeRate = priceRate();
        getTokens = exchangeRate * validFund;

        if(availableToken >= getTokens){
            costValue = validFund;
        } else {
            costValue = availableToken / exchangeRate;
            getTokens = availableToken;
        }
    }

    /// @dev Internal function to determine if an address is a contract
    /// @param _addr The address being queried
    /// @return True if `_addr` is a contract
    function isContract(address _addr) constant internal returns(bool) {
        uint size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"ECO_SYSTEM_HOLDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"earlyWhitelistBeginTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ECO_SYSTEM_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"isIndeed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DIVISOR_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleNotEnd","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RESERVES_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EARLY_CONTRIBUTION_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBuyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_RESERVERED_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"limit","type":"uint256"}],"name":"setMaxBuyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dmlToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unHalt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PRICE_RATE_SECOND","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OPERATION_HOLDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OPERATION_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMMUNITY_BOUNTY_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_PUBLIC_SOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openSoldTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"getWhitelistUser","outputs":[{"name":"quota","type":"uint256"},{"name":"index","type":"uint256"},{"name":"level","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RESERVES_HOLDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRICE_RATE_FIRST","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dmlwallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receipient","type":"address"}],"name":"buyDmlCoin","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_HOLDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"quota","type":"uint256"},{"name":"level","type":"uint256"}],"name":"addWhiteListUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"COMMUNITY_BOUNTY_HOLDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receipent","type":"address"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"userAddresses","type":"address[]"},{"name":"quota","type":"uint256[]"},{"name":"level","type":"uint256[]"}],"name":"addWhiteListUsers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_CONTRIBUTION_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeWalletAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SALE_STAKE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DML_TOTAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_dmlwallet","type":"address"},{"name":"_bootTime","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"destAddress","type":"address"},{"indexed":false,"name":"ethCost","type":"uint256"},{"indexed":false,"name":"gotTokens","type":"uint256"}],"name":"NewSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ethCost","type":"uint256"}],"name":"ToFundAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ethCost","type":"uint256"}],"name":"ValidFundAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"number","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[],"name":"UserCallBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"ShowTokenAvailable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"},{"indexed":false,"name":"","type":"uint256"},{"indexed":false,"name":"","type":"uint256"},{"indexed":false,"name":"","type":"uint256"}],"name":"NowTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526a2f10e78ab680ac479b37ec6103e86101686b0110f837d8942a518a000000028115156200002e57fe5b04036001556803afb087b876900000600a5534156200004c57600080fd5b6040516040806200418f833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008373ffffffffffffffffffffffffffffffffffffffff1614151515620000db57600080fd5b6000600760006101000a81548160ff02191690831515021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003819055506201518060035401600481905550620697806004540160058190555060006006819055503060055462000170620006fc565b808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051809103906000f0801515620001c457600080fd5b600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e86b0110f837d8942a518a0000008115156200021e57fe5b049050600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c65068732d8c705a66b2e87a9249380d4cdfe9d80bbf826b836063026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515620002fd57600080fd5b5af115156200030b57600080fd5b5050506040518051905050600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c650687368500ffefb57d88a600e2f1c63bb5866e7107b6b836053026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515620003f257600080fd5b5af115156200040057600080fd5b5050506040518051905050600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c6506873c7b6dff52014e59cb88fac3b371fa955d0a9249f83610134026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515620004e857600080fd5b5af11515620004f657600080fd5b5050506040518051905050600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c6506873ab376b3ec2ed446444911e549c7c953fb086070f836096026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515620005dd57600080fd5b5af11515620005eb57600080fd5b5050506040518051905050600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c6506873cb52583d19fd42c0f85a0c83a45dea6c73b9ebfb6a2f10e78ab680ac479b37ec6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515620006da57600080fd5b5af11515620006e857600080fd5b50505060405180519050505050506200070d565b604051611c79806200251683390190565b611df9806200071d6000396000f3006060604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063211f390e146101fa57806325d911251461024f5780632fb22cfa146102785780633197cbb6146102a15780633af32abf146102ca5780633f423afe1461031b5780634f93995d146103445780635a018e01146103715780635ed7ca5b1461039a57806367198207146103af5780636aa5b37f146103d857806374aa9e2c14610401578063757765f81461042a5780637591dfa01461044d57806376865eea146104a2578063773ef38e146104b757806378b290b5146104e057806378e97925146105355780638da5cb5b1461055e578063a053eb9d146105b3578063acd47bc3146105dc578063af2096ef14610605578063b2450b151461062e578063b36c14fe14610657578063b9b8af0b146106b2578063baaf4eef146106df578063bdf75a6a14610734578063bfb1fcf51461075d578063c536ed5f146107b2578063ca75b954146107f8578063ceb791d91461084d578063d46a005a14610876578063dd86f719146108c1578063df8de3e714610916578063e848aba21461094f578063e9d8d3d714610a29578063ec8edf7a14610a52578063f2fde38b14610a8b578063f98d7c7514610ac4578063fe89232714610aed575b6101f733610b16565b50005b341561020557600080fd5b61020d610cf7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025a57600080fd5b610262610d0f565b6040518082815260200191505060405180910390f35b341561028357600080fd5b61028b610d15565b6040518082815260200191505060405180910390f35b34156102ac57600080fd5b6102b4610d1a565b6040518082815260200191505060405180910390f35b34156102d557600080fd5b610301600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d20565b604051808215151515815260200191505060405180910390f35b341561032657600080fd5b61032e610deb565b6040518082815260200191505060405180910390f35b341561034f57600080fd5b610357610df1565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610384610e0c565b6040518082815260200191505060405180910390f35b34156103a557600080fd5b6103ad610e11565b005b34156103ba57600080fd5b6103c2610e89565b6040518082815260200191505060405180910390f35b34156103e357600080fd5b6103eb610e90565b6040518082815260200191505060405180910390f35b341561040c57600080fd5b610414610e96565b6040518082815260200191505060405180910390f35b341561043557600080fd5b61044b6004808035906020019091905050610ea5565b005b341561045857600080fd5b610460610f64565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f8a565b005b34156104c257600080fd5b6104ca611002565b6040518082815260200191505060405180910390f35b34156104eb57600080fd5b6104f3611008565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054057600080fd5b610548611020565b6040518082815260200191505060405180910390f35b341561056957600080fd5b610571611026565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105be57600080fd5b6105c661104b565b6040518082815260200191505060405180910390f35b34156105e757600080fd5b6105ef611051565b6040518082815260200191505060405180910390f35b341561061057600080fd5b610618611056565b6040518082815260200191505060405180910390f35b341561063957600080fd5b61064161105c565b6040518082815260200191505060405180910390f35b341561066257600080fd5b61068e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611062565b60405180848152602001838152602001828152602001935050505060405180910390f35b34156106bd57600080fd5b6106c5611151565b604051808215151515815260200191505060405180910390f35b34156106ea57600080fd5b6106f2611164565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561073f57600080fd5b61074761117c565b6040518082815260200191505060405180910390f35b341561076857600080fd5b610770611182565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b16565b604051808215151515815260200191505060405180910390f35b341561080357600080fd5b61080b6111a8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085857600080fd5b6108606111c0565b6040518082815260200191505060405180910390f35b341561088157600080fd5b6108bf600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061126a565b005b34156108cc57600080fd5b6108d4611425565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092157600080fd5b61094d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143d565b005b341561095a57600080fd5b610a27600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061152b565b005b3415610a3457600080fd5b610a3c61160b565b6040518082815260200191505060405180910390f35b3415610a5d57600080fd5b610a89600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611612565b005b3415610a9657600080fd5b610ac2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116b1565b005b3415610acf57600080fd5b610ad7611806565b6040518082815260200191505060405180910390f35b3415610af857600080fd5b610b0061180c565b6040518082815260200191505060405180910390f35b6000600760009054906101000a900460ff16151515610b3457600080fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610b7c57600080fd5b600154600654101515610b8e57600080fd5b600354804210151515610ba057600080fd5b6005548042101515610bb157600080fd5b60008473ffffffffffffffffffffffffffffffffffffffff1614151515610bd757600080fd5b610be084610d20565b1515610beb57600080fd5b610bf43361181c565b151515610c0057600080fd5b64170cdc1e003a11151515610c1457600080fd5b60045442108015610c2757506003544210155b15610cba576002600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154101515610c9457670de0b6b3a76400003410151515610c8f57600080fd5b610cac565b6706f05b59d3b200003410151515610cab57600080fd5b5b610cb58461182f565b610cec565b67016345785d8a00003410151515610cd157600080fd5b600a543411151515610ce257600080fd5b610ceb846119f6565b5b600192505050919050565b732d8c705a66b2e87a9249380d4cdfe9d80bbf826b81565b60035481565b606381565b60055481565b6000806009805490501415610d385760009050610de6565b8173ffffffffffffffffffffffffffffffffffffffff166009600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154815481101515610da057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b6103e881565b600060055442108015610e075750600154600654105b905090565b609681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6c57600080fd5b6001600760006101000a81548160ff021916908315150217905550565b6201518081565b600a5481565b6a2f10e78ab680ac479b37ec81565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610eed57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f4857600080fd5b6005548042101515610f5957600080fd5b81600a819055505050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe557600080fd5b6000600760006101000a81548160ff021916908315150217905550565b61103e81565b73c7b6dff52014e59cb88fac3b371fa955d0a9249f81565b60045481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61013481565b605381565b60015481565b60065481565b600080600061107084610d20565b151561107b57600080fd5b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b600760009054906101000a900460ff1681565b73ab376b3ec2ed446444911e549c7c953fb086070f81565b610ec481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73cb52583d19fd42c0f85a0c83a45dea6c73b9ebfb81565b600042600354111580156111d5575060045442105b1561123a576002600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015156112305761103e9050611267565b610ec49050611267565b426004541115801561124d575060055442105b1561125c57610ec49050611267565b6000151561126657fe5b5b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b60055480421015156112d657600080fd5b6112df84610d20565b151561141f5782600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600980548060010182816113899190611d7c565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b50505050565b7368500ffefb57d88a600e2f1c63bb5866e7107b6b81565b600554421180611451575060015460065410155b151561145c57600080fd5b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df8de3e7826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561151857600080fd5b5af1151561152557600080fd5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561158857600080fd5b600554804210151561159957600080fd5b600091505b8451821015611604576115f785838151811015156115b857fe5b9060200190602002015185848151811015156115d057fe5b9060200190602002015185858151811015156115e857fe5b9060200190602002015161126a565b818060010192505061159e565b5050505050565b6206978081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561166d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561174857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61016881565b6b0110f837d8942a518a00000081565b600080823b905060008111915050919050565b6000806000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154945060008511151561188b57600080fd5b6118a2600654600154611a7d90919063ffffffff16565b93507fb748a9cc5aa4a3cfef03083277a7b72bafcb2585bf49cc5f82c24d23016865eb846040518082815260200191505060405180910390a16000841115156118ea57600080fd5b6118fd3486611a9690919063ffffffff16565b92507fc7c496a9180801bf1a6715b594c6d98c53f0fca5d220af22363ab356f5042d86836040518082815260200191505060405180910390a16119408484611aaf565b809250819350505061199d82600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611a7d90919063ffffffff16565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506119ee868383611aee565b505050505050565b6000806000611a12600654600154611a7d90919063ffffffff16565b92507fb748a9cc5aa4a3cfef03083277a7b72bafcb2585bf49cc5f82c24d23016865eb836040518082815260200191505060405180910390a1600083111515611a5a57600080fd5b611a648334611aaf565b8092508193505050611a77848383611aee565b50505050565b6000828211151515611a8b57fe5b818303905092915050565b6000818310611aa55781611aa7565b825b905092915050565b6000806000611abc6111c0565b905083810291508185101515611ad457839250611ae6565b8085811515611adf57fe5b0492508491505b509250929050565b6000823410151515611aff57600080fd5b6000831115611cf957600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c6506885846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611bcc57600080fd5b5af11515611bd957600080fd5b505050604051805190501515611bee57600080fd5b7f2a0fd5fe7417ee3a5f311807ed2f06290f263a11ae83023e1718b3a549ba5132836040518082815260200191505060405180910390a1600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501515611c8757600080fd5b611c9c82600654611d5e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff167fa3ed4207b1480804a4590a74f4b9cc310dc0fc839af8d10e2141ca3b72fd93488484604051808381526020018281526020019250505060405180910390a25b611d0c8334611a7d90919063ffffffff16565b90506000811115611d58573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515611d5757600080fd5b5b50505050565b6000808284019050838110151515611d7257fe5b8091505092915050565b815481835581811511611da357818360005260206000209182019101611da29190611da8565b5b505050565b611dca91905b80821115611dc6576000816000905550600101611dae565b5090565b905600a165627a7a723058208ce418510f6eda9177ef93ecd860bed8443be5d511782baef6f6e49371830e86002960606040526000600360146101000a81548160ff021916908315150217905550341561002a57600080fd5b604051604080611c798339810160405280805190602001909190805190602001909190505033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806005819055505050611b90806100e96000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630483a7f61461013857806306fdde03146101855780630754617214610213578063095ea7b31461026857806318160ddd146102c257806323b872dd146102eb578063313ce567146103645780633197cbb6146103935780633f4ba83a146103bc57806359355736146103d15780635c975abb1461041e578063661884631461044b57806370a08231146104a557806379c65068146104f25780638456cb591461054c5780638da5cb5b1461056157806395d89b41146105b6578063a89c5be014610644578063a9059cbb1461066d578063d73dd623146106c7578063dd62ed3e14610721578063df8de3e71461078d578063f2fde38b146107c6575b600080fd5b341561014357600080fd5b61016f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107ff565b6040518082815260200191505060405180910390f35b341561019057600080fd5b610198610817565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101d85780820151818401526020810190506101bd565b50505050905090810190601f1680156102055780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021e57600080fd5b610226610850565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561027357600080fd5b6102a8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610876565b604051808215151515815260200191505060405180910390f35b34156102cd57600080fd5b6102d56108c7565b6040518082815260200191505060405180910390f35b34156102f657600080fd5b61034a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506108cd565b604051808215151515815260200191505060405180910390f35b341561036f57600080fd5b610377610920565b604051808260ff1660ff16815260200191505060405180910390f35b341561039e57600080fd5b6103a6610925565b6040518082815260200191505060405180910390f35b34156103c757600080fd5b6103cf61092b565b005b34156103dc57600080fd5b610408600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109eb565b6040518082815260200191505060405180910390f35b341561042957600080fd5b610431610a34565b604051808215151515815260200191505060405180910390f35b341561045657600080fd5b61048b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a47565b604051808215151515815260200191505060405180910390f35b34156104b057600080fd5b6104dc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cd8565b6040518082815260200191505060405180910390f35b34156104fd57600080fd5b610532600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d21565b604051808215151515815260200191505060405180910390f35b341561055757600080fd5b61055f610e75565b005b341561056c57600080fd5b610574610f36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105c157600080fd5b6105c9610f5c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106095780820151818401526020810190506105ee565b50505050905090810190601f1680156106365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064f57600080fd5b610657610f95565b6040518082815260200191505060405180910390f35b341561067857600080fd5b6106ad600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fa5565b604051808215151515815260200191505060405180910390f35b34156106d257600080fd5b610707600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ff6565b604051808215151515815260200191505060405180910390f35b341561072c57600080fd5b610777600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506111f2565b6040518082815260200191505060405180910390f35b341561079857600080fd5b6107c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611279565b005b34156107d157600080fd5b6107fd600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ee565b005b60066020528060005260406000206000915090505481565b6040805190810160405280600981526020017f444d4c20546f6b656e000000000000000000000000000000000000000000000081525081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000823073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108b457600080fd5b6108be8484611546565b91505092915050565b60005481565b6000823073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090b57600080fd5b610916858585611638565b9150509392505050565b601281565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561098757600080fd5b600360149054906101000a900460ff1615156109a257600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360149054906101000a900460ff1681565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610b58576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610bec565b610b6b838261193d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d7c57fe5b816b0110f837d8942a518a000000610d9f8260005461195690919063ffffffff16565b11151515610da957fe5b6005544211151515610dba57600080fd5b610e0c83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461195690919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e648360005461195690919063ffffffff16565b600081905550600191505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ed157600080fd5b600360149054906101000a900460ff16151515610eed57600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f444d4c000000000000000000000000000000000000000000000000000000000081525081565b6b0110f837d8942a518a00000081565b6000823073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610fe357600080fd5b610fed8484611974565b91505092915050565b600061108782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461195690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112d257fe5b611363600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461195690919063ffffffff16565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561144a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561148657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60008060606004810160003690501015151561165357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561168f57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915061176084600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461193d90919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117f584600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461195690919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061184b848361193d90919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36001925050509392505050565b600082821115151561194b57fe5b818303905092915050565b600080828401905083811015151561196a57fe5b8091505092915050565b600060406004810160003690501015151561198e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156119ca57600080fd5b611a1c83600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461193d90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ab183600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461195690919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a36001915050929150505600a165627a7a72305820cc4a19b940b5662869c66f40e20548d1972d6af64a6a865ca514b020549ece2c0029000000000000000000000000bd24cef65610bea92efe6b5cc2af9758637e2200000000000000000000000000000000000000000000000000000000005ad4c880

Deployed Bytecode

0x6060604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063211f390e146101fa57806325d911251461024f5780632fb22cfa146102785780633197cbb6146102a15780633af32abf146102ca5780633f423afe1461031b5780634f93995d146103445780635a018e01146103715780635ed7ca5b1461039a57806367198207146103af5780636aa5b37f146103d857806374aa9e2c14610401578063757765f81461042a5780637591dfa01461044d57806376865eea146104a2578063773ef38e146104b757806378b290b5146104e057806378e97925146105355780638da5cb5b1461055e578063a053eb9d146105b3578063acd47bc3146105dc578063af2096ef14610605578063b2450b151461062e578063b36c14fe14610657578063b9b8af0b146106b2578063baaf4eef146106df578063bdf75a6a14610734578063bfb1fcf51461075d578063c536ed5f146107b2578063ca75b954146107f8578063ceb791d91461084d578063d46a005a14610876578063dd86f719146108c1578063df8de3e714610916578063e848aba21461094f578063e9d8d3d714610a29578063ec8edf7a14610a52578063f2fde38b14610a8b578063f98d7c7514610ac4578063fe89232714610aed575b6101f733610b16565b50005b341561020557600080fd5b61020d610cf7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025a57600080fd5b610262610d0f565b6040518082815260200191505060405180910390f35b341561028357600080fd5b61028b610d15565b6040518082815260200191505060405180910390f35b34156102ac57600080fd5b6102b4610d1a565b6040518082815260200191505060405180910390f35b34156102d557600080fd5b610301600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d20565b604051808215151515815260200191505060405180910390f35b341561032657600080fd5b61032e610deb565b6040518082815260200191505060405180910390f35b341561034f57600080fd5b610357610df1565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610384610e0c565b6040518082815260200191505060405180910390f35b34156103a557600080fd5b6103ad610e11565b005b34156103ba57600080fd5b6103c2610e89565b6040518082815260200191505060405180910390f35b34156103e357600080fd5b6103eb610e90565b6040518082815260200191505060405180910390f35b341561040c57600080fd5b610414610e96565b6040518082815260200191505060405180910390f35b341561043557600080fd5b61044b6004808035906020019091905050610ea5565b005b341561045857600080fd5b610460610f64565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f8a565b005b34156104c257600080fd5b6104ca611002565b6040518082815260200191505060405180910390f35b34156104eb57600080fd5b6104f3611008565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054057600080fd5b610548611020565b6040518082815260200191505060405180910390f35b341561056957600080fd5b610571611026565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105be57600080fd5b6105c661104b565b6040518082815260200191505060405180910390f35b34156105e757600080fd5b6105ef611051565b6040518082815260200191505060405180910390f35b341561061057600080fd5b610618611056565b6040518082815260200191505060405180910390f35b341561063957600080fd5b61064161105c565b6040518082815260200191505060405180910390f35b341561066257600080fd5b61068e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611062565b60405180848152602001838152602001828152602001935050505060405180910390f35b34156106bd57600080fd5b6106c5611151565b604051808215151515815260200191505060405180910390f35b34156106ea57600080fd5b6106f2611164565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561073f57600080fd5b61074761117c565b6040518082815260200191505060405180910390f35b341561076857600080fd5b610770611182565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b16565b604051808215151515815260200191505060405180910390f35b341561080357600080fd5b61080b6111a8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085857600080fd5b6108606111c0565b6040518082815260200191505060405180910390f35b341561088157600080fd5b6108bf600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061126a565b005b34156108cc57600080fd5b6108d4611425565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092157600080fd5b61094d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143d565b005b341561095a57600080fd5b610a27600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061152b565b005b3415610a3457600080fd5b610a3c61160b565b6040518082815260200191505060405180910390f35b3415610a5d57600080fd5b610a89600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611612565b005b3415610a9657600080fd5b610ac2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116b1565b005b3415610acf57600080fd5b610ad7611806565b6040518082815260200191505060405180910390f35b3415610af857600080fd5b610b0061180c565b6040518082815260200191505060405180910390f35b6000600760009054906101000a900460ff16151515610b3457600080fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610b7c57600080fd5b600154600654101515610b8e57600080fd5b600354804210151515610ba057600080fd5b6005548042101515610bb157600080fd5b60008473ffffffffffffffffffffffffffffffffffffffff1614151515610bd757600080fd5b610be084610d20565b1515610beb57600080fd5b610bf43361181c565b151515610c0057600080fd5b64170cdc1e003a11151515610c1457600080fd5b60045442108015610c2757506003544210155b15610cba576002600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154101515610c9457670de0b6b3a76400003410151515610c8f57600080fd5b610cac565b6706f05b59d3b200003410151515610cab57600080fd5b5b610cb58461182f565b610cec565b67016345785d8a00003410151515610cd157600080fd5b600a543411151515610ce257600080fd5b610ceb846119f6565b5b600192505050919050565b732d8c705a66b2e87a9249380d4cdfe9d80bbf826b81565b60035481565b606381565b60055481565b6000806009805490501415610d385760009050610de6565b8173ffffffffffffffffffffffffffffffffffffffff166009600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154815481101515610da057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161490505b919050565b6103e881565b600060055442108015610e075750600154600654105b905090565b609681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6c57600080fd5b6001600760006101000a81548160ff021916908315150217905550565b6201518081565b600a5481565b6a2f10e78ab680ac479b37ec81565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610eed57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f4857600080fd5b6005548042101515610f5957600080fd5b81600a819055505050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe557600080fd5b6000600760006101000a81548160ff021916908315150217905550565b61103e81565b73c7b6dff52014e59cb88fac3b371fa955d0a9249f81565b60045481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61013481565b605381565b60015481565b60065481565b600080600061107084610d20565b151561107b57600080fd5b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b600760009054906101000a900460ff1681565b73ab376b3ec2ed446444911e549c7c953fb086070f81565b610ec481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73cb52583d19fd42c0f85a0c83a45dea6c73b9ebfb81565b600042600354111580156111d5575060045442105b1561123a576002600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015156112305761103e9050611267565b610ec49050611267565b426004541115801561124d575060055442105b1561125c57610ec49050611267565b6000151561126657fe5b5b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b60055480421015156112d657600080fd5b6112df84610d20565b151561141f5782600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555081600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600980548060010182816113899190611d7c565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555003600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b50505050565b7368500ffefb57d88a600e2f1c63bb5866e7107b6b81565b600554421180611451575060015460065410155b151561145c57600080fd5b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df8de3e7826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561151857600080fd5b5af1151561152557600080fd5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561158857600080fd5b600554804210151561159957600080fd5b600091505b8451821015611604576115f785838151811015156115b857fe5b9060200190602002015185848151811015156115d057fe5b9060200190602002015185858151811015156115e857fe5b9060200190602002015161126a565b818060010192505061159e565b5050505050565b6206978081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561166d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561174857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61016881565b6b0110f837d8942a518a00000081565b600080823b905060008111915050919050565b6000806000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154945060008511151561188b57600080fd5b6118a2600654600154611a7d90919063ffffffff16565b93507fb748a9cc5aa4a3cfef03083277a7b72bafcb2585bf49cc5f82c24d23016865eb846040518082815260200191505060405180910390a16000841115156118ea57600080fd5b6118fd3486611a9690919063ffffffff16565b92507fc7c496a9180801bf1a6715b594c6d98c53f0fca5d220af22363ab356f5042d86836040518082815260200191505060405180910390a16119408484611aaf565b809250819350505061199d82600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611a7d90919063ffffffff16565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506119ee868383611aee565b505050505050565b6000806000611a12600654600154611a7d90919063ffffffff16565b92507fb748a9cc5aa4a3cfef03083277a7b72bafcb2585bf49cc5f82c24d23016865eb836040518082815260200191505060405180910390a1600083111515611a5a57600080fd5b611a648334611aaf565b8092508193505050611a77848383611aee565b50505050565b6000828211151515611a8b57fe5b818303905092915050565b6000818310611aa55781611aa7565b825b905092915050565b6000806000611abc6111c0565b905083810291508185101515611ad457839250611ae6565b8085811515611adf57fe5b0492508491505b509250929050565b6000823410151515611aff57600080fd5b6000831115611cf957600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379c6506885846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611bcc57600080fd5b5af11515611bd957600080fd5b505050604051805190501515611bee57600080fd5b7f2a0fd5fe7417ee3a5f311807ed2f06290f263a11ae83023e1718b3a549ba5132836040518082815260200191505060405180910390a1600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501515611c8757600080fd5b611c9c82600654611d5e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff167fa3ed4207b1480804a4590a74f4b9cc310dc0fc839af8d10e2141ca3b72fd93488484604051808381526020018281526020019250505060405180910390a25b611d0c8334611a7d90919063ffffffff16565b90506000811115611d58573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515611d5757600080fd5b5b50505050565b6000808284019050838110151515611d7257fe5b8091505092915050565b815481835581811511611da357818360005260206000209182019101611da29190611da8565b5b505050565b611dca91905b80821115611dc6576000816000905550600101611dae565b5090565b905600a165627a7a723058208ce418510f6eda9177ef93ecd860bed8443be5d511782baef6f6e49371830e860029

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

000000000000000000000000bd24cef65610bea92efe6b5cc2af9758637e2200000000000000000000000000000000000000000000000000000000005ad4c880

-----Decoded View---------------
Arg [0] : _dmlwallet (address): 0xbd24CEF65610bEa92EFe6B5cc2aF9758637E2200
Arg [1] : _bootTime (uint256): 1523894400

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bd24cef65610bea92efe6b5cc2af9758637e2200
Arg [1] : 000000000000000000000000000000000000000000000000000000005ad4c880


Swarm Source

bzzr://cc4a19b940b5662869c66f40e20548d1972d6af64a6a865ca514b020549ece2c

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.