ETH Price: $2,102.77 (+3.03%)

Contract

0x2690402E8d303C1cA4eCeFF9E17C85Dd7383Ef47
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Stop75907952019-04-18 9:00:282520 days ago1555578028IN
0x2690402E...d7383Ef47
0 ETH0.0004245610
Private Mint75907702019-04-18 8:53:342520 days ago1555577614IN
0x2690402E...d7383Ef47
0 ETH0.0041471310
Transfer75581002019-04-13 6:45:532526 days ago1555137953IN
0x2690402E...d7383Ef47
1.05 ETH0.003803458.1
Transfer75577612019-04-13 5:27:562526 days ago1555133276IN
0x2690402E...d7383Ef47
1.05 ETH0.0249802100
Transfer75577092019-04-13 5:14:572526 days ago1555132497IN
0x2690402E...d7383Ef47
1.005 ETH0.0049839100
Transfer75575932019-04-13 4:49:032526 days ago1555130943IN
0x2690402E...d7383Ef47
1 ETH0.0006664611.1669519
Transfer75427552019-04-10 21:30:362528 days ago1554931836IN
0x2690402E...d7383Ef47
0.27 ETH0.002347815
Transfer75424142019-04-10 20:14:552528 days ago1554927295IN
0x2690402E...d7383Ef47
1 ETH0.000194373.9
Transfer75423932019-04-10 20:11:132528 days ago1554927073IN
0x2690402E...d7383Ef47
1 ETH0.000194373.9
Transfer75392282019-04-10 8:27:072528 days ago1554884827IN
0x2690402E...d7383Ef47
0.19716307 ETH0.004915398.13050009
Transfer72573692019-02-23 12:43:032574 days ago1550925783IN
0x2690402E...d7383Ef47
1 ETH0.0191868541
Transfer72366632019-02-18 15:53:102579 days ago1550505190IN
0x2690402E...d7383Ef47
1.04 ETH0.0179568541
Transfer72366402019-02-18 15:46:422579 days ago1550504802IN
0x2690402E...d7383Ef47
6 ETH0.0179568541
Transfer72237032019-02-15 13:37:132582 days ago1550237833IN
0x2690402E...d7383Ef47
0.071 ETH0.0046797210
Transfer72233142019-02-15 11:34:362582 days ago1550230476IN
0x2690402E...d7383Ef47
0.5 ETH0.0003999910
Transfer72197042019-02-14 14:36:092583 days ago1550154969IN
0x2690402E...d7383Ef47
0.97969 ETH0.0046797210
Transfer72080702019-02-11 20:05:592586 days ago1549915559IN
0x2690402E...d7383Ef47
3.1 ETH0.0179568541
Transfer72076762019-02-11 17:52:302586 days ago1549907550IN
0x2690402E...d7383Ef47
1 ETH0.0191868541
Transfer71942462019-02-08 18:45:462589 days ago1549651546IN
0x2690402E...d7383Ef47
0.5 ETH0.0046797210
Transfer71705072019-02-03 22:37:542594 days ago1549233474IN
0x2690402E...d7383Ef47
0.1 ETH0.0191868541
Transfer71700992019-02-03 20:53:332594 days ago1549227213IN
0x2690402E...d7383Ef47
0.9 ETH0.003014865
Transfer71439672019-01-29 12:48:442599 days ago1548766124IN
0x2690402E...d7383Ef47
3.35 ETH0.0098110721
Transfer70534332019-01-12 11:46:332616 days ago1547293593IN
0x2690402E...d7383Ef47
0.17 ETH0.000464811
Transfer70515962019-01-12 3:59:422617 days ago1547265582IN
0x2690402E...d7383Ef47
0.5 ETH0.0190084641
Transfer70492002019-01-11 17:46:462617 days ago1547228806IN
0x2690402E...d7383Ef47
0.1391305 ETH0.003747218.08250099
View all transactions

Latest 19 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-75581002019-04-13 6:45:532526 days ago1555137953
0x2690402E...d7383Ef47
1.05 ETH
-75427552019-04-10 21:30:362528 days ago1554931836
0x2690402E...d7383Ef47
0.27 ETH
-75392282019-04-10 8:27:072528 days ago1554884827
0x2690402E...d7383Ef47
0.19716307 ETH
-72573692019-02-23 12:43:032574 days ago1550925783
0x2690402E...d7383Ef47
1 ETH
-72366632019-02-18 15:53:102579 days ago1550505190
0x2690402E...d7383Ef47
1.04 ETH
-72366402019-02-18 15:46:422579 days ago1550504802
0x2690402E...d7383Ef47
6 ETH
-72237032019-02-15 13:37:132582 days ago1550237833
0x2690402E...d7383Ef47
0.071 ETH
-72197042019-02-14 14:36:092583 days ago1550154969
0x2690402E...d7383Ef47
0.97969 ETH
-72080702019-02-11 20:05:592586 days ago1549915559
0x2690402E...d7383Ef47
3.1 ETH
-72076762019-02-11 17:52:302586 days ago1549907550
0x2690402E...d7383Ef47
1 ETH
-71942462019-02-08 18:45:462589 days ago1549651546
0x2690402E...d7383Ef47
0.5 ETH
-71705072019-02-03 22:37:542594 days ago1549233474
0x2690402E...d7383Ef47
0.1 ETH
-71700992019-02-03 20:53:332594 days ago1549227213
0x2690402E...d7383Ef47
0.9 ETH
-71439672019-01-29 12:48:442599 days ago1548766124
0x2690402E...d7383Ef47
3.35 ETH
-70534332019-01-12 11:46:332616 days ago1547293593
0x2690402E...d7383Ef47
0.17 ETH
-70515962019-01-12 3:59:422617 days ago1547265582
0x2690402E...d7383Ef47
0.5 ETH
-70492002019-01-11 17:46:462617 days ago1547228806
0x2690402E...d7383Ef47
0.1391305 ETH
-70475592019-01-11 10:38:542617 days ago1547203134
0x2690402E...d7383Ef47
0.071 ETH
-70473202019-01-11 9:41:122617 days ago1547199672
0x2690402E...d7383Ef47
0.071 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Crowdsale

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-01-10
*/

pragma solidity ^0.4.21;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 * This code is taken from openZeppelin without any changes.
 */
contract Ownable {
    address public owner;


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


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

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

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

}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {

    mapping (address => bool) public unpausedWallet;

    event Pause();
    event Unpause();

    bool public paused = true;


    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused(address _to) {
        require(!paused||unpausedWallet[msg.sender]||unpausedWallet[_to]);
        _;
    }

    // Add a wallet ignoring the "Exchange pause". Available to the owner of the contract.
    function setUnpausedWallet(address _wallet, bool mode) public {
        require(owner == msg.sender || msg.sender == Crowdsale(owner).wallets(uint8(Crowdsale.Roles.manager)));
        unpausedWallet[_wallet] = mode;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function setPause(bool mode) public onlyOwner {
        if (!paused && mode) {
            paused = true;
            emit Pause();
        }
        if (paused && !mode) {
            paused = false;
            emit Unpause();
        }
    }

}

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

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

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 * This code is taken from openZeppelin without any changes.
 */
contract BasicToken is ERC20Basic {
    using SafeMath for uint256;

    mapping(address => uint256) balances;

    uint256 totalSupply_;

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

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

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

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

}

/**
* @title 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
* This code is taken from openZeppelin without any changes.
*/
contract StandardToken is ERC20, BasicToken {

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


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

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit 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;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

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

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

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

}

/**
 * @title Pausable token
 * @dev StandardToken modified with pausable transfers.
 **/
contract PausableToken is StandardToken, Pausable {

    mapping (address => bool) public grantedToSetUnpausedWallet;

    function transfer(address _to, uint256 _value) public whenNotPaused(_to) returns (bool) {
        return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused(_to) returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }

    function grantToSetUnpausedWallet(address _to, bool permission) public {
        require(owner == msg.sender || msg.sender == Crowdsale(owner).wallets(uint8(Crowdsale.Roles.manager)));
        grantedToSetUnpausedWallet[_to] = permission;
    }

    // Add a wallet ignoring the "Exchange pause". Available to the owner of the contract.
    function setUnpausedWallet(address _wallet, bool mode) public {
        require(owner == msg.sender || grantedToSetUnpausedWallet[msg.sender] || msg.sender == Crowdsale(owner).wallets(uint8(Crowdsale.Roles.manager)));
        unpausedWallet[_wallet] = mode;
    }
}

contract FreezingToken is PausableToken {
    struct freeze {
    uint256 amount;
    uint256 when;
    }


    mapping (address => freeze) freezedTokens;


    // @ Do I have to use the function      no
    // @ When it is possible to call        any time
    // @ When it is launched automatically  -
    // @ Who can call the function          any
    function freezedTokenOf(address _beneficiary) public view returns (uint256 amount){
        freeze storage _freeze = freezedTokens[_beneficiary];
        if(_freeze.when < now) return 0;
        return _freeze.amount;
    }

    // @ Do I have to use the function      no
    // @ When it is possible to call        any time
    // @ When it is launched automatically  -
    // @ Who can call the function          any
    function defrostDate(address _beneficiary) public view returns (uint256 Date) {
        freeze storage _freeze = freezedTokens[_beneficiary];
        if(_freeze.when < now) return 0;
        return _freeze.when;
    }


    // ***CHECK***SCENARIO***
    function freezeTokens(address _beneficiary, uint256 _amount, uint256 _when) public onlyOwner {
        freeze storage _freeze = freezedTokens[_beneficiary];
        _freeze.amount = _amount;
        _freeze.when = _when;
    }

    function transferAndFreeze(address _to, uint256 _value, uint256 _when) external {
        require(unpausedWallet[msg.sender]);
        if(_when > 0){
            freeze storage _freeze = freezedTokens[_to];
            _freeze.amount = _freeze.amount.add(_value);
            _freeze.when = (_freeze.when > _when)? _freeze.when: _when;
        }
        transfer(_to,_value);
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(balanceOf(msg.sender) >= freezedTokenOf(msg.sender).add(_value));
        return super.transfer(_to,_value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(balanceOf(_from) >= freezedTokenOf(_from).add(_value));
        return super.transferFrom( _from,_to,_value);
    }



}

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 * This code is taken from openZeppelin without any changes.
 */
contract MintableToken is StandardToken, Ownable {
    event Mint(address indexed to, uint256 amount);
    event MintFinished();

    /**
     * @dev Function to mint tokens
     * @param _to The address that will receive the minted tokens.
     * @param _amount The amount of tokens to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(address _to, uint256 _amount) onlyOwner public returns (bool) {
        totalSupply_ = totalSupply_.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        emit Mint(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        return true;
    }
}

contract MigrationAgent
{
    function migrateFrom(address _from, uint256 _value) public;
}

contract MigratableToken is BasicToken,Ownable {

    uint256 public totalMigrated;
    address public migrationAgent;

    event Migrate(address indexed _from, address indexed _to, uint256 _value);

    function setMigrationAgent(address _migrationAgent) public onlyOwner {
        require(migrationAgent == 0x0);
        migrationAgent = _migrationAgent;
    }

    function migrateInternal(address _holder) internal {
        require(migrationAgent != 0x0);

        uint256 value = balances[_holder];
        balances[_holder] = 0;

        totalSupply_ = totalSupply_.sub(value);
        totalMigrated = totalMigrated.add(value);

        MigrationAgent(migrationAgent).migrateFrom(_holder, value);
        emit Migrate(_holder,migrationAgent,value);
    }

    function migrateAll(address[] _holders) public onlyOwner {
        for(uint i = 0; i < _holders.length; i++){
            migrateInternal(_holders[i]);
        }
    }

    // Reissue your tokens.
    function migrate() public
    {
        require(balances[msg.sender] > 0);
        migrateInternal(msg.sender);
    }

}

contract BurnableToken is BasicToken, Ownable {

    event Burn(address indexed burner, uint256 value);

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

        balances[_beneficiary] = balances[_beneficiary].sub(_value);
        totalSupply_ = totalSupply_.sub(_value);
        emit Burn(_beneficiary, _value);
        emit Transfer(_beneficiary, address(0), _value);
    }
}

contract UnburnableListToken is BurnableToken {

    mapping (address => bool) public grantedToSetUnburnableWallet;
    mapping (address => bool) public unburnableWallet;

    function grantToSetUnburnableWallet(address _to, bool permission) public {
        require(owner == msg.sender || msg.sender == Crowdsale(owner).wallets(uint8(Crowdsale.Roles.manager)));
        grantedToSetUnburnableWallet[_to] = permission;
    }

    // Add a wallet to unburnable list. After adding wallet can not be removed from list. Available to the owner of the contract.
    function setUnburnableWallet(address _wallet) public {
        require(owner == msg.sender || grantedToSetUnburnableWallet[msg.sender] || msg.sender == Crowdsale(owner).wallets(uint8(Crowdsale.Roles.manager)));
        unburnableWallet[_wallet] = true;
    }

    /**
     * @dev Burns a specific amount of tokens.
     * @param _value The amount of token to be burned.
     */
    function burn(address _beneficiary, uint256 _value) public onlyOwner {
        require(!unburnableWallet[_beneficiary]);

        return super.burn(_beneficiary, _value);
    }
}

/*
* Contract that is working with ERC223 tokens
*/
contract ERC223ReceivingContract {
    function tokenFallback(address _from, uint _value, bytes _data) public;
}

// (A2)
// Contract token
contract Token is FreezingToken, MintableToken, MigratableToken, UnburnableListToken {
    string public constant name = "TOSS";

    string public constant symbol = "PROOF OF TOSS";

    uint8 public constant decimals = 18;

    mapping (address => mapping (address => bool)) public grantedToAllowBlocking; // Address of smart contract that can allow other contracts to block tokens
    mapping (address => mapping (address => bool)) public allowedToBlocking; // Address of smart contract that can block tokens
    mapping (address => mapping (address => uint256)) public blocked; // Blocked tokens per blocker

    event TokenOperationEvent(string operation, address indexed from, address indexed to, uint256 value, address indexed _contract);


    modifier contractOnly(address _to) {
        uint256 codeLength;

        assembly {
        // Retrieve the size of the code on target address, this needs assembly .
        codeLength := extcodesize(_to)
        }

        require(codeLength > 0);

        _;
    }

    /**
    * @dev Transfer the specified amount of tokens to the specified address.
    * Invokes the `tokenFallback` function if the recipient is a contract.
    * The token transfer fails if the recipient is a contract
    * but does not implement the `tokenFallback` function
    * or the fallback function to receive funds.
    *
    * @param _to Receiver address.
    * @param _value Amount of tokens that will be transferred.
    * @param _data Transaction metadata.
    */

    function transferToContract(address _to, uint256 _value, bytes _data) public contractOnly(_to) returns (bool) {
        // Standard function transfer similar to ERC20 transfer with no _data .
        // Added due to backwards compatibility reasons .


        super.transfer(_to, _value);

        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.tokenFallback(msg.sender, _value, _data);

        return true;
    }

    // @brief Allow another contract to allow another contract to block tokens. Can be revoked
    // @param _spender another contract address
    // @param _value amount of approved tokens
    function grantToAllowBlocking(address _contract, bool permission) contractOnly(_contract) public {


        grantedToAllowBlocking[msg.sender][_contract] = permission;

        emit TokenOperationEvent('grant_allow_blocking', msg.sender, _contract, 0, 0);
    }

    // @brief Allow another contract to block tokens. Can't be revoked
    // @param _owner tokens owner
    // @param _contract another contract address
    function allowBlocking(address _owner, address _contract) contractOnly(_contract) public {


        require(_contract != msg.sender && _contract != owner);

        require(grantedToAllowBlocking[_owner][msg.sender]);

        allowedToBlocking[_owner][_contract] = true;

        emit TokenOperationEvent('allow_blocking', _owner, _contract, 0, msg.sender);
    }

    // @brief Blocks tokens
    // @param _blocking The address of tokens which are being blocked
    // @param _value The blocked token count
    function blockTokens(address _blocking, uint256 _value) whenNotPaused(_blocking) public {
        require(allowedToBlocking[_blocking][msg.sender]);

        require(balanceOf(_blocking) >= freezedTokenOf(_blocking).add(_value) && _value > 0);

        balances[_blocking] = balances[_blocking].sub(_value);
        blocked[_blocking][msg.sender] = blocked[_blocking][msg.sender].add(_value);

        emit Transfer(_blocking, address(0), _value);
        emit TokenOperationEvent('block', _blocking, 0, _value, msg.sender);
    }

    // @brief Unblocks tokens and sends them to the given address (to _unblockTo)
    // @param _blocking The address of tokens which are blocked
    // @param _unblockTo The address to send to the blocked tokens after unblocking
    // @param _value The blocked token count to unblock
    function unblockTokens(address _blocking, address _unblockTo, uint256 _value) whenNotPaused(_unblockTo) public {
        require(allowedToBlocking[_blocking][msg.sender]);
        require(blocked[_blocking][msg.sender] >= _value && _value > 0);

        blocked[_blocking][msg.sender] = blocked[_blocking][msg.sender].sub(_value);
        balances[_unblockTo] = balances[_unblockTo].add(_value);

        emit Transfer(address(0), _blocking, _value);

        if (_blocking != _unblockTo) {
            emit Transfer(_blocking, _unblockTo, _value);
        }

        emit TokenOperationEvent('unblock', _blocking, _unblockTo, _value, msg.sender);
    }
}

// (A3)
// Contract for freezing of investors' funds. Hence, investors will be able to withdraw money if the
// round does not attain the softcap. From here the wallet of the beneficiary will receive all the
// money (namely, the beneficiary, not the manager's wallet).
contract RefundVault is Ownable {
    using SafeMath for uint256;

    enum State { Active, Refunding, Closed }

    uint8 round;

    mapping (uint8 => mapping (address => uint256)) public deposited;

    State public state;

    event Closed();
    event RefundsEnabled();
    event Refunded(address indexed beneficiary, uint256 weiAmount);
    event Deposited(address indexed beneficiary, uint256 weiAmount);

    function RefundVault() public {
        state = State.Active;
    }

    // Depositing funds on behalf of an TokenSale investor. Available to the owner of the contract (Crowdsale Contract).
    function deposit(address investor) onlyOwner public payable {
        require(state == State.Active);
        deposited[round][investor] = deposited[round][investor].add(msg.value);
        emit Deposited(investor,msg.value);
    }

    // Move the collected funds to a specified address. Available to the owner of the contract.
    function close(address _wallet1, address _wallet2, uint256 _feesValue) onlyOwner public {
        require(state == State.Active);
        require(_wallet1 != 0x0);
        state = State.Closed;
        emit Closed();
        if(_wallet2 != 0x0)
        _wallet2.transfer(_feesValue);
        _wallet1.transfer(address(this).balance);
    }

    // Allow refund to investors. Available to the owner of the contract.
    function enableRefunds() onlyOwner public {
        require(state == State.Active);
        state = State.Refunding;
        emit RefundsEnabled();
    }

    // Return the funds to a specified investor. In case of failure of the round, the investor
    // should call this method of this contract (RefundVault) or call the method claimRefund of Crowdsale
    // contract. This function should be called either by the investor himself, or the company
    // (or anyone) can call this function in the loop to return funds to all investors en masse.
    function refund(address investor) public {
        require(state == State.Refunding);
        uint256 depositedValue = deposited[round][investor];
        require(depositedValue > 0);
        deposited[round][investor] = 0;
        investor.transfer(depositedValue);
        emit Refunded(investor, depositedValue);
    }

    function restart() external onlyOwner {
        require(state == State.Closed);
        round++;
        state = State.Active;

    }

    // Destruction of the contract with return of funds to the specified address. Available to
    // the owner of the contract.
    function del(address _wallet) external onlyOwner {
        selfdestruct(_wallet);
    }
}

// The contract for freezing tokens for the players and investors..
contract PeriodicAllocation is Ownable {
    using SafeMath for uint256;

    struct Share {
        uint256 proportion;
        uint256 periods;
        uint256 periodLength;
    }

    // How many days to freeze from the moment of finalizing ICO
    uint256 public unlockStart;
    uint256 public totalShare;

    mapping(address => Share) public shares;
    mapping(address => uint256) public unlocked;

    ERC20Basic public token;

    function PeriodicAllocation(ERC20Basic _token) public {
        token = _token;
    }

    function setUnlockStart(uint256 _unlockStart) onlyOwner external {
        require(unlockStart == 0);
        require(_unlockStart >= now);

        unlockStart = _unlockStart;
    }

    function addShare(address _beneficiary, uint256 _proportion, uint256 _periods, uint256 _periodLength) onlyOwner external {
        shares[_beneficiary] = Share(shares[_beneficiary].proportion.add(_proportion),_periods,_periodLength);
        totalShare = totalShare.add(_proportion);
    }

    // If the time of freezing expired will return the funds to the owner.
    function unlockFor(address _owner) public {
        require(unlockStart > 0);
        require(now >= (unlockStart.add(shares[_owner].periodLength)));
        uint256 share = shares[_owner].proportion;
        uint256 periodsSinceUnlockStart = (now.sub(unlockStart)).div(shares[_owner].periodLength);

        if (periodsSinceUnlockStart < shares[_owner].periods) {
            share = share.div(shares[_owner].periods).mul(periodsSinceUnlockStart);
        }

        share = share.sub(unlocked[_owner]);

        if (share > 0) {
            uint256 unlockedToken = token.balanceOf(this).mul(share).div(totalShare);
            totalShare = totalShare.sub(share);
            unlocked[_owner] += share;
            token.transfer(_owner,unlockedToken);
        }
    }
}

contract AllocationQueue is Ownable {
    using SafeMath for uint256;

    // address => date => tokens
    mapping(address => mapping(uint256 => uint256)) public queue;
    uint256 public totalShare;

    ERC20Basic public token;

    uint constant DAY_IN_SECONDS = 86400;
    uint constant YEAR_IN_SECONDS = 31536000;
    uint constant LEAP_YEAR_IN_SECONDS = 31622400;

    uint16 constant ORIGIN_YEAR = 1970;
    uint constant LEAP_YEARS_BEFORE_ORIGIN_YEAR = 477;

    function AllocationQueue(ERC20Basic _token) public {
        token = _token;
    }

    function isLeapYear(uint16 year) internal pure returns (bool) {
        if (year % 4 != 0) {
            return false;
        }
        if (year % 100 != 0) {
            return true;
        }
        if (year % 400 != 0) {
            return false;
        }
        return true;
    }

    function groupDates(uint256 _date) internal view returns (uint256) {
        uint secondsAccountedFor = 0;

        // Year
        uint year = ORIGIN_YEAR + _date / YEAR_IN_SECONDS;
        uint numLeapYears = ((year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) - LEAP_YEARS_BEFORE_ORIGIN_YEAR; // leapYearsBefore(year) - LEAP_YEARS_BEFORE_ORIGIN_YEAR

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

        while (secondsAccountedFor > _date) {
            if (isLeapYear(uint16(year - 1))) {
                secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
            }
            else {
                secondsAccountedFor -= YEAR_IN_SECONDS;
            }
            year -= 1;
        }

        // Month
        uint8 month;

        uint seconds31 = 31 * DAY_IN_SECONDS;
        uint seconds30 = 30 * DAY_IN_SECONDS;
        uint secondsFeb = (isLeapYear(uint16(year)) ? 29 : 28) * DAY_IN_SECONDS;

        if (secondsAccountedFor + seconds31 > _date) {
            month = 1;
        } else if (secondsAccountedFor + seconds31 + secondsFeb > _date) {
            month = 2;
        } else if (secondsAccountedFor + 2 * seconds31 + secondsFeb > _date) {
            month = 3;
        } else if (secondsAccountedFor + 2 * seconds31 + seconds30 + secondsFeb > _date) {
            month = 4;
        } else if (secondsAccountedFor + 3 * seconds31 + seconds30 + secondsFeb > _date) {
            month = 5;
        } else if (secondsAccountedFor + 3 * seconds31 + 2 * seconds30 + secondsFeb > _date) {
            month = 6;
        } else if (secondsAccountedFor + 4 * seconds31 + 2 * seconds30 + secondsFeb > _date) {
            month = 7;
        } else if (secondsAccountedFor + 5 * seconds31 + 2 * seconds30 + secondsFeb > _date) {
            month = 8;
        } else if (secondsAccountedFor + 5 * seconds31 + 3 * seconds30 + secondsFeb > _date) {
            month = 9;
        } else if (secondsAccountedFor + 6 * seconds31 + 3 * seconds30 + secondsFeb > _date) {
            month = 10;
        } else if (secondsAccountedFor + 6 * seconds31 + 4 * seconds30 + secondsFeb > _date) {
            month = 11;
        } else {
            month = 12;
        }

        return uint256(year) * 100 + uint256(month);
    }

    function addShare(address _beneficiary, uint256 _tokens, uint256 _freezeTime) onlyOwner external {
        require(_beneficiary != 0x0);
        require(token.balanceOf(this) == totalShare.add(_tokens));

        uint256 currentDate = groupDates(now);
        uint256 unfreezeDate = groupDates(now.add(_freezeTime));

        require(unfreezeDate > currentDate);

        queue[_beneficiary][unfreezeDate] = queue[_beneficiary][unfreezeDate].add(_tokens);
        totalShare = totalShare.add(_tokens);
    }

    function unlockFor(address _owner, uint256 _date) public {
        uint256 date = groupDates(_date);

        require(date <= groupDates(now));

        uint256 share = queue[_owner][date];

        queue[_owner][date] = 0;

        if (share > 0) {
            token.transfer(_owner,share);
            totalShare = totalShare.sub(share);
        }
    }

    // Available to unlock funds for the date. Constant.
    function getShare(address _owner, uint256 _date) public view returns(uint256){
        uint256 date = groupDates(_date);

        return queue[_owner][date];
    }
}

contract Creator{
    Token public token = new Token();
    RefundVault public refund = new RefundVault();

    function createToken() external returns (Token) {
        token.transferOwnership(msg.sender);
        return token;
    }

    function createPeriodicAllocation(Token _token) external returns (PeriodicAllocation) {
        PeriodicAllocation allocation = new PeriodicAllocation(_token);
        allocation.transferOwnership(msg.sender);
        return allocation;
    }

    function createAllocationQueue(Token _token) external returns (AllocationQueue) {
        AllocationQueue allocation = new AllocationQueue(_token);
        allocation.transferOwnership(msg.sender);
        return allocation;
    }

    function createRefund() external returns (RefundVault) {
        refund.transferOwnership(msg.sender);
        return refund;
    }

}

// Project: toss.pro
// Developed by AXIOMAdev.com and CryptoB2B.io
// Copying in whole or in part is prohibited

// (A1)
// The main contract for the sale and management of rounds.
// 0000000000000000000000000000000000000000000000000000000000000000
contract Crowdsale{

    uint256 constant USER_UNPAUSE_TOKEN_TIMEOUT =  60 days;
    uint256 constant FORCED_REFUND_TIMEOUT1     = 400 days;
    uint256 constant FORCED_REFUND_TIMEOUT2     = 600 days;
    uint256 constant ROUND_PROLONGATE           =   0 days;
    uint256 constant BURN_TOKENS_TIME           =  90 days;

    using SafeMath for uint256;

    enum TokenSaleType {round1, round2}
    TokenSaleType public TokenSale = TokenSaleType.round2;

    //              0             1         2        3        4        5       6       7        8     9     10        11       12
    enum Roles {beneficiary, accountant, manager, observer, bounty, advisers, team, founders, fund, fees, players, airdrop, referrals}

    Creator public creator;
    bool creator2;
    bool isBegin=false;
    Token public token;
    RefundVault public vault;
    PeriodicAllocation public allocation;
    AllocationQueue public allocationQueue;

    bool public isFinalized;
    bool public isInitialized;
    bool public isPausedCrowdsale;
    bool public chargeBonuses;

    // Initially, all next 7+ roles/wallets are given to the Manager. The Manager is an employee of the company
    // with knowledge of IT, who publishes the contract and sets it up. However, money and tokens require
    // a Beneficiary and other roles (Accountant, Team, etc.). The Manager will not have the right
    // to receive them. To enable this, the Manager must either enter specific wallets here, or perform
    // this via method changeWallet. In the finalization methods it is written which wallet and
    // what percentage of tokens are received.
    address[13] public wallets = [

    // Beneficiary
    // Receives all the money (when finalizing Round1 & Round2)
    0x4e82764a0be4E0859e87cD47eF348e8D892C2567,

    // Accountant
    // Receives all the tokens for non-ETH investors (when finalizing Round1 & Round2)
    0xD29f0aE1621F4Be48C4DF438038E38af546DA498,

    // Manager
    // All rights except the rights to receive tokens or money. Has the right to change any other
    // wallets (Beneficiary, Accountant, ...), but only if the round has not started. Once the
    // round is initialized, the Manager has lost all rights to change the wallets.
    // If the TokenSale is conducted by one person, then nothing needs to be changed. Permit all 7 roles
    // point to a single wallet.
    msg.sender,

    // Observer
    // Has only the right to call paymentsInOtherCurrency (please read the document)
    0x27609c2e3d9810FdFCe157F2c1d87b717d0b0C10,

    // Bounty - 1% freeze 2 month
    0xd7AC0393e2B29D8aC6221CF69c27171aba6278c4,

    // Advisers 4% freeze 1 month
    0x765f60E314766Bc25eb2a9F66991Fe867D42A449,

    // Team, 7%, freeze 50% 6 month, 50% 12 month
    0xF9f0c53c07803a2670a354F3de88482393ABdBac,

    // Founders, 11% freeze 50% 6 month, 50% 12 month
    0x4816b3bA11477e42A81FffA8a4e376e4D1a7f007,

    // Fund, 12% freeze 50% 2 month, 50% 12 month
    0xe3C02072f8145DabCd7E7fe769ba1E3e73688ECc,

    // Fees, 7% money
    0xEB29e654AFF7658394C9d413dDC66711ADD44F59,

    // Players and investors, 7% freezed. Unfreeze 1% per month after ICO finished
    0x6faEc0c1ff412Fd041aB30081Cae677B362bd3c1,

    // Airdrop, 4% freeze 2 month
    0x7AA186f397dB8aE1FB80897e4669c1Ea126BA788,

    // Referrals, 4% no freeze
    0xAC26988d1573FC6626069578E6A5a4264F76f0C5

    ];



    struct Bonus {
    uint256 value;
    uint256 procent;
    }

    struct Profit {
    uint256 percent;
    uint256 duration;
    }

    Bonus[] public bonuses;
    Profit[] public profits;


    uint256 public startTime= 1547197200;
    uint256 public stopTime= 0;

    // How many tokens (excluding the bonus) are transferred to the investor in exchange for 1 ETH
    // **QUINTILLIONS** 10^18 for human, *10**18 for Solidity, 1e18 for MyEtherWallet (MEW).
    // Example: if 1ETH = 40.5 Token ==> use 40500 finney
    uint256 public rate = 25000 ether;

    // ETH/USD rate in US$
    // **QUINTILLIONS** 10^18 / *10**18 / 1e18. Example: ETH/USD=$1000 ==> use 1000*10**18 (Solidity) or 1000 ether or 1000e18 (MEW)
    uint256 public exchange  = 150 ether; // not in use

    // If the round does not attain this value before the closing date, the round is recognized as a
    // failure and investors take the money back (the founders will not interfere in any way).
    // **QUINTILLIONS** 10^18 / *10**18 / 1e18. Example: softcap=15ETH ==> use 15*10**18 (Solidity) or 15e18 (MEW)
    uint256 public softCap = 16133 ether;

    // The maximum possible amount of income
    // **QUINTILLIONS** 10^18 / *10**18 / 1e18. Example: hardcap=123.45ETH ==> use 123450*10**15 (Solidity) or 12345e15 (MEW)
    uint256 public hardCap = 63333 ether;

    // If the last payment is slightly higher than the hardcap, then the usual contracts do
    // not accept it, because it goes beyond the hardcap. However it is more reasonable to accept the
    // last payment, very slightly raising the hardcap. The value indicates by how many ETH the
    // last payment can exceed the hardcap to allow it to be paid. Immediately after this payment, the
    // round closes. The funders should write here a small number, not more than 1% of the CAP.
    // Can be equal to zero, to cancel.
    // **QUINTILLIONS** 10^18 / *10**18 / 1e18
    uint256 public overLimit = 20 ether;

    // The minimum possible payment from an investor in ETH. Payments below this value will be rejected.
    // **QUINTILLIONS** 10^18 / *10**18 / 1e18. Example: minPay=0.1ETH ==> use 100*10**15 (Solidity) or 100e15 (MEW)
    uint256 public minPay = 71 finney;

    uint256 public maxAllProfit = 30;

    uint256 public ethWeiRaised;
    uint256 public nonEthWeiRaised;
    uint256 public weiRound1;
    uint256 public tokenReserved;

    uint256 public totalSaledToken;

    event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);

    event Finalized();
    event Initialized();

    function Crowdsale(Creator _creator) public
    {
        creator2=true;
        creator=_creator;
    }

    function onlyAdmin(bool forObserver) internal view {
        require(wallets[uint8(Roles.manager)] == msg.sender || wallets[uint8(Roles.beneficiary)] == msg.sender ||
        forObserver==true && wallets[uint8(Roles.observer)] == msg.sender);
    }

    // Setting of basic parameters, analog of class constructor
    // @ Do I have to use the function      see your scenario
    // @ When it is possible to call        before Round 1/2
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function begin() internal
    {
        if (isBegin) return;
        isBegin=true;

        token = creator.createToken();
        allocation = creator.createPeriodicAllocation(token);
        allocationQueue = creator.createAllocationQueue(token);

        if (creator2) {
            vault = creator.createRefund();
        }

        token.setUnpausedWallet(wallets[uint8(Roles.accountant)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.manager)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.bounty)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.advisers)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.observer)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.players)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.airdrop)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.fund)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.founders)], true);
        token.setUnpausedWallet(wallets[uint8(Roles.referrals)], true);

        token.setUnpausedWallet(allocation, true);
        token.setUnpausedWallet(allocationQueue, true);

        bonuses.push(Bonus(71 ether, 30));

        profits.push(Profit(15,2 days));
        profits.push(Profit(10,2 days));
        profits.push(Profit(5,4 days));

    }



    // Issue of tokens for the zero round, it is usually called: private pre-sale (Round 0)
    // @ Do I have to use the function      may be
    // @ When it is possible to call        before Round 1/2 and untill crowdsale end
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function privateMint(uint256 _amount) public {
        onlyAdmin(false);
        require(stopTime == 0);

        uint256 weiAmount = _amount.mul(1 ether).div(rate);
        bool withinCap = weiAmount <= hardCap.sub(weiRaised()).add(overLimit);

        require(withinCap);

        begin();

        // update state
        ethWeiRaised = ethWeiRaised.add(weiAmount);

        token.mint(wallets[uint8(Roles.accountant)],_amount);
        systemWalletsMint(_amount);
    }

    // info
    function totalSupply() external view returns (uint256){
        return token.totalSupply();
    }

    // Returns the name of the current round in plain text. Constant.
    function getTokenSaleType() external view returns(string){
        return (TokenSale == TokenSaleType.round1)?'round1':'round2';
    }

    // Transfers the funds of the investor to the contract of return of funds. Internal.
    function forwardFunds() internal {
        if(address(vault) != 0x0){
            vault.deposit.value(msg.value)(msg.sender);
        }else {
            if(address(this).balance > 0){
                wallets[uint8(Roles.beneficiary)].transfer(address(this).balance);
            }
        }

    }

    // Check for the possibility of buying tokens. Inside. Constant.
    function validPurchase() internal view returns (bool) {

        // The round started and did not end
        bool withinPeriod = (now > startTime && stopTime == 0);

        // Rate is greater than or equal to the minimum
        bool nonZeroPurchase = msg.value >= minPay;

        // hardCap is not reached, and in the event of a transaction, it will not be exceeded by more than OverLimit
        bool withinCap = msg.value <= hardCap.sub(weiRaised()).add(overLimit);

        // round is initialized and no "Pause of trading" is set
        return withinPeriod && nonZeroPurchase && withinCap && isInitialized && !isPausedCrowdsale;
    }

    // Check for the ability to finalize the round. Constant.
    function hasEnded() public view returns (bool) {

        bool capReached = weiRaised() >= hardCap;

        return (stopTime > 0 || capReached) && isInitialized;
    }

    // Finalize. Only available to the Manager and the Beneficiary. If the round failed, then
    // anyone can call the finalization to unlock the return of funds to investors
    // You must call a function to finalize each round (after the Round1 & after the Round2)
    // @ Do I have to use the function      yes
    // @ When it is possible to call        after end of Round1 & Round2
    // @ When it is launched automatically  no
    // @ Who can call the function          admins or anybody (if round is failed)
    function finalize() public {

        require(wallets[uint8(Roles.manager)] == msg.sender || wallets[uint8(Roles.beneficiary)] == msg.sender || !goalReached());
        require(!isFinalized);
        require(hasEnded() || ((wallets[uint8(Roles.manager)] == msg.sender || wallets[uint8(Roles.beneficiary)] == msg.sender) && goalReached()));

        isFinalized = true;
        finalization();
        emit Finalized();
    }

    // The logic of finalization. Internal
    // @ Do I have to use the function      no
    // @ When it is possible to call        -
    // @ When it is launched automatically  after end of round
    // @ Who can call the function          -
    function finalization() internal {

        if (stopTime == 0) {
            stopTime = now;
        }

        //uint256 feesValue;
        // If the goal of the achievement
        if (goalReached()) {

            if(address(vault) != 0x0){
                // Send ether to Beneficiary
                vault.close(wallets[uint8(Roles.beneficiary)], wallets[uint8(Roles.fees)], ethWeiRaised.mul(7).div(100)); //7% for fees
            }

            // if there is anything to give
            if (tokenReserved > 0) {

                token.mint(wallets[uint8(Roles.accountant)],tokenReserved);

                // Reset the counter
                tokenReserved = 0;
            }

            // If the finalization is Round 1
            if (TokenSale == TokenSaleType.round1) {

                // Reset settings
                isInitialized = false;
                isFinalized = false;

                // Switch to the second round (to Round2)
                TokenSale = TokenSaleType.round2;

                // Reset the collection counter
                weiRound1 = weiRaised();
                ethWeiRaised = 0;
                nonEthWeiRaised = 0;



            }
            else // If the second round is finalized
            {

                // Permission to collect tokens to those who can pick them up
                chargeBonuses = true;

                totalSaledToken = token.totalSupply();

            }

        }
        else if (address(vault) != 0x0) // If they failed round
        {
            // Allow investors to withdraw their funds

            vault.enableRefunds();
        }
    }

    // The Manager freezes the tokens for the Team.
    // You must call a function to finalize Round 2 (only after the Round2)
    // @ Do I have to use the function      yes
    // @ When it is possible to call        Round2
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function finalize2() public {

        onlyAdmin(false);
        require(chargeBonuses);
        chargeBonuses = false;

        allocation.addShare(wallets[uint8(Roles.players)], 7, 7, 30 days); // Freeze 7%. Unfreeze 1% per month after ICO finished

        allocation.setUnlockStart(now);
    }



    // Initializing the round. Available to the manager. After calling the function,
    // the Manager loses all rights: Manager can not change the settings (setup), change
    // wallets, prevent the beginning of the round, etc. You must call a function after setup
    // for the initial round (before the Round1 and before the Round2)
    // @ Do I have to use the function      yes
    // @ When it is possible to call        before each round
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function initialize() public {

        onlyAdmin(false);
        // If not yet initialized
        require(!isInitialized);
        begin();


        // And the specified start time has not yet come
        // If initialization return an error, check the start date!
        require(now <= startTime);

        initialization();

        emit Initialized();

        isInitialized = true;
    }

    function initialization() internal {
        if (address(vault) != 0x0 && vault.state() != RefundVault.State.Active){
            vault.restart();
        }
    }

    // Manually stops the round. Available to the manager.
    // @ Do I have to use the function      yes
    // @ When it is possible to call        after each round
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function stop() public {
        onlyAdmin(false);

        require(stopTime == 0 && now > startTime);

        stopTime = now;
    }

    // At the request of the investor, we raise the funds (if the round has failed because of the hardcap)
    // @ Do I have to use the function      no
    // @ When it is possible to call        if round is failed (softcap not reached)
    // @ When it is launched automatically  -
    // @ Who can call the function          all investors
    function claimRefund() external {
        require(address(vault) != 0x0);
        vault.refund(msg.sender);
    }

    // We check whether we collected the necessary minimum funds. Constant.
    function goalReached() public view returns (bool) {
        return weiRaised() >= softCap;
    }


    // Customize. The arguments are described in the constructor above.
    // @ Do I have to use the function      yes
    // @ When it is possible to call        before each round
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function setup(uint256 _startTime, uint256 _softCap, uint256 _hardCap,
    uint256 _rate, uint256 _exchange,
    uint256 _maxAllProfit, uint256 _overLimit, uint256 _minPay,
    uint256[] _durationTB , uint256[] _percentTB, uint256[] _valueVB, uint256[] _percentVB) public
    {

        onlyAdmin(false);
        require(!isInitialized);

        begin();

        // Date and time are correct
        require(now <= _startTime);
        startTime = _startTime;

        // The parameters are correct
        require(_softCap <= _hardCap);
        softCap = _softCap;
        hardCap = _hardCap;

        require(_rate > 0);
        rate = _rate;

        overLimit = _overLimit;
        minPay = _minPay;
        exchange = _exchange;
        maxAllProfit = _maxAllProfit;

        require(_valueVB.length == _percentVB.length);
        bonuses.length = _valueVB.length;
        for(uint256 i = 0; i < _valueVB.length; i++){
            bonuses[i] = Bonus(_valueVB[i],_percentVB[i]);
        }

        require(_percentTB.length == _durationTB.length);
        profits.length = _percentTB.length;
        for( i = 0; i < _percentTB.length; i++){
            profits[i] = Profit(_percentTB[i],_durationTB[i]);
        }

    }

    // Collected funds for the current round. Constant.
    function weiRaised() public constant returns(uint256){
        return ethWeiRaised.add(nonEthWeiRaised);
    }

    // Returns the amount of fees for both phases. Constant.
    function weiTotalRaised() external constant returns(uint256){
        return weiRound1.add(weiRaised());
    }

    // Returns the percentage of the bonus on the current date. Constant.
    function getProfitPercent() public constant returns (uint256){
        return getProfitPercentForData(now);
    }

    // Returns the percentage of the bonus on the given date. Constant.
    function getProfitPercentForData(uint256 _timeNow) public constant returns (uint256){
        uint256 allDuration;
        for(uint8 i = 0; i < profits.length; i++){
            allDuration = allDuration.add(profits[i].duration);
            if(_timeNow < startTime.add(allDuration)){
                return profits[i].percent;
            }
        }
        return 0;
    }

    function getBonuses(uint256 _value) public constant returns (uint256,uint256){
        if(bonuses.length == 0 || bonuses[0].value > _value){
            return (0,0);
        }
        uint16 i = 1;
        for(i; i < bonuses.length; i++){
            if(bonuses[i].value > _value){
                break;
            }
        }
        return (bonuses[i-1].value,bonuses[i-1].procent);
    }

    // Remove the "Pause of exchange". Available to the manager at any time. If the
    // manager refuses to remove the pause, then 30-120 days after the successful
    // completion of the TokenSale, anyone can remove a pause and allow the exchange to continue.
    // The manager does not interfere and will not be able to delay the term.
    // He can only cancel the pause before the appointed time.
    // ***CHECK***SCENARIO***
    // @ Do I have to use the function      YES YES YES
    // @ When it is possible to call        after end of Token Sale  (or any time - not necessary)
    // @ When it is launched automatically  -
    // @ Who can call the function          admins or anybody
    function tokenUnpause() external {

        require(wallets[uint8(Roles.manager)] == msg.sender
        || (stopTime != 0 && now > stopTime.add(USER_UNPAUSE_TOKEN_TIMEOUT) && TokenSale == TokenSaleType.round2 && isFinalized && goalReached()));
        token.setPause(false);
    }

    // Enable the "Pause of exchange". Available to the manager until the TokenSale is completed.
    // The manager cannot turn on the pause, for example, 3 years after the end of the TokenSale.
    // ***CHECK***SCENARIO***
    // @ Do I have to use the function      no
    // @ When it is possible to call        while Round2 not ended
    // @ When it is launched automatically  Round0
    // @ Who can call the function          admins
    function tokenPause() public {
        onlyAdmin(false);
        require(!isFinalized);
        token.setPause(true);
    }

    // Pause of sale. Available to the manager.
    // @ Do I have to use the function      no
    // @ When it is possible to call        during active rounds
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function setCrowdsalePause(bool mode) public {
        onlyAdmin(false);
        isPausedCrowdsale = mode;
    }

    // For example - After 5 years of the project's existence, all of us suddenly decided collectively
    // (company + investors) that it would be more profitable for everyone to switch to another smart
    // contract responsible for tokens. The company then prepares a new token, investors
    // disassemble, study, discuss, etc. After a general agreement, the manager allows any investor:
    //      - to burn the tokens of the previous contract
    //      - generate new tokens for a new contract
    // It is understood that after a general solution through this function all investors
    // will collectively (and voluntarily) move to a new token.
    // @ Do I have to use the function      no
    // @ When it is possible to call        only after Token Sale!
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function moveTokens(address _migrationAgent) public {
        onlyAdmin(false);
        token.setMigrationAgent(_migrationAgent);
    }

    // @ Do I have to use the function      no
    // @ When it is possible to call        only after Token Sale!
    // @ When it is launched automatically  -
    // @ Who can call the function          admins
    function migrateAll(address[] _holders) public {
        onlyAdmin(false);
        token.migrateAll(_holders);
    }

    // Change the address for the specified role.
    // Available to any wallet owner except the observer.
    // Available to the manager until the round is initialized.
    // The Observer's wallet or his own manager can change at any time.
    // @ Do I have to use the function      no
    // @ When it is possible to call        depend...
    // @ When it is launched automatically  -
    // @ Who can call the function          staff (all 7+ roles)
    function changeWallet(Roles _role, address _wallet) external
    {
        require(
        (msg.sender == wallets[uint8(_role)] && _role != Roles.observer)
        ||
        (msg.sender == wallets[uint8(Roles.manager)] && (!isInitialized || _role == Roles.observer) && _role != Roles.fees )
        );

        wallets[uint8(_role)] = _wallet;
    }


    // The beneficiary at any time can take rights in all roles and prescribe his wallet in all the
    // rollers. Thus, he will become the recipient of tokens for the role of Accountant,
    // Team, etc. Works at any time.
    // @ Do I have to use the function      no
    // @ When it is possible to call        any time
    // @ When it is launched automatically  -
    // @ Who can call the function          only Beneficiary
    function resetAllWallets() external{
        address _beneficiary = wallets[uint8(Roles.beneficiary)];
        require(msg.sender == _beneficiary);
        for(uint8 i = 0; i < wallets.length; i++){
            if(uint8(Roles.fees) == i || uint8(Roles.team) == i)
                continue;

            wallets[i] = _beneficiary;
        }
        token.setUnpausedWallet(_beneficiary, true);
    }


    // Burn the investor tokens, if provided by the Token Sale scenario. Limited time available - BURN_TOKENS_TIME
    // ***CHECK***SCENARIO***
    // @ Do I have to use the function      no
    // @ When it is possible to call        any time
    // @ When it is launched automatically  -
    // @ Who can call the function          admin
    function massBurnTokens(address[] _beneficiary, uint256[] _value) external {
        onlyAdmin(false);
        require(stopTime == 0 || stopTime.add(BURN_TOKENS_TIME) > now);
        require(_beneficiary.length == _value.length);
        for(uint16 i; i<_beneficiary.length; i++) {
            token.burn(_beneficiary[i],_value[i]);
        }
    }

    // If a little more than a year has elapsed (Round2 start date + 400 days), a smart contract
    // will allow you to send all the money to the Beneficiary, if any money is present. This is
    // possible if you mistakenly launch the Round2 for 30 years (not 30 days), investors will transfer
    // money there and you will not be able to pick them up within a reasonable time. It is also
    // possible that in our checked script someone will make unforeseen mistakes, spoiling the
    // finalization. Without finalization, money cannot be returned. This is a rescue option to
    // get around this problem, but available only after a year (400 days).

    // Another reason - the TokenSale was a failure, but not all ETH investors took their money during the year after.
    // Some investors may have lost a wallet key, for example.

    // The method works equally with the Round1 and Round2. When the Round1 starts, the time for unlocking
    // the distructVault begins. If the TokenSale is then started, then the term starts anew from the first day of the TokenSale.

    // Next, act independently, in accordance with obligations to investors.

    // Within 400 days (FORCED_REFUND_TIMEOUT1) of the start of the Round, if it fails only investors can take money. After
    // the deadline this can also include the company as well as investors, depending on who is the first to use the method.
    // @ Do I have to use the function      no
    // @ When it is possible to call        -
    // @ When it is launched automatically  -
    // @ Who can call the function          beneficiary & manager
    function distructVault() public {
        require(address(vault) != 0x0);
        require(stopTime != 0 && !goalReached());

        if (wallets[uint8(Roles.beneficiary)] == msg.sender && (now > startTime.add(FORCED_REFUND_TIMEOUT1))) {
            vault.del(wallets[uint8(Roles.beneficiary)]);
        }
        if (wallets[uint8(Roles.manager)] == msg.sender && (now > startTime.add(FORCED_REFUND_TIMEOUT2))) {
            vault.del(wallets[uint8(Roles.manager)]);
        }
    }


    // We accept payments other than Ethereum (ETH) and other currencies, for example, Bitcoin (BTC).
    // Perhaps other types of cryptocurrency - see the original terms in the white paper and on the TokenSale website.

    // We release tokens on Ethereum. During the Round1 and Round2 with a smart contract, you directly transfer
    // the tokens there and immediately, with the same transaction, receive tokens in your wallet.

    // When paying in any other currency, for example in BTC, we accept your money via one common wallet.
    // Our manager fixes the amount received for the bitcoin wallet and calls the method of the smart
    // contract paymentsInOtherCurrency to inform him how much foreign currency has been received - on a daily basis.
    // The smart contract pins the number of accepted ETH directly and the number of BTC. Smart contract
    // monitors softcap and hardcap, so as not to go beyond this framework.

    // In theory, it is possible that when approaching hardcap, we will receive a transfer (one or several
    // transfers) to the wallet of BTC, that together with previously received money will exceed the hardcap in total.
    // In this case, we will refund all the amounts above, in order not to exceed the hardcap.

    // Collection of money in BTC will be carried out via one common wallet. The wallet's address will be published
    // everywhere (in a white paper, on the TokenSale website, on Telegram, on Bitcointalk, in this code, etc.)
    // Anyone interested can check that the administrator of the smart contract writes down exactly the amount
    // in ETH (in equivalent for BTC) there. In theory, the ability to bypass a smart contract to accept money in
    // BTC and not register them in ETH creates a possibility for manipulation by the company. Thanks to
    // paymentsInOtherCurrency however, this threat is leveled.

    // Any user can check the amounts in BTC and the variable of the smart contract that accounts for this
    // (paymentsInOtherCurrency method). Any user can easily check the incoming transactions in a smart contract
    // on a daily basis. Any hypothetical tricks on the part of the company can be exposed and panic during the TokenSale,
    // simply pointing out the incompatibility of paymentsInOtherCurrency (ie, the amount of ETH + BTC collection)
    // and the actual transactions in BTC. The company strictly adheres to the described principles of openness.

    // The company administrator is required to synchronize paymentsInOtherCurrency every working day (but you
    // cannot synchronize if there are no new BTC payments). In the case of unforeseen problems, such as
    // brakes on the Ethereum network, this operation may be difficult. You should only worry if the
    // administrator does not synchronize the amount for more than 96 hours in a row, and the BTC wallet
    // receives significant amounts.

    // This scenario ensures that for the sum of all fees in all currencies this value does not exceed hardcap.

    // Addresses for other currencies:
    // BTC Address: 3NKfzN4kShB7zpWTe2vzFDY4NuYa1SqdEV

    // ** QUINTILLIONS ** 10^18 / 1**18 / 1e18

    // @ Do I have to use the function      no
    // @ When it is possible to call        during active rounds
    // @ When it is launched automatically  every day from cryptob2b token software
    // @ Who can call the function          admins + observer
    function paymentsInOtherCurrency(uint256 _token, uint256 _value) public {
        //require(wallets[uint8(Roles.observer)] == msg.sender || wallets[uint8(Roles.manager)] == msg.sender);
        onlyAdmin(true);
        bool withinPeriod = (now >= startTime && stopTime == 0);

        bool withinCap = _value.add(ethWeiRaised) <= hardCap.add(overLimit);
        require(withinPeriod && withinCap && isInitialized);

        nonEthWeiRaised = _value;
        tokenReserved = _token;

    }

    function queueMint(address _beneficiary, uint256 _value, uint256 _freezeTime) internal {
        token.mint(address(allocationQueue), _value);
        allocationQueue.addShare(_beneficiary, _value, _freezeTime);
    }

    function systemWalletsMint(uint256 tokens) internal {
        // 4% – tokens for Airdrop, freeze 2 month
        queueMint(wallets[uint8(Roles.airdrop)], tokens.mul(4).div(50), 60 days);

        // 7% - tokens for Players and Investors
        token.mint(address(allocation), tokens.mul(7).div(50));

        // 4% - tokens to Advisers wallet, freeze 1 month
        queueMint(wallets[uint8(Roles.advisers)], tokens.mul(4).div(50), 30 days);

        // 7% - tokens to Team wallet, freeze 50% 6 month, 50% 12 month
        queueMint(wallets[uint8(Roles.team)], tokens.mul(7).div(2).div(50), 6 * 30 days);
        queueMint(wallets[uint8(Roles.team)], tokens.mul(7).div(2).div(50), 365 days);

        // 1% - tokens to Bounty wallet, freeze 2 month
        queueMint(wallets[uint8(Roles.bounty)], tokens.mul(1).div(50), 60 days);

        // 11% - tokens to Founders wallet, freeze 50% 6 month, 50% 12 month
        queueMint(wallets[uint8(Roles.founders)], tokens.mul(11).div(2).div(50), 6 * 30 days);
        queueMint(wallets[uint8(Roles.founders)], tokens.mul(11).div(2).div(50), 365 days);

        // 12% - tokens to Fund wallet, freeze 50% 2 month, 50% 12 month
        queueMint(wallets[uint8(Roles.fund)], tokens.mul(12).div(2).div(50), 2 * 30 days);
        queueMint(wallets[uint8(Roles.fund)], tokens.mul(12).div(2).div(50), 365 days);

        // 4% - tokens for Referrals
        token.mint(wallets[uint8(Roles.referrals)], tokens.mul(4).div(50));
    }

    // The function for obtaining smart contract funds in ETH. If all the checks are true, the token is
    // transferred to the buyer, taking into account the current bonus.
    function buyTokens(address beneficiary) public payable {
        require(beneficiary != 0x0);
        require(validPurchase());

        uint256 weiAmount = msg.value;

        uint256 ProfitProcent = getProfitPercent();

        uint256 value;
        uint256 percent;

        (value, percent) = getBonuses(weiAmount);

        Bonus memory curBonus = Bonus(value, percent);

        uint256 bonus = curBonus.procent;

        // --------------------------------------------------------------------------------------------
        // *** Scenario 1 - select max from all bonuses + check maxAllProfit
        uint256 totalProfit = (ProfitProcent < bonus) ? bonus : ProfitProcent;

        // --------------------------------------------------------------------------------------------
        totalProfit = (totalProfit > maxAllProfit) ? maxAllProfit : totalProfit;

        // calculate token amount to be created
        uint256 tokens = weiAmount.mul(rate).mul(totalProfit.add(100)).div(100 ether);

        // update state
        ethWeiRaised = ethWeiRaised.add(weiAmount);

        token.mint(beneficiary, tokens);

        systemWalletsMint(tokens);

        emit TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);

        forwardFunds();
    }

    // buyTokens alias
    function () public payable {
        buyTokens(msg.sender);
    }



}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[],"name":"finalize2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"creator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stopTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address[]"},{"name":"_value","type":"uint256[]"}],"name":"massBurnTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"tokenPause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"weiRound1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"tokenUnpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiTotalRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"profits","outputs":[{"name":"percent","type":"uint256"},{"name":"duration","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TokenSale","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"uint256"},{"name":"_value","type":"uint256"}],"name":"paymentsInOtherCurrency","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxAllProfit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethWeiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"resetAllWallets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getProfitPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSaledToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_migrationAgent","type":"address"}],"name":"moveTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_holders","type":"address[]"}],"name":"migrateAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"wallets","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goalReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minPay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allocation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_role","type":"uint8"},{"name":"_wallet","type":"address"}],"name":"changeWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"softCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_timeNow","type":"uint256"}],"name":"getProfitPercentForData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"distructVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_softCap","type":"uint256"},{"name":"_hardCap","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_exchange","type":"uint256"},{"name":"_maxAllProfit","type":"uint256"},{"name":"_overLimit","type":"uint256"},{"name":"_minPay","type":"uint256"},{"name":"_durationTB","type":"uint256[]"},{"name":"_percentTB","type":"uint256[]"},{"name":"_valueVB","type":"uint256[]"},{"name":"_percentVB","type":"uint256[]"}],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"bonuses","outputs":[{"name":"value","type":"uint256"},{"name":"procent","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"privateMint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nonEthWeiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"chargeBonuses","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPausedCrowdsale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allocationQueue","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokenSaleType","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exchange","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"overLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenReserved","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_value","type":"uint256"}],"name":"getBonuses","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"mode","type":"bool"}],"name":"setCrowdsalePause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_creator","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"}]

606060409081526000805460b060020a60ff021960ff199091166001171690556101a090519081016040908152734e82764a0be4e0859e87cd47ef348e8d892c2567825273d29f0ae1621f4be48c4df438038e38af546da498602083015233600160a060020a0316908201527327609c2e3d9810fdfce157f2c1d87b717d0b0c10606082015273d7ac0393e2b29d8ac6221cf69c27171aba6278c4608082015273765f60e314766bc25eb2a9f66991fe867d42a44960a082015273f9f0c53c07803a2670a354f3de88482393abdbac60c0820152734816b3ba11477e42a81fffa8a4e376e4d1a7f00760e082015273e3c02072f8145dabcd7e7fe769ba1e3e73688ecc61010082015273eb29e654aff7658394c9d413ddc66711add44f59610120820152736faec0c1ff412fd041ab30081cae677b362bd3c1610140820152737aa186f397db8ae1fb80897e4669c1ea126ba78861016082015273ac26988d1573fc6626069578e6a5a4264f76f0c56101808201526200018490600590600d6200025a565b50635c385b10601455600060155569054b40b1f852bda00000601655680821ab0d441498000060175569036a9259c7b3e0f40000601855690d6949ef6b62867400006019556801158e460913d00000601a5566fc3e1fb30d8000601b55601e601c553415620001f257600080fd5b604051602080620032fb8339810160405280805160008054600160a060020a039092166101000261010060a860020a031960a860020a60ff02199093167501000000000000000000000000000000000000000000179290921691909117905550620002e39050565b82600d8101928215620002a7579160200282015b82811115620002a75782518254600160a060020a031916600160a060020a0391909116178255602092909201916001909101906200026e565b50620002b5929150620002b9565b5090565b620002e091905b80821115620002b5578054600160a060020a0319168155600101620002c0565b90565b61300880620002f36000396000f30060606040526004361061026e5763ffffffff60e060020a60003504166302093ee2811461027957806302d05d3f1461028c57806303ff5e73146102bb5780630580d5c7146102e057806307da68f51461030a5780630abd2ba81461031d5780631391697d1461033057806318160ddd146103435780631b302a16146103565780632c4e722e146103695780632cde15d11461037c5780632e5f6d4c1461038f57806331380c89146103bd578063333dbda8146103f4578063392e53cd1461040d5780634042b66f14610434578063426f5531146104475780634bb278f31461045a5780634bca46261461046d578063549df19f14610480578063566fc6de1461049357806360a22932146104a657806363689b4a146104b9578063680b3bdf146104d857806378e97925146105275780637ad71f721461053a5780637d3d6522146105505780638129fc1c1461056357806382d186501461057657806388a17bde146105895780638a0c47cd1461059c5780638d4e4083146105c1578063906a26e0146105d457806391816981146105e757806399554fb7146105fd578063a1d7d1dd14610610578063ab37564114610744578063abfe40a81461075a578063b16d153814610770578063b5545a3c14610783578063bc7411b214610796578063c8b43c10146107a9578063c9e57259146107bc578063caa035d6146107cf578063d2f7265a14610859578063e06e0e431461086c578063e195d0961461087f578063e59c9ada14610892578063e9bec833146108a8578063ec8ac4d8146108c0578063ecb70fb7146108d4578063fb86a404146108e7578063fbfa77cf146108fa578063fc0c546a1461090d575b61027733610920565b005b341561028457600080fd5b610277610af3565b341561029757600080fd5b61029f610c2c565b604051600160a060020a03909116815260200160405180910390f35b34156102c657600080fd5b6102ce610c40565b60405190815260200160405180910390f35b34156102eb57600080fd5b6102776024600480358281019290820135918135918201910135610c46565b341561031557600080fd5b610277610d46565b341561032857600080fd5b610277610d72565b341561033b57600080fd5b6102ce610ddd565b341561034e57600080fd5b6102ce610de3565b341561036157600080fd5b610277610e41565b341561037457600080fd5b6102ce610f1a565b341561038757600080fd5b6102ce610f20565b341561039a57600080fd5b6103a5600435610f41565b60405191825260208201526040908101905180910390f35b34156103c857600080fd5b6103d0610f6d565b604051808260018111156103e057fe5b60ff16815260200191505060405180910390f35b34156103ff57600080fd5b610277600435602435610f76565b341561041857600080fd5b610420610ffa565b604051901515815260200160405180910390f35b341561043f57600080fd5b6102ce61100a565b341561045257600080fd5b6102ce611023565b341561046557600080fd5b610277611029565b341561047857600080fd5b6102ce611153565b341561048b57600080fd5b610277611159565b341561049e57600080fd5b6102ce611255565b34156104b157600080fd5b6102ce611260565b34156104c457600080fd5b610277600160a060020a0360043516611266565b34156104e357600080fd5b61027760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506112d395505050505050565b341561053257600080fd5b6102ce611365565b341561054557600080fd5b61029f60043561136b565b341561055b57600080fd5b610420611388565b341561056e57600080fd5b61027761139c565b341561058157600080fd5b6102ce61142f565b341561059457600080fd5b61029f611435565b34156105a757600080fd5b61027760ff60043516600160a060020a0360243516611444565b34156105cc57600080fd5b61042061153d565b34156105df57600080fd5b6102ce61154d565b34156105f257600080fd5b6102ce600435611553565b341561060857600080fd5b6102776115f6565b341561061b57600080fd5b6102776004803590602480359160443591606435916084359160a4359160c4359160e43591906101249061010435908101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061177695505050505050565b341561074f57600080fd5b6103a5600435611942565b341561076557600080fd5b610277600435611950565b341561077b57600080fd5b6102ce611a62565b341561078e57600080fd5b610277611a68565b34156107a157600080fd5b610420611acf565b34156107b457600080fd5b610420611af3565b34156107c757600080fd5b61029f611b03565b34156107da57600080fd5b6107e2611b12565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561081e578082015183820152602001610806565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561086457600080fd5b6102ce611ba3565b341561087757600080fd5b6102ce611ba9565b341561088a57600080fd5b6102ce611baf565b341561089d57600080fd5b6103a5600435611bb5565b34156108b357600080fd5b6102776004351515611ca2565b610277600160a060020a0360043516610920565b34156108df57600080fd5b610420611cdd565b34156108f257600080fd5b6102ce611d19565b341561090557600080fd5b61029f611d1f565b341561091857600080fd5b61029f611d2e565b60008060008061092e612f67565b60008080600160a060020a038916151561094757600080fd5b61094f611d3d565b151561095a57600080fd5b349750610965611255565b965061097088611bb5565b9096509450604080519081016040528681526020810186815290945051925082871061099c578661099e565b825b9150601c5482116109af57816109b3565b601c545b9150610a0268056bc75e2d631000006109f66109d685606463ffffffff611dba16565b6016546109ea908d9063ffffffff611dd416565b9063ffffffff611dd416565b9063ffffffff611dff16565b601d54909150610a18908963ffffffff611dba16565b601d55600154600160a060020a03166340c10f198a8360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a7157600080fd5b5af11515610a7e57600080fd5b5050506040518051905050610a9281611e16565b88600160a060020a031633600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188a8460405191825260208201526040908101905180910390a3610ae8612089565b505050505050505050565b610afd600061214f565b60045477010000000000000000000000000000000000000000000000900460ff161515610b2957600080fd5b6004805477ff000000000000000000000000000000000000000000000019169055600354600160a060020a031663f331de4c6005600a0154600160a060020a031660078062278d0060405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515610bc157600080fd5b5af11515610bce57600080fd5b5050600354600160a060020a03169050633ce1314f4260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610c1a57600080fd5b5af11515610c2757600080fd5b505050565b6000546101009004600160a060020a031681565b60155481565b6000610c52600061214f565b6015541580610c7657506015544290610c74906276a70063ffffffff611dba16565b115b1515610c8157600080fd5b838214610c8d57600080fd5b61ffff811684901015610d3f57600154600160a060020a0316639dc29fac868661ffff8516818110610cbb57fe5b90506020020135600160a060020a031685858561ffff168181101515610cdd57fe5b9050602002013560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610d2757600080fd5b5af11515610d3457600080fd5b505050600101610c8d565b5050505050565b610d50600061214f565b601554158015610d61575060145442115b1515610d6c57600080fd5b42601555565b610d7c600061214f565b60045460a060020a900460ff1615610d9357600080fd5b60018054600160a060020a03169063bedb86fb9060405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b1515610c1a57600080fd5b601f5481565b600154600090600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610e2557600080fd5b5af11515610e3257600080fd5b50505060405180519150505b90565b33600160a060020a0316600560020154600160a060020a03161480610ec6575060155415801590610e865750601554610e8390624f1a0063ffffffff611dba16565b42115b8015610ea25750600160005460ff166001811115610ea057fe5b145b8015610eb7575060045460a060020a900460ff165b8015610ec65750610ec6611388565b1515610ed157600080fd5b600154600160a060020a031663bedb86fb600060405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b1515610c1a57600080fd5b60165481565b6000610f3c610f2d61100a565b601f549063ffffffff611dba16565b905090565b6013805482908110610f4f57fe5b60009182526020909120600290910201805460019091015490915082565b60005460ff1681565b600080610f83600161214f565b6014544210158015610f955750601554155b9150610fae601a54601954611dba90919063ffffffff16565b601d54610fc290859063ffffffff611dba16565b11159050818015610fd05750805b8015610fe5575060045460a860020a900460ff165b1515610ff057600080fd5b5050601e55602055565b60045460a860020a900460ff1681565b6000610f3c601e54601d54611dba90919063ffffffff16565b601c5481565b33600160a060020a0316600560020154600160a060020a03161480611064575033600160a060020a0316600560000154600160a060020a0316145b806110745750611072611388565b155b151561107f57600080fd5b60045460a060020a900460ff161561109657600080fd5b61109e611cdd565b806110ee575033600160a060020a0316600560020154600160a060020a031614806110df575033600160a060020a0316600560000154600160a060020a0316145b80156110ee57506110ee611388565b15156110f957600080fd5b6004805474ff0000000000000000000000000000000000000000191660a060020a1790556111256121c6565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a1565b601d5481565b600554600160a060020a03908116906000903316821461117857600080fd5b5060005b600d8160ff1610156111ed57600960ff8216148061119d5750600660ff8216145b156111a7576111e5565b81600560ff8316600d81106111b857fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b60010161117c565b60018054600160a060020a03169063b3e1f52390849060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561124857600080fd5b5af11515610d3f57600080fd5b6000610f3c42611553565b60215481565b611270600061214f565b600154600160a060020a03166375e2ff658260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156112c057600080fd5b5af115156112cd57600080fd5b50505050565b6112dd600061214f565b600154600160a060020a031663680b3bdf826040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611341578082015183820152602001611329565b5050505090500192505050600060405180830381600087803b15156112c057600080fd5b60145481565b600581600d811061137857fe5b0154600160a060020a0316905081565b600060185461139561100a565b1015905090565b6113a6600061214f565b60045460a860020a900460ff16156113bd57600080fd5b6113c5612456565b6014544211156113d457600080fd5b6113dc612dae565b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a16004805475ff000000000000000000000000000000000000000000191660a860020a179055565b601b5481565b600354600160a060020a031681565b600582600c81111561145257fe5b60ff16600d811061145f57fe5b015433600160a060020a0390811691161480156114885750600382600c81111561148557fe5b14155b806114e6575060056002015433600160a060020a0390811691161480156114ce575060045460a860020a900460ff1615806114ce5750600382600c8111156114cc57fe5b145b80156114e65750600982600c8111156114e357fe5b14155b15156114f157600080fd5b80600583600c81111561150057fe5b60ff16600d811061150d57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b60045460a060020a900460ff1681565b60185481565b600080805b60135460ff821610156115ea5761159b60138260ff1681548110151561157a57fe5b90600052602060002090600202016001015483611dba90919063ffffffff16565b6014549092506115b1908363ffffffff611dba16565b8410156115e2576013805460ff83169081106115c957fe5b90600052602060002090600202016000015492506115ef565b600101611558565b600092505b5050919050565b600254600160a060020a0316151561160d57600080fd5b601554158015906116235750611621611388565b155b151561162e57600080fd5b33600160a060020a0316600560000154600160a060020a031614801561166957506014546116669063020f580063ffffffff611dba16565b42115b156116dd57600254600160a060020a031663b9caebf4600560000154600160a060020a031660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156116cc57600080fd5b5af115156116d957600080fd5b5050505b33600160a060020a0316600560020154600160a060020a0316148015611718575060145461171590630317040063ffffffff611dba16565b42115b1561177457600254600754600160a060020a039182169163b9caebf4911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c1a57600080fd5b565b6000611782600061214f565b60045460a860020a900460ff161561179957600080fd5b6117a1612456565b428d9011156117af57600080fd5b60148d90558a8c11156117c157600080fd5b60188c905560198b905560008a116117d857600080fd5b60168a9055601a879055601b8690556017899055601c88905581518351146117ff57600080fd5b825161180c601282612f7e565b50600090505b825181101561189257604080519081016040528084838151811061183257fe5b90602001906020020151815260200183838151811061184d57fe5b906020019060200201519052601280548390811061186757fe5b9060005260206000209060020201600082015181556020820151600191820155919091019050611812565b84518451146118a057600080fd5b83516118ad601382612f7e565b50600090505b83518110156119335760408051908101604052808583815181106118d357fe5b9060200190602002015181526020018683815181106118ee57fe5b906020019060200201519052601380548390811061190857fe5b90600052602060002090600202016000820151815560208201516001918201559190910190506118b3565b50505050505050505050505050565b6012805482908110610f4f57fe5b60008061195d600061214f565b6015541561196a57600080fd5b601654611989906109f685670de0b6b3a764000063ffffffff611dd416565b91506119b7601a546119ab61199c61100a565b6019549063ffffffff612e6d16565b9063ffffffff611dba16565b8211159050806119c657600080fd5b6119ce612456565b601d546119e1908363ffffffff611dba16565b601d55600154600654600160a060020a03918216916340c10f1991168560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611a4157600080fd5b5af11515611a4e57600080fd5b5050506040518051905050610c2783611e16565b601e5481565b600254600160a060020a03161515611a7f57600080fd5b600254600160a060020a031663fa89401a3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c1a57600080fd5b60045477010000000000000000000000000000000000000000000000900460ff1681565b60045460b060020a900460ff1681565b600454600160a060020a031681565b611b1a612faa565b6000805460ff166001811115611b2c57fe5b14611b6a5760408051908101604052600681527f726f756e643200000000000000000000000000000000000000000000000000006020820152610f3c565b60408051908101604052600681527f726f756e643100000000000000000000000000000000000000000000000000006020820152905090565b60175481565b601a5481565b60205481565b601254600090819081901580611beb57508360126000815481101515611bd757fe5b906000526020600020906002020160000154115b15611bfc5760009250829150611c9c565b5060015b60125461ffff82161015611c47578360128261ffff16815481101515611c2257fe5b9060005260206000209060020201600001541115611c3f57611c47565b600101611c00565b6012805461ffff600019840116908110611c5d57fe5b90600052602060002090600202016000015460126001830361ffff16815481101515611c8557fe5b906000526020600020906002020160010154925092505b50915091565b611cac600061214f565b6004805491151560b060020a0276ff0000000000000000000000000000000000000000000019909216919091179055565b600080601954611ceb61100a565b1015905060006015541180611cfd5750805b8015611d12575060045460a860020a900460ff165b91505b5090565b60195481565b600254600160a060020a031681565b600154600160a060020a031681565b60008060008060145442118015611d545750601554155b9250601b543410159150611d6f601a546119ab61199c61100a565b3411159050828015611d7e5750815b8015611d875750805b8015611d9c575060045460a860020a900460ff165b8015611db2575060045460b060020a900460ff16155b935050505090565b600082820183811015611dc957fe5b8091505b5092915050565b600080831515611de75760009150611dcd565b50828202828482811515611df757fe5b0414611dc957fe5b6000808284811515611e0d57fe5b04949350505050565b601054611e3f90600160a060020a0316611e3660326109f6856004611dd4565b624f1a00612e7f565b600154600354600160a060020a03918216916340c10f199116611e6e60326109f686600763ffffffff611dd416565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611eb157600080fd5b5af11515611ebe57600080fd5b50505060405180515050600a54611ef190600160a060020a0316611ee860326109f6856004611dd4565b62278d00612e7f565b600b54611f1d90600160a060020a0316611f1460326109f6600281876007611dd4565b62ed4e00612e7f565b600b54611f4a90600160a060020a0316611f4060326109f6600281876007611dd4565b6301e13380612e7f565b600954611f6a90600160a060020a0316611e3660326109f6856001611dd4565b600c54611f8d90600160a060020a0316611f1460326109f660028187600b611dd4565b600c54611fb090600160a060020a0316611f4060326109f660028187600b611dd4565b600d54611fd390600160a060020a0316611e3660326109f660028187600c611dd4565b600d54611ff690600160a060020a0316611f4060326109f660028187600c611dd4565b600154600160a060020a03166340c10f196005600c0154600160a060020a031661202c60326109f686600463ffffffff611dd416565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561206f57600080fd5b5af1151561207c57600080fd5b5050506040518051505050565b600254600160a060020a03161561210057600254600160a060020a031663f340fa01343360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b15156120ea57600080fd5b5af115156120f757600080fd5b50505050611774565b600030600160a060020a031631111561177457600560000154600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561177457600080fd5b33600160a060020a0316600560020154600160a060020a0316148061218a575033600160a060020a0316600560000154600160a060020a0316145b806121b8575060018115151480156121b8575033600160a060020a0316600560030154600160a060020a0316145b15156121c357600080fd5b50565b60155415156121d457426015555b6121dc611388565b1561240657600254600160a060020a03161561228757600254600554600e54601d54600160a060020a039384169363f5bf7413938116921690612227906064906109f6906007611dd4565b60405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561227657600080fd5b5af1151561228357600080fd5b5050505b6000602054111561230f57600154600654602054600160a060020a03928316926340c10f1992169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156122f257600080fd5b5af115156122ff57600080fd5b5050506040518051505060006020555b6000805460ff16600181111561232157fe5b141561236d576004805475ffff0000000000000000000000000000000000000000191690556000805460ff1916600117905561235b61100a565b601f556000601d819055601e55612401565b6004805477ff0000000000000000000000000000000000000000000000191677010000000000000000000000000000000000000000000000179055600154600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156123e757600080fd5b5af115156123f457600080fd5b5050506040518051602155505b611774565b600254600160a060020a03161561177457600254600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c1a57600080fd5b60005460b060020a900460ff161561246d57611774565b6000805476ff00000000000000000000000000000000000000000000191660b060020a1790819055600160a060020a0361010090910416639cbf9e366040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156124d757600080fd5b5af115156124e457600080fd5b50505060405180516001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617908190556000546101009004821692506332061829911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561256857600080fd5b5af1151561257557600080fd5b50505060405180516003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790556000546001546101009091048216925063e4eb2173911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125fb57600080fd5b5af1151561260857600080fd5b50505060405180516004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555060005460a860020a900460ff16156126d8576000546101009004600160a060020a0316633b8b4a616040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561269457600080fd5b5af115156126a157600080fd5b50505060405180516002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505b60018054600160a060020a03169063b3e1f523906005900154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561274157600080fd5b5af1151561274e57600080fd5b5050600154600160a060020a0316905063b3e1f523600560020154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156127b957600080fd5b5af115156127c657600080fd5b5050600154600160a060020a0316905063b3e1f523600560040154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561283157600080fd5b5af1151561283e57600080fd5b5050600154600160a060020a0316905063b3e1f5236005800154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156128a857600080fd5b5af115156128b557600080fd5b5050600154600160a060020a0316905063b3e1f523600560030154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561292057600080fd5b5af1151561292d57600080fd5b5050600154600160a060020a0316905063b3e1f5236005600a0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561299857600080fd5b5af115156129a557600080fd5b5050600154600160a060020a0316905063b3e1f5236005600b0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612a1057600080fd5b5af11515612a1d57600080fd5b5050600154600160a060020a0316905063b3e1f523600560080154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612a8857600080fd5b5af11515612a9557600080fd5b5050600154600160a060020a0316905063b3e1f523600560070154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612b0057600080fd5b5af11515612b0d57600080fd5b5050600154600160a060020a0316905063b3e1f5236005600c0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612b7857600080fd5b5af11515612b8557600080fd5b505060018054600354600160a060020a03918216935063b3e1f5239291169060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612be957600080fd5b5af11515612bf657600080fd5b505060018054600454600160a060020a03918216935063b3e1f5239291169060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612c5a57600080fd5b5af11515612c6757600080fd5b50505060128054806001018281612c7e9190612f7e565b91600052602060002090600202016000604080519081016040526803d952abd36cbc00008152601e6020820152919050815181556020820151816001015550505060138054806001018281612cd39190612f7e565b9160005260206000209060020201600060408051908101604052600f81526202a3006020820152919050815181556020820151816001015550505060138054806001018281612d229190612f7e565b9160005260206000209060020201600060408051908101604052600a81526202a3006020820152919050815181556020820151816001015550505060138054806001018281612d719190612f7e565b9160005260206000209060020201600060408051908101604052600581526205460060208201529190508151815560208201518160010155505050565b600254600160a060020a031615801590612e2957506000600254600160a060020a031663c19d93fb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0457600080fd5b5af11515612e1157600080fd5b505050604051805190506002811115612e2657fe5b14155b1561177457600254600160a060020a0316631ef3755d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c1a57600080fd5b600082821115612e7957fe5b50900390565b600154600454600160a060020a03918216916340c10f1991168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515612edc57600080fd5b5af11515612ee957600080fd5b50505060405180515050600454600160a060020a031663ae7d0cac84848460405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b1515612f5257600080fd5b5af11515612f5f57600080fd5b505050505050565b604080519081016040526000808252602082015290565b815481835581811511610c2757600202816002028360005260206000209182019101610c279190612fbc565b60206040519081016040526000815290565b610e3e91905b80821115611d155760008082556001820155600201612fc25600a165627a7a72305820b7c0b8f3ef8ab3354912f555345ff1da668253687667f402cf52ff980588eee300290000000000000000000000001702d78c30cd099f4573e09336dd48d804cceac7

Deployed Bytecode

0x60606040526004361061026e5763ffffffff60e060020a60003504166302093ee2811461027957806302d05d3f1461028c57806303ff5e73146102bb5780630580d5c7146102e057806307da68f51461030a5780630abd2ba81461031d5780631391697d1461033057806318160ddd146103435780631b302a16146103565780632c4e722e146103695780632cde15d11461037c5780632e5f6d4c1461038f57806331380c89146103bd578063333dbda8146103f4578063392e53cd1461040d5780634042b66f14610434578063426f5531146104475780634bb278f31461045a5780634bca46261461046d578063549df19f14610480578063566fc6de1461049357806360a22932146104a657806363689b4a146104b9578063680b3bdf146104d857806378e97925146105275780637ad71f721461053a5780637d3d6522146105505780638129fc1c1461056357806382d186501461057657806388a17bde146105895780638a0c47cd1461059c5780638d4e4083146105c1578063906a26e0146105d457806391816981146105e757806399554fb7146105fd578063a1d7d1dd14610610578063ab37564114610744578063abfe40a81461075a578063b16d153814610770578063b5545a3c14610783578063bc7411b214610796578063c8b43c10146107a9578063c9e57259146107bc578063caa035d6146107cf578063d2f7265a14610859578063e06e0e431461086c578063e195d0961461087f578063e59c9ada14610892578063e9bec833146108a8578063ec8ac4d8146108c0578063ecb70fb7146108d4578063fb86a404146108e7578063fbfa77cf146108fa578063fc0c546a1461090d575b61027733610920565b005b341561028457600080fd5b610277610af3565b341561029757600080fd5b61029f610c2c565b604051600160a060020a03909116815260200160405180910390f35b34156102c657600080fd5b6102ce610c40565b60405190815260200160405180910390f35b34156102eb57600080fd5b6102776024600480358281019290820135918135918201910135610c46565b341561031557600080fd5b610277610d46565b341561032857600080fd5b610277610d72565b341561033b57600080fd5b6102ce610ddd565b341561034e57600080fd5b6102ce610de3565b341561036157600080fd5b610277610e41565b341561037457600080fd5b6102ce610f1a565b341561038757600080fd5b6102ce610f20565b341561039a57600080fd5b6103a5600435610f41565b60405191825260208201526040908101905180910390f35b34156103c857600080fd5b6103d0610f6d565b604051808260018111156103e057fe5b60ff16815260200191505060405180910390f35b34156103ff57600080fd5b610277600435602435610f76565b341561041857600080fd5b610420610ffa565b604051901515815260200160405180910390f35b341561043f57600080fd5b6102ce61100a565b341561045257600080fd5b6102ce611023565b341561046557600080fd5b610277611029565b341561047857600080fd5b6102ce611153565b341561048b57600080fd5b610277611159565b341561049e57600080fd5b6102ce611255565b34156104b157600080fd5b6102ce611260565b34156104c457600080fd5b610277600160a060020a0360043516611266565b34156104e357600080fd5b61027760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506112d395505050505050565b341561053257600080fd5b6102ce611365565b341561054557600080fd5b61029f60043561136b565b341561055b57600080fd5b610420611388565b341561056e57600080fd5b61027761139c565b341561058157600080fd5b6102ce61142f565b341561059457600080fd5b61029f611435565b34156105a757600080fd5b61027760ff60043516600160a060020a0360243516611444565b34156105cc57600080fd5b61042061153d565b34156105df57600080fd5b6102ce61154d565b34156105f257600080fd5b6102ce600435611553565b341561060857600080fd5b6102776115f6565b341561061b57600080fd5b6102776004803590602480359160443591606435916084359160a4359160c4359160e43591906101249061010435908101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061177695505050505050565b341561074f57600080fd5b6103a5600435611942565b341561076557600080fd5b610277600435611950565b341561077b57600080fd5b6102ce611a62565b341561078e57600080fd5b610277611a68565b34156107a157600080fd5b610420611acf565b34156107b457600080fd5b610420611af3565b34156107c757600080fd5b61029f611b03565b34156107da57600080fd5b6107e2611b12565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561081e578082015183820152602001610806565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561086457600080fd5b6102ce611ba3565b341561087757600080fd5b6102ce611ba9565b341561088a57600080fd5b6102ce611baf565b341561089d57600080fd5b6103a5600435611bb5565b34156108b357600080fd5b6102776004351515611ca2565b610277600160a060020a0360043516610920565b34156108df57600080fd5b610420611cdd565b34156108f257600080fd5b6102ce611d19565b341561090557600080fd5b61029f611d1f565b341561091857600080fd5b61029f611d2e565b60008060008061092e612f67565b60008080600160a060020a038916151561094757600080fd5b61094f611d3d565b151561095a57600080fd5b349750610965611255565b965061097088611bb5565b9096509450604080519081016040528681526020810186815290945051925082871061099c578661099e565b825b9150601c5482116109af57816109b3565b601c545b9150610a0268056bc75e2d631000006109f66109d685606463ffffffff611dba16565b6016546109ea908d9063ffffffff611dd416565b9063ffffffff611dd416565b9063ffffffff611dff16565b601d54909150610a18908963ffffffff611dba16565b601d55600154600160a060020a03166340c10f198a8360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a7157600080fd5b5af11515610a7e57600080fd5b5050506040518051905050610a9281611e16565b88600160a060020a031633600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188a8460405191825260208201526040908101905180910390a3610ae8612089565b505050505050505050565b610afd600061214f565b60045477010000000000000000000000000000000000000000000000900460ff161515610b2957600080fd5b6004805477ff000000000000000000000000000000000000000000000019169055600354600160a060020a031663f331de4c6005600a0154600160a060020a031660078062278d0060405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515610bc157600080fd5b5af11515610bce57600080fd5b5050600354600160a060020a03169050633ce1314f4260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610c1a57600080fd5b5af11515610c2757600080fd5b505050565b6000546101009004600160a060020a031681565b60155481565b6000610c52600061214f565b6015541580610c7657506015544290610c74906276a70063ffffffff611dba16565b115b1515610c8157600080fd5b838214610c8d57600080fd5b61ffff811684901015610d3f57600154600160a060020a0316639dc29fac868661ffff8516818110610cbb57fe5b90506020020135600160a060020a031685858561ffff168181101515610cdd57fe5b9050602002013560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610d2757600080fd5b5af11515610d3457600080fd5b505050600101610c8d565b5050505050565b610d50600061214f565b601554158015610d61575060145442115b1515610d6c57600080fd5b42601555565b610d7c600061214f565b60045460a060020a900460ff1615610d9357600080fd5b60018054600160a060020a03169063bedb86fb9060405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b1515610c1a57600080fd5b601f5481565b600154600090600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610e2557600080fd5b5af11515610e3257600080fd5b50505060405180519150505b90565b33600160a060020a0316600560020154600160a060020a03161480610ec6575060155415801590610e865750601554610e8390624f1a0063ffffffff611dba16565b42115b8015610ea25750600160005460ff166001811115610ea057fe5b145b8015610eb7575060045460a060020a900460ff165b8015610ec65750610ec6611388565b1515610ed157600080fd5b600154600160a060020a031663bedb86fb600060405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b1515610c1a57600080fd5b60165481565b6000610f3c610f2d61100a565b601f549063ffffffff611dba16565b905090565b6013805482908110610f4f57fe5b60009182526020909120600290910201805460019091015490915082565b60005460ff1681565b600080610f83600161214f565b6014544210158015610f955750601554155b9150610fae601a54601954611dba90919063ffffffff16565b601d54610fc290859063ffffffff611dba16565b11159050818015610fd05750805b8015610fe5575060045460a860020a900460ff165b1515610ff057600080fd5b5050601e55602055565b60045460a860020a900460ff1681565b6000610f3c601e54601d54611dba90919063ffffffff16565b601c5481565b33600160a060020a0316600560020154600160a060020a03161480611064575033600160a060020a0316600560000154600160a060020a0316145b806110745750611072611388565b155b151561107f57600080fd5b60045460a060020a900460ff161561109657600080fd5b61109e611cdd565b806110ee575033600160a060020a0316600560020154600160a060020a031614806110df575033600160a060020a0316600560000154600160a060020a0316145b80156110ee57506110ee611388565b15156110f957600080fd5b6004805474ff0000000000000000000000000000000000000000191660a060020a1790556111256121c6565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a1565b601d5481565b600554600160a060020a03908116906000903316821461117857600080fd5b5060005b600d8160ff1610156111ed57600960ff8216148061119d5750600660ff8216145b156111a7576111e5565b81600560ff8316600d81106111b857fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b60010161117c565b60018054600160a060020a03169063b3e1f52390849060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561124857600080fd5b5af11515610d3f57600080fd5b6000610f3c42611553565b60215481565b611270600061214f565b600154600160a060020a03166375e2ff658260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156112c057600080fd5b5af115156112cd57600080fd5b50505050565b6112dd600061214f565b600154600160a060020a031663680b3bdf826040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611341578082015183820152602001611329565b5050505090500192505050600060405180830381600087803b15156112c057600080fd5b60145481565b600581600d811061137857fe5b0154600160a060020a0316905081565b600060185461139561100a565b1015905090565b6113a6600061214f565b60045460a860020a900460ff16156113bd57600080fd5b6113c5612456565b6014544211156113d457600080fd5b6113dc612dae565b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a16004805475ff000000000000000000000000000000000000000000191660a860020a179055565b601b5481565b600354600160a060020a031681565b600582600c81111561145257fe5b60ff16600d811061145f57fe5b015433600160a060020a0390811691161480156114885750600382600c81111561148557fe5b14155b806114e6575060056002015433600160a060020a0390811691161480156114ce575060045460a860020a900460ff1615806114ce5750600382600c8111156114cc57fe5b145b80156114e65750600982600c8111156114e357fe5b14155b15156114f157600080fd5b80600583600c81111561150057fe5b60ff16600d811061150d57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b60045460a060020a900460ff1681565b60185481565b600080805b60135460ff821610156115ea5761159b60138260ff1681548110151561157a57fe5b90600052602060002090600202016001015483611dba90919063ffffffff16565b6014549092506115b1908363ffffffff611dba16565b8410156115e2576013805460ff83169081106115c957fe5b90600052602060002090600202016000015492506115ef565b600101611558565b600092505b5050919050565b600254600160a060020a0316151561160d57600080fd5b601554158015906116235750611621611388565b155b151561162e57600080fd5b33600160a060020a0316600560000154600160a060020a031614801561166957506014546116669063020f580063ffffffff611dba16565b42115b156116dd57600254600160a060020a031663b9caebf4600560000154600160a060020a031660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156116cc57600080fd5b5af115156116d957600080fd5b5050505b33600160a060020a0316600560020154600160a060020a0316148015611718575060145461171590630317040063ffffffff611dba16565b42115b1561177457600254600754600160a060020a039182169163b9caebf4911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c1a57600080fd5b565b6000611782600061214f565b60045460a860020a900460ff161561179957600080fd5b6117a1612456565b428d9011156117af57600080fd5b60148d90558a8c11156117c157600080fd5b60188c905560198b905560008a116117d857600080fd5b60168a9055601a879055601b8690556017899055601c88905581518351146117ff57600080fd5b825161180c601282612f7e565b50600090505b825181101561189257604080519081016040528084838151811061183257fe5b90602001906020020151815260200183838151811061184d57fe5b906020019060200201519052601280548390811061186757fe5b9060005260206000209060020201600082015181556020820151600191820155919091019050611812565b84518451146118a057600080fd5b83516118ad601382612f7e565b50600090505b83518110156119335760408051908101604052808583815181106118d357fe5b9060200190602002015181526020018683815181106118ee57fe5b906020019060200201519052601380548390811061190857fe5b90600052602060002090600202016000820151815560208201516001918201559190910190506118b3565b50505050505050505050505050565b6012805482908110610f4f57fe5b60008061195d600061214f565b6015541561196a57600080fd5b601654611989906109f685670de0b6b3a764000063ffffffff611dd416565b91506119b7601a546119ab61199c61100a565b6019549063ffffffff612e6d16565b9063ffffffff611dba16565b8211159050806119c657600080fd5b6119ce612456565b601d546119e1908363ffffffff611dba16565b601d55600154600654600160a060020a03918216916340c10f1991168560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611a4157600080fd5b5af11515611a4e57600080fd5b5050506040518051905050610c2783611e16565b601e5481565b600254600160a060020a03161515611a7f57600080fd5b600254600160a060020a031663fa89401a3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c1a57600080fd5b60045477010000000000000000000000000000000000000000000000900460ff1681565b60045460b060020a900460ff1681565b600454600160a060020a031681565b611b1a612faa565b6000805460ff166001811115611b2c57fe5b14611b6a5760408051908101604052600681527f726f756e643200000000000000000000000000000000000000000000000000006020820152610f3c565b60408051908101604052600681527f726f756e643100000000000000000000000000000000000000000000000000006020820152905090565b60175481565b601a5481565b60205481565b601254600090819081901580611beb57508360126000815481101515611bd757fe5b906000526020600020906002020160000154115b15611bfc5760009250829150611c9c565b5060015b60125461ffff82161015611c47578360128261ffff16815481101515611c2257fe5b9060005260206000209060020201600001541115611c3f57611c47565b600101611c00565b6012805461ffff600019840116908110611c5d57fe5b90600052602060002090600202016000015460126001830361ffff16815481101515611c8557fe5b906000526020600020906002020160010154925092505b50915091565b611cac600061214f565b6004805491151560b060020a0276ff0000000000000000000000000000000000000000000019909216919091179055565b600080601954611ceb61100a565b1015905060006015541180611cfd5750805b8015611d12575060045460a860020a900460ff165b91505b5090565b60195481565b600254600160a060020a031681565b600154600160a060020a031681565b60008060008060145442118015611d545750601554155b9250601b543410159150611d6f601a546119ab61199c61100a565b3411159050828015611d7e5750815b8015611d875750805b8015611d9c575060045460a860020a900460ff165b8015611db2575060045460b060020a900460ff16155b935050505090565b600082820183811015611dc957fe5b8091505b5092915050565b600080831515611de75760009150611dcd565b50828202828482811515611df757fe5b0414611dc957fe5b6000808284811515611e0d57fe5b04949350505050565b601054611e3f90600160a060020a0316611e3660326109f6856004611dd4565b624f1a00612e7f565b600154600354600160a060020a03918216916340c10f199116611e6e60326109f686600763ffffffff611dd416565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611eb157600080fd5b5af11515611ebe57600080fd5b50505060405180515050600a54611ef190600160a060020a0316611ee860326109f6856004611dd4565b62278d00612e7f565b600b54611f1d90600160a060020a0316611f1460326109f6600281876007611dd4565b62ed4e00612e7f565b600b54611f4a90600160a060020a0316611f4060326109f6600281876007611dd4565b6301e13380612e7f565b600954611f6a90600160a060020a0316611e3660326109f6856001611dd4565b600c54611f8d90600160a060020a0316611f1460326109f660028187600b611dd4565b600c54611fb090600160a060020a0316611f4060326109f660028187600b611dd4565b600d54611fd390600160a060020a0316611e3660326109f660028187600c611dd4565b600d54611ff690600160a060020a0316611f4060326109f660028187600c611dd4565b600154600160a060020a03166340c10f196005600c0154600160a060020a031661202c60326109f686600463ffffffff611dd416565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561206f57600080fd5b5af1151561207c57600080fd5b5050506040518051505050565b600254600160a060020a03161561210057600254600160a060020a031663f340fa01343360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b15156120ea57600080fd5b5af115156120f757600080fd5b50505050611774565b600030600160a060020a031631111561177457600560000154600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561177457600080fd5b33600160a060020a0316600560020154600160a060020a0316148061218a575033600160a060020a0316600560000154600160a060020a0316145b806121b8575060018115151480156121b8575033600160a060020a0316600560030154600160a060020a0316145b15156121c357600080fd5b50565b60155415156121d457426015555b6121dc611388565b1561240657600254600160a060020a03161561228757600254600554600e54601d54600160a060020a039384169363f5bf7413938116921690612227906064906109f6906007611dd4565b60405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561227657600080fd5b5af1151561228357600080fd5b5050505b6000602054111561230f57600154600654602054600160a060020a03928316926340c10f1992169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156122f257600080fd5b5af115156122ff57600080fd5b5050506040518051505060006020555b6000805460ff16600181111561232157fe5b141561236d576004805475ffff0000000000000000000000000000000000000000191690556000805460ff1916600117905561235b61100a565b601f556000601d819055601e55612401565b6004805477ff0000000000000000000000000000000000000000000000191677010000000000000000000000000000000000000000000000179055600154600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156123e757600080fd5b5af115156123f457600080fd5b5050506040518051602155505b611774565b600254600160a060020a03161561177457600254600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c1a57600080fd5b60005460b060020a900460ff161561246d57611774565b6000805476ff00000000000000000000000000000000000000000000191660b060020a1790819055600160a060020a0361010090910416639cbf9e366040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156124d757600080fd5b5af115156124e457600080fd5b50505060405180516001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617908190556000546101009004821692506332061829911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561256857600080fd5b5af1151561257557600080fd5b50505060405180516003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790556000546001546101009091048216925063e4eb2173911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125fb57600080fd5b5af1151561260857600080fd5b50505060405180516004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555060005460a860020a900460ff16156126d8576000546101009004600160a060020a0316633b8b4a616040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561269457600080fd5b5af115156126a157600080fd5b50505060405180516002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505b60018054600160a060020a03169063b3e1f523906005900154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561274157600080fd5b5af1151561274e57600080fd5b5050600154600160a060020a0316905063b3e1f523600560020154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156127b957600080fd5b5af115156127c657600080fd5b5050600154600160a060020a0316905063b3e1f523600560040154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561283157600080fd5b5af1151561283e57600080fd5b5050600154600160a060020a0316905063b3e1f5236005800154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156128a857600080fd5b5af115156128b557600080fd5b5050600154600160a060020a0316905063b3e1f523600560030154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561292057600080fd5b5af1151561292d57600080fd5b5050600154600160a060020a0316905063b3e1f5236005600a0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b151561299857600080fd5b5af115156129a557600080fd5b5050600154600160a060020a0316905063b3e1f5236005600b0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612a1057600080fd5b5af11515612a1d57600080fd5b5050600154600160a060020a0316905063b3e1f523600560080154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612a8857600080fd5b5af11515612a9557600080fd5b5050600154600160a060020a0316905063b3e1f523600560070154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612b0057600080fd5b5af11515612b0d57600080fd5b5050600154600160a060020a0316905063b3e1f5236005600c0154600160a060020a0316600160405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612b7857600080fd5b5af11515612b8557600080fd5b505060018054600354600160a060020a03918216935063b3e1f5239291169060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612be957600080fd5b5af11515612bf657600080fd5b505060018054600454600160a060020a03918216935063b3e1f5239291169060405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515612c5a57600080fd5b5af11515612c6757600080fd5b50505060128054806001018281612c7e9190612f7e565b91600052602060002090600202016000604080519081016040526803d952abd36cbc00008152601e6020820152919050815181556020820151816001015550505060138054806001018281612cd39190612f7e565b9160005260206000209060020201600060408051908101604052600f81526202a3006020820152919050815181556020820151816001015550505060138054806001018281612d229190612f7e565b9160005260206000209060020201600060408051908101604052600a81526202a3006020820152919050815181556020820151816001015550505060138054806001018281612d719190612f7e565b9160005260206000209060020201600060408051908101604052600581526205460060208201529190508151815560208201518160010155505050565b600254600160a060020a031615801590612e2957506000600254600160a060020a031663c19d93fb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0457600080fd5b5af11515612e1157600080fd5b505050604051805190506002811115612e2657fe5b14155b1561177457600254600160a060020a0316631ef3755d6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c1a57600080fd5b600082821115612e7957fe5b50900390565b600154600454600160a060020a03918216916340c10f1991168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515612edc57600080fd5b5af11515612ee957600080fd5b50505060405180515050600454600160a060020a031663ae7d0cac84848460405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b1515612f5257600080fd5b5af11515612f5f57600080fd5b505050505050565b604080519081016040526000808252602082015290565b815481835581811511610c2757600202816002028360005260206000209182019101610c279190612fbc565b60206040519081016040526000815290565b610e3e91905b80821115611d155760008082556001820155600201612fc25600a165627a7a72305820b7c0b8f3ef8ab3354912f555345ff1da668253687667f402cf52ff980588eee30029

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

0000000000000000000000001702d78c30cd099f4573e09336dd48d804cceac7

-----Decoded View---------------
Arg [0] : _creator (address): 0x1702D78c30cD099f4573e09336DD48D804CcEaC7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001702d78c30cd099f4573e09336dd48d804cceac7


Swarm Source

bzzr://b7c0b8f3ef8ab3354912f555345ff1da668253687667f402cf52ff980588eee3

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.