Latest 25 transactions from a total of 3031 transactions

TxHash Age From To Value [TxFee]
0x2a61e1dfa172b6eeadca058508f6a737f009dcc09c4622b13e364a759f58d34597 days 7 hrs ago0xc2ff910737f367c6fffda7ffe92d6010e8c4a8ac  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001505602
0x20ef46e9cc3f0c73e8e415c824a1086d28c8b62bd90dfc03ade64ac1d81fb47e103 days 8 hrs ago0x5aa4b7928697ed895ebe72d82a92d400f66d5431  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000064944
0xbb17ed059d59d83a0171085ed9cccb492f70c6b59d822147c3865844ceac9a82106 days 19 hrs ago0xd08c42008def22bf2fef16ca1d28b151a3215606  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001180882
0x708f7d3954de4975a507ea63b8c5d1400dede70d866642126318719ad9f07da2106 days 19 hrs ago0xd08c42008def22bf2fef16ca1d28b151a3215606  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001505602
0xf6c01f1baf95854ec5c543bc7236fdeeee1bb31334b5f2f1a44cc469e69d7ea2109 days 2 hrs ago0x1a388e40e21c0602d8d4e304bd29201d70bba29a  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000155508
0xe7b2d29fc48145e1fb17479cdf75b11604020443e1d2379216185e08d6eb4088132 days 21 hrs ago0xdfa0539bbb26286ef34724f6cdf675ff45b41620  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001180882
0x893cf4f8cc0cdce81373580773b375f2312939915fd2c236b2fe15ceb4945e87149 days 12 hrs ago0xb5598bfa255d348031d8410459fc591aa5ae29c3  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001505602
0x5e8a610f648f1a5c58aed3e8b1ba89b83c644347f4c15e63390e6a0c95d926ed149 days 16 hrs ago0x564c311f5241cf08a1ef6fdbb8395ebbce449b78  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000914054
0x1406376e7d33990bcc39d3d58a2b23eb8070033d9c3d965d59362539c33bcff6153 days 1 hr ago0x3d88139e5c5e4b94c3f9d80f4b91acd6d5eb07f3  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.00074151
0x9cef3604ba4800de6a6ace3fcd0d24068b7062087ee32e3b65d2341cc2c96c54161 days 8 hrs ago0x197f48540296b76cabe1b7c27f35767338084e03  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000220104
0x123f8c4b95017de3a717c4877197927b4341a334a4b5cb194e4c11d76e683438162 days 20 hrs ago0x65789db126248e4a2f360c012a7824c9727e9b98  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000914054
0x172ed631d0b3b1ec1e22bffd102e3553530b9c4a672b7fa3ee85995ce0642dca165 days 17 hrs ago0x9f603105480f92f17de0b3f56c5e0594c58ffb2d  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000771162
0xc87348197db680458d3cd76cfe8cadadfe3f2765201efa11d8d02c3b71404490177 days 6 hrs ago0x7f622bcea22eaa626ae2bd8ff2346991cbbe05a5  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000206888
0xe2b79a4a9d17ca529b37fd5f59d272c64d379f7dfecb542ebcd6956b5134f900186 days 18 hrs ago0xa659f1e4baaafd27214ad8022c520dc74a932301  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.00110166
0x33e4d26597861d9110c198a5503d85f30ed3105d535701d1723d7a3f7d66d0bd188 days 3 hrs ago0x7f267a749d36d99c7e1b7100cb1f6893ffb9b209  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000064944
0xb1fa588b3d285f96c6bc3bd769397ebe9add1e8225dce1b60360725187140a0e195 days 2 hrs ago0xe121cb63c3f6e80eb2600532d43ebbad54ddb61a  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000914054
0x81dd6bc97434681a88b4e62a27d4b85ab2965100139055112b9b2d67d66f8095199 days 17 hrs ago0xdfa0539bbb26286ef34724f6cdf675ff45b41620  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001505602
0x04b605fab3800ae1f379c12a0a56e25b6190ea3e7a7f252ab185c3c6b345a913207 days 18 hrs ago0x3d88139e5c5e4b94c3f9d80f4b91acd6d5eb07f3  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.00144771
0xf94343dd053ec6eb486c433d75515481495928e4b9d6ec89dd41d00741c3bc05211 days 7 hrs ago0x9f00da1dfa5d8e2efa0ff24aca731ba2293d842a  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.00146888
0xb67043c5528caaa047d98adf4e2e98b8b1c4e82fd3d7315afec83cb53b85efeb213 days 24 mins ago0xdec64e7fb8ac5455a12de264dffc4eeabade2c8c  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.001505602
0xc392f02d011cf70a0cb46b73594e362c71b5fe5ed8b0cf42e950674dcdfbc30d216 days 15 hrs ago0xb629ae9663ca3684c2689e9222e8dc82032ddbd7  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000083636
0x0feb49645d71355a32c19d8b6e17fbeebbcc0136c99a5557fbeb46c38568ccc2216 days 15 hrs ago0x879778da8c941f8b0d2ee4fb4a3dc2ae4c2b53bc  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000044588
0xff1c09427dcefedde0e0323a517975d199089efef190aee1fc2598a717f18714216 days 15 hrs ago0xa4bacdd1199c641d25d02004edb6f64d9fa641f2  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000044588
0xa569bfaf738ffa4cd8419e1690c9434ded5eedfaab428eb5a955fb121ebcb125216 days 15 hrs ago0xa88b950589ac78ec10edefb0b40563400f3af13e  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.000090002
0xea154d69c31f793c398630c628487c970b78495b491c5a3469c1f7c60f1d7f42216 days 15 hrs ago0xc19fd2748a4d5d7906a3fb731ff6186fe526cc28  IN   0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0 Ether0.00011179
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 15 Internal Transactions

ParentTxHash Block Age From To Value
0x86915cc2249822db7f2b2593b881614fd5e0807fb002072a5671affe82cf6ac94989966360 days 14 hrs ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x38fe864dcb9cb039c7f3d0adc0a7efeb9c864cd94,000 Ether
0xfe6d96e7df124ac40cb9178df06a3bfa10c8df6aef6f57fa8ff8c72c31c32a694967289364 days 9 hrs ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x201f2129bf943ff4b0042ec05f123f6c8c52637c500 Ether
0xe84acf8a143c3fe83e9820b96974865343440d956fa5f467f0d3a854a82a23354884695379 days 58 mins ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x197f48540296b76cabe1b7c27f35767338084e03500 Ether
0x02480c4339d7a759a583f3db186d08726750a706cd3b206a1a7397685896d2104842412386 days 19 hrs ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x201f2129bf943ff4b0042ec05f123f6c8c52637c1,523.797438675092174193 Ether
0xb0f0517391210f0d151c8b8eb3b984545d9bee62fff35ec53792f650e717286a4842360386 days 19 hrs ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x38fe864dcb9cb039c7f3d0adc0a7efeb9c864cd912,190.379509400737393566 Ether
0x85d8cb224fbda975fbc5fc49eb1730a905b051f89c32e835c1e2476aab2d27444842299386 days 19 hrs ago0xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e0x197f48540296b76cabe1b7c27f35767338084e031,523.797438675092174193 Ether
0xf922ab43fc1a35a954233bbb4bb5954f480d94b3ad8766c76d8c5ffe07e4db044730941405 days 23 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x51eec1a96d80f30bf95666f01463d585f9e5475fc5540ef23840b6aea9fc712f4728379406 days 10 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x8fab9b83a2f427c62c4d55bd295e97d6b5b386ea04f2065a704b25b345abd0624728166406 days 11 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x6820254856cf1bb82fe7e1f48c6bf224b24248911425a1a3826d143537d96a854727872406 days 12 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x627ade7b68ebb29013a3589f8d17f078545b2d7c4b5ce8cdf37a084f31c0f7034727821406 days 12 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0xfe982a9ceca33df0c17b73a42178846cd8a8e1f5ba2fe37952f0b661a664f5c64727766406 days 12 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x48c0dd0bcbcd70f2a5403c4b6571689822f4a4b558f0446eb26faa00b021792f4727755406 days 13 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x2158732b7e32408c7b13a5f2f0bdebc1994ce0a1d7024794bfd4728a17ca05bc4727291406 days 14 hrs ago0x8f4a5e22bfd26e32b371f65bad8440ee1436e9090xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e60 Ether
0x9352de1130d6b9c0f241864cd623a2351be9c6be98d5dafb8d19f11fdd1391e14508843442 days 17 hrs ago0x38fe864dcb9cb039c7f3d0adc0a7efeb9c864cd90xaaf4281fd8142dc3263b3303b0a6f62d00b2d07e1 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: GLACrowdsale
Compiler Text: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.15;

/**
 * @title IWingsAdapter
 * 
 * WINGS DAO Price Discovery & Promotion Pre-Beta https://www.wings.ai
 *
 * #created 04/10/2017
 * #author Frank Bonnet
 */
contract IWingsAdapter {


    /**
     * Get the total raised amount of Ether
     *
     * Can only increase, meaning if you withdraw ETH from the wallet, it should be not modified (you can use two fields 
     * to keep one with a total accumulated amount) amount of ETH in contract and totalCollected for total amount of ETH collected
     *
     * @return Total raised Ether amount
     */
    function totalCollected() constant returns (uint);
}


/**
 * @title IWhitelist 
 *
 * Whitelist authentication interface
 *
 * #created 04/10/2017
 * #author Frank Bonnet
 */
contract IWhitelist {
    

    /**
     * Authenticate 
     *
     * Returns whether `_account` is on the whitelist
     *
     * @param _account The account to authenticate
     * @return whether `_account` is successfully authenticated
     */
    function authenticate(address _account) constant returns (bool);
}


/**
 * @title Token retrieve interface
 *
 * Allows tokens to be retrieved from a contract
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract ITokenRetreiver {

    /**
     * Extracts tokens from the contract
     *
     * @param _tokenContract The address of ERC20 compatible token
     */
    function retreiveTokens(address _tokenContract);
}


contract Owned {

    // The address of the account that is the current owner 
    address internal owner;


    /**
     * The publisher is the inital owner
     */
    function Owned() {
        owner = msg.sender;
    }


    /**
     * Access is restricted to the current owner
     */
    modifier only_owner() {
        require(msg.sender == owner);

        _;
    }
}


/**
 * @title ERC20 compatible token interface
 *
 * Implements ERC 20 Token standard: https://github.com/ethereum/EIPs/issues/20
 * - Short address attack fix
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract IToken { 

    /** 
     * Get the total supply of tokens
     * 
     * @return The total supply
     */
    function totalSupply() constant returns (uint);


    /** 
     * Get balance of `_owner` 
     * 
     * @param _owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address _owner) constant returns (uint);


    /** 
     * Send `_value` token to `_to` from `msg.sender`
     * 
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transfer(address _to, uint _value) returns (bool);


    /** 
     * Send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
     * 
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transferFrom(address _from, address _to, uint _value) returns (bool);


    /** 
     * `msg.sender` approves `_spender` to spend `_value` tokens
     * 
     * @param _spender The address of the account able to transfer the tokens
     * @param _value The amount of tokens to be approved for transfer
     * @return Whether the approval was successful or not
     */
    function approve(address _spender, uint _value) returns (bool);


    /** 
     * Get the amount of remaining tokens that `_spender` is allowed to spend from `_owner`
     * 
     * @param _owner The address of the account owning tokens
     * @param _spender The address of the account able to transfer the tokens
     * @return Amount of remaining tokens allowed to spent
     */
    function allowance(address _owner, address _spender) constant returns (uint);
}


/**
 * @title ManagedToken interface
 *
 * Adds the following functionallity to the basic ERC20 token
 * - Locking
 * - Issuing
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract IManagedToken is IToken { 

    /** 
     * Returns true if the token is locked
     * 
     * @return Whether the token is locked
     */
    function isLocked() constant returns (bool);


    /**
     * Unlocks the token so that the transferring of value is enabled 
     *
     * @return Whether the unlocking was successful or not
     */
    function unlock() returns (bool);


    /**
     * Issues `_value` new tokens to `_to`
     *
     * @param _to The address to which the tokens will be issued
     * @param _value The amount of new tokens to issue
     * @return Whether the tokens where sucessfully issued or not
     */
    function issue(address _to, uint _value) returns (bool);
}


/**
 * @title ICrowdsale
 *
 * Base crowdsale interface to manage the sale of 
 * an ERC20 token
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract ICrowdsale {


    /**
     * Returns true if the contract is currently in the presale phase
     *
     * @return True if in presale phase
     */
    function isInPresalePhase() constant returns (bool);


    /**
     * Returns true if `_beneficiary` has a balance allocated
     *
     * @param _beneficiary The account that the balance is allocated for
     * @param _releaseDate The date after which the balance can be withdrawn
     * @return True if there is a balance that belongs to `_beneficiary`
     */
    function hasBalance(address _beneficiary, uint _releaseDate) constant returns (bool);


    /** 
     * Get the allocated token balance of `_owner`
     * 
     * @param _owner The address from which the allocated token balance will be retrieved
     * @return The allocated token balance
     */
    function balanceOf(address _owner) constant returns (uint);


    /** 
     * Get the allocated eth balance of `_owner`
     * 
     * @param _owner The address from which the allocated eth balance will be retrieved
     * @return The allocated eth balance
     */
    function ethBalanceOf(address _owner) constant returns (uint);


    /** 
     * Get invested and refundable balance of `_owner` (only contributions during the ICO phase are registered)
     * 
     * @param _owner The address from which the refundable balance will be retrieved
     * @return The invested refundable balance
     */
    function refundableEthBalanceOf(address _owner) constant returns (uint);


    /**
     * Returns the rate and bonus release date
     *
     * @param _phase The phase to use while determining the rate
     * @param _volume The amount wei used to determine what volume multiplier to use
     * @return The rate used in `_phase` multiplied by the corresponding volume multiplier
     */
    function getRate(uint _phase, uint _volume) constant returns (uint);


    /**
     * Convert `_wei` to an amount in tokens using 
     * the `_rate`
     *
     * @param _wei amount of wei to convert
     * @param _rate rate to use for the conversion
     * @return Amount in tokens
     */
    function toTokens(uint _wei, uint _rate) constant returns (uint);


    /**
     * Withdraw allocated tokens
     */
    function withdrawTokens();


    /**
     * Withdraw allocated ether
     */
    function withdrawEther();


    /**
     * Refund in the case of an unsuccessful crowdsale. The 
     * crowdsale is considered unsuccessful if minAmount was 
     * not raised before end of the crowdsale
     */
    function refund();


    /**
     * Receive Eth and issue tokens to the sender
     */
    function () payable;
}


/**
 * @title Crowdsale
 *
 * Abstract base crowdsale contract that manages the sale of 
 * an ERC20 token
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract Crowdsale is ICrowdsale, Owned {

    enum Stages {
        Deploying,
        Deployed,
        InProgress,
        Ended
    }

    struct Balance {
        uint eth;
        uint tokens;
        uint index;
    }

    struct Percentage {
        uint eth;
        uint tokens;
        bool overwriteReleaseDate;
        uint fixedReleaseDate;
        uint index; 
    }

    struct Payout {
        uint percentage;
        uint vestingPeriod;
    }

    struct Phase {
        uint rate;
        uint end;
        uint bonusReleaseDate;
        bool useVolumeMultiplier;
    }

    struct VolumeMultiplier {
        uint rateMultiplier;
        uint bonusReleaseDateMultiplier;
    }

    // Crowdsale details
    uint public baseRate;
    uint public minAmount; 
    uint public maxAmount; 
    uint public minAcceptedAmount;
    uint public minAmountPresale; 
    uint public maxAmountPresale;
    uint public minAcceptedAmountPresale;

    // Company address
    address public beneficiary; 

    // Denominators
    uint internal percentageDenominator;
    uint internal tokenDenominator;

    // Crowdsale state
    uint public start;
    uint public presaleEnd;
    uint public crowdsaleEnd;
    uint public raised;
    uint public allocatedEth;
    uint public allocatedTokens;
    Stages public stage;

    // Token contract
    IManagedToken public token;

    // Invested balances
    mapping (address => uint) private balances;

    // Alocated balances
    mapping (address => mapping(uint => Balance)) private allocated;
    mapping(address => uint[]) private allocatedIndex;

    // Stakeholders
    mapping (address => Percentage) private stakeholderPercentages;
    address[] private stakeholderPercentagesIndex;
    Payout[] private stakeholdersPayouts;

    // Crowdsale phases
    Phase[] private phases;

    // Volume multipliers
    mapping (uint => VolumeMultiplier) private volumeMultipliers;
    uint[] private volumeMultiplierThresholds;

    
    /**
     * Throw if at stage other than current stage
     * 
     * @param _stage expected stage to test for
     */
    modifier at_stage(Stages _stage) {
        require(stage == _stage);
        _;
    }


    /**
     * Only after crowdsaleEnd plus `_time`
     * 
     * @param _time Time to pass
     */
    modifier only_after(uint _time) {
        require(now > crowdsaleEnd + _time);
        _;
    }


    /**
     * Only after crowdsale
     */
    modifier only_after_crowdsale() {
        require(now > crowdsaleEnd);
        _;
    }


    /**
     * Throw if sender is not beneficiary
     */
    modifier only_beneficiary() {
        require(beneficiary == msg.sender);
        _;
    }


    /**
     * Start in the deployed stage
     */
    function Crowdsale() {
        stage = Stages.Deploying;
    }


    /**
     * Setup the crowdsale
     *
     * @param _start The timestamp of the start date
     * @param _token The token that is sold
     * @param _tokenDenominator The token amount of decimals that the token uses
     * @param _percentageDenominator The percision of percentages
     * @param _minAmount The min cap for the ICO
     * @param _maxAmount The max cap for the ICO
     * @param _minAcceptedAmount The lowest accepted amount during the ICO phase
     * @param _minAmountPresale The min cap for the presale
     * @param _maxAmountPresale The max cap for the presale
     * @param _minAcceptedAmountPresale The lowest accepted amount during the presale phase
     */
    function setup(uint _start, address _token, uint _tokenDenominator, uint _percentageDenominator, uint _minAmount, uint _maxAmount, uint _minAcceptedAmount, uint _minAmountPresale, uint _maxAmountPresale, uint _minAcceptedAmountPresale) public only_owner at_stage(Stages.Deploying) {
        token = IManagedToken(_token);
        tokenDenominator = _tokenDenominator;
        percentageDenominator = _percentageDenominator;
        start = _start;
        minAmount = _minAmount;
        maxAmount = _maxAmount;
        minAcceptedAmount = _minAcceptedAmount;
        minAmountPresale = _minAmountPresale;
        maxAmountPresale = _maxAmountPresale;
        minAcceptedAmountPresale = _minAcceptedAmountPresale;
    }


    /**
     * Setup rates and phases
     *
     * @param _baseRate The rate without bonus
     * @param _phaseRates The rates for each phase
     * @param _phasePeriods The periods that each phase lasts (first phase is the presale phase)
     * @param _phaseBonusLockupPeriods The lockup period that each phase lasts
     * @param _phaseUsesVolumeMultiplier Wheter or not volume bonusses are used in the respective phase
     */
    function setupPhases(uint _baseRate, uint[] _phaseRates, uint[] _phasePeriods, uint[] _phaseBonusLockupPeriods, bool[] _phaseUsesVolumeMultiplier) public only_owner at_stage(Stages.Deploying) {
        baseRate = _baseRate;
        presaleEnd = start + _phasePeriods[0]; // First phase is expected to be the presale phase
        crowdsaleEnd = start; // Plus the sum of the rate phases

        for (uint i = 0; i < _phaseRates.length; i++) {
            crowdsaleEnd += _phasePeriods[i];
            phases.push(Phase(_phaseRates[i], crowdsaleEnd, 0, _phaseUsesVolumeMultiplier[i]));
        }

        for (uint ii = 0; ii < _phaseRates.length; ii++) {
            if (_phaseBonusLockupPeriods[ii] > 0) {
                phases[ii].bonusReleaseDate = crowdsaleEnd + _phaseBonusLockupPeriods[ii];
            }
        }
    }


    /**
     * Setup stakeholders
     *
     * @param _stakeholders The addresses of the stakeholders (first stakeholder is the beneficiary)
     * @param _stakeholderEthPercentages The eth percentages of the stakeholders
     * @param _stakeholderTokenPercentages The token percentages of the stakeholders
     * @param _stakeholderTokenPayoutOverwriteReleaseDates Wheter the vesting period is overwritten for the respective stakeholder
     * @param _stakeholderTokenPayoutFixedReleaseDates The vesting period after which the whole percentage of the tokens is released to the respective stakeholder
     * @param _stakeholderTokenPayoutPercentages The percentage of the tokens that is released at the respective date
     * @param _stakeholderTokenPayoutVestingPeriods The vesting period after which the respective percentage of the tokens is released
     */
    function setupStakeholders(address[] _stakeholders, uint[] _stakeholderEthPercentages, uint[] _stakeholderTokenPercentages, bool[] _stakeholderTokenPayoutOverwriteReleaseDates, uint[] _stakeholderTokenPayoutFixedReleaseDates, uint[] _stakeholderTokenPayoutPercentages, uint[] _stakeholderTokenPayoutVestingPeriods) public only_owner at_stage(Stages.Deploying) {
        beneficiary = _stakeholders[0]; // First stakeholder is expected to be the beneficiary
        for (uint i = 0; i < _stakeholders.length; i++) {
            stakeholderPercentagesIndex.push(_stakeholders[i]);
            stakeholderPercentages[_stakeholders[i]] = Percentage(
                _stakeholderEthPercentages[i], 
                _stakeholderTokenPercentages[i], 
                _stakeholderTokenPayoutOverwriteReleaseDates[i],
                _stakeholderTokenPayoutFixedReleaseDates[i], i);
        }

        // Percentages add up to 100
        for (uint ii = 0; ii < _stakeholderTokenPayoutPercentages.length; ii++) {
            stakeholdersPayouts.push(Payout(_stakeholderTokenPayoutPercentages[ii], _stakeholderTokenPayoutVestingPeriods[ii]));
        }
    }

    
    /**
     * Setup volume multipliers
     *
     * @param _volumeMultiplierRates The rates will be multiplied by this value (denominated by 4)
     * @param _volumeMultiplierLockupPeriods The lockup periods will be multiplied by this value (denominated by 4)
     * @param _volumeMultiplierThresholds The volume thresholds for each respective multiplier
     */
    function setupVolumeMultipliers(uint[] _volumeMultiplierRates, uint[] _volumeMultiplierLockupPeriods, uint[] _volumeMultiplierThresholds) public only_owner at_stage(Stages.Deploying) {
        require(phases.length > 0);
        volumeMultiplierThresholds = _volumeMultiplierThresholds;
        for (uint i = 0; i < volumeMultiplierThresholds.length; i++) {
            volumeMultipliers[volumeMultiplierThresholds[i]] = VolumeMultiplier(_volumeMultiplierRates[i], _volumeMultiplierLockupPeriods[i]);
        }
    }
    

    /**
     * After calling the deploy function the crowdsale
     * rules become immutable 
     */
    function deploy() public only_owner at_stage(Stages.Deploying) {
        require(phases.length > 0);
        require(stakeholderPercentagesIndex.length > 0);
        stage = Stages.Deployed;
    }


    /**
     * Prove that beneficiary is able to sign transactions 
     * and start the crowdsale
     */
    function confirmBeneficiary() public only_beneficiary at_stage(Stages.Deployed) {
        stage = Stages.InProgress;
    }


    /**
     * Returns true if the contract is currently in the presale phase
     *
     * @return True if in presale phase
     */
    function isInPresalePhase() public constant returns (bool) {
        return stage == Stages.InProgress && now >= start && now <= presaleEnd;
    }


    /**
     * Returns true if `_beneficiary` has a balance allocated
     *
     * @param _beneficiary The account that the balance is allocated for
     * @param _releaseDate The date after which the balance can be withdrawn
     * @return True if there is a balance that belongs to `_beneficiary`
     */
    function hasBalance(address _beneficiary, uint _releaseDate) public constant returns (bool) {
        return allocatedIndex[_beneficiary].length > 0 && _releaseDate == allocatedIndex[_beneficiary][allocated[_beneficiary][_releaseDate].index];
    }


    /** 
     * Get the allocated token balance of `_owner`
     * 
     * @param _owner The address from which the allocated token balance will be retrieved
     * @return The allocated token balance
     */
    function balanceOf(address _owner) public constant returns (uint) {
        uint sum = 0;
        for (uint i = 0; i < allocatedIndex[_owner].length; i++) {
            sum += allocated[_owner][allocatedIndex[_owner][i]].tokens;
        }

        return sum;
    }


    /** 
     * Get the allocated eth balance of `_owner`
     * 
     * @param _owner The address from which the allocated eth balance will be retrieved
     * @return The allocated eth balance
     */
    function ethBalanceOf(address _owner) public constant returns (uint) {
        uint sum = 0;
        for (uint i = 0; i < allocatedIndex[_owner].length; i++) {
            sum += allocated[_owner][allocatedIndex[_owner][i]].eth;
        }

        return sum;
    }


    /** 
     * Get invested and refundable balance of `_owner` (only contributions during the ICO phase are registered)
     * 
     * @param _owner The address from which the refundable balance will be retrieved
     * @return The invested refundable balance
     */
    function refundableEthBalanceOf(address _owner) public constant returns (uint) {
        return now > crowdsaleEnd && raised < minAmount ? balances[_owner] : 0;
    }


    /**
     * Returns the current phase based on the current time
     *
     * @return The index of the current phase
     */
    function getCurrentPhase() public constant returns (uint) {
        for (uint i = 0; i < phases.length; i++) {
            if (now <= phases[i].end) {
                return i;
                break;
            }
        }

        return phases.length; // Does not exist
    }


    /**
     * Returns the rate and bonus release date
     *
     * @param _phase The phase to use while determining the rate
     * @param _volume The amount wei used to determin what volume multiplier to use
     * @return The rate used in `_phase` multiplied by the corresponding volume multiplier
     */
    function getRate(uint _phase, uint _volume) public constant returns (uint) {
        uint rate = 0;
        if (stage == Stages.InProgress && now >= start) {
            Phase storage phase = phases[_phase];
            rate = phase.rate;

            // Find volume multiplier
            if (phase.useVolumeMultiplier && volumeMultiplierThresholds.length > 0 && _volume >= volumeMultiplierThresholds[0]) {
                for (uint i = volumeMultiplierThresholds.length; i > 0; i--) {
                    if (_volume >= volumeMultiplierThresholds[i - 1]) {
                        VolumeMultiplier storage multiplier = volumeMultipliers[volumeMultiplierThresholds[i - 1]];
                        rate += phase.rate * multiplier.rateMultiplier / percentageDenominator;
                        break;
                    }
                }
            }
        }
        
        return rate;
    }


    /**
     * Get distribution data based on the current phase and 
     * the volume in wei that is being distributed
     * 
     * @param _phase The current crowdsale phase
     * @param _volume The amount wei used to determine what volume multiplier to use
     * @return Volumes and corresponding release dates
     */
    function getDistributionData(uint _phase, uint _volume) internal constant returns (uint[], uint[]) {
        Phase storage phase = phases[_phase];
        uint remainingVolume = _volume;

        bool usingMultiplier = false;
        uint[] memory volumes = new uint[](1);
        uint[] memory releaseDates = new uint[](1);

        // Find volume multipliers
        if (phase.useVolumeMultiplier && volumeMultiplierThresholds.length > 0 && _volume >= volumeMultiplierThresholds[0]) {
            uint phaseReleasePeriod = phase.bonusReleaseDate - crowdsaleEnd;
            for (uint i = volumeMultiplierThresholds.length; i > 0; i--) {
                if (_volume >= volumeMultiplierThresholds[i - 1]) {
                    if (!usingMultiplier) {
                        volumes = new uint[](i + 1);
                        releaseDates = new uint[](i + 1);
                        usingMultiplier = true;
                    }

                    VolumeMultiplier storage multiplier = volumeMultipliers[volumeMultiplierThresholds[i - 1]];
                    uint releaseDate = phase.bonusReleaseDate + phaseReleasePeriod * multiplier.bonusReleaseDateMultiplier / percentageDenominator;
                    uint volume = remainingVolume - volumeMultiplierThresholds[i - 1];

                    // Store increment
                    volumes[i] = volume;
                    releaseDates[i] = releaseDate;

                    remainingVolume -= volume;
                }
            }
        }

        // Store increment
        volumes[0] = remainingVolume;
        releaseDates[0] = phase.bonusReleaseDate;

        return (volumes, releaseDates);
    }


    /**
     * Convert `_wei` to an amount in tokens using 
     * the `_rate`
     *
     * @param _wei amount of wei to convert
     * @param _rate rate to use for the conversion
     * @return Amount in tokens
     */
    function toTokens(uint _wei, uint _rate) public constant returns (uint) {
        return _wei * _rate * tokenDenominator / 1 ether;
    }


    /**
     * Function to end the crowdsale by setting 
     * the stage to Ended
     */
    function endCrowdsale() public at_stage(Stages.InProgress) {
        require(now > crowdsaleEnd || raised >= maxAmount);
        require(raised >= minAmount);
        stage = Stages.Ended;

        // Unlock token
        if (!token.unlock()) {
            revert();
        }

        // Allocate tokens (no allocation can be done after this period)
        uint totalTokenSupply = token.totalSupply() + allocatedTokens;
        for (uint i = 0; i < stakeholdersPayouts.length; i++) {
            Payout storage p = stakeholdersPayouts[i];
            _allocateStakeholdersTokens(totalTokenSupply * p.percentage / percentageDenominator, now + p.vestingPeriod);
        }

        // Allocate remaining ETH
        _allocateStakeholdersEth(this.balance - allocatedEth, 0);
    }


    /**
     * Withdraw allocated tokens
     */
    function withdrawTokens() public {
        uint tokensToSend = 0;
        for (uint i = 0; i < allocatedIndex[msg.sender].length; i++) {
            uint releaseDate = allocatedIndex[msg.sender][i];
            if (releaseDate <= now) {
                Balance storage b = allocated[msg.sender][releaseDate];
                tokensToSend += b.tokens;
                b.tokens = 0;
            }
        }

        if (tokensToSend > 0) {
            allocatedTokens -= tokensToSend;
            if (!token.issue(msg.sender, tokensToSend)) {
                revert();
            }
        }
    }


    /**
     * Withdraw allocated ether
     */
    function withdrawEther() public {
        uint ethToSend = 0;
        for (uint i = 0; i < allocatedIndex[msg.sender].length; i++) {
            uint releaseDate = allocatedIndex[msg.sender][i];
            if (releaseDate <= now) {
                Balance storage b = allocated[msg.sender][releaseDate];
                ethToSend += b.eth;
                b.eth = 0;
            }
        }

        if (ethToSend > 0) {
            allocatedEth -= ethToSend;
            if (!msg.sender.send(ethToSend)) {
                revert();
            }
        }
    }


    /**
     * Refund in the case of an unsuccessful crowdsale. The 
     * crowdsale is considered unsuccessful if minAmount was 
     * not raised before end of the crowdsale
     */
    function refund() public only_after_crowdsale at_stage(Stages.InProgress) {
        require(raised < minAmount);

        uint receivedAmount = balances[msg.sender];
        balances[msg.sender] = 0;

        if (receivedAmount > 0 && !msg.sender.send(receivedAmount)) {
            balances[msg.sender] = receivedAmount;
        }
    }


    /**
     * Failsafe and clean-up mechanism
     */
    function destroy() public only_beneficiary only_after(2 years) {
        selfdestruct(beneficiary);
    }


    /**
     * Receive Eth and issue tokens to the sender
     */
    function contribute() public payable {
        _handleTransaction(msg.sender, msg.value);
    }


    /**
     * Receive Eth and issue tokens to the sender
     * 
     * This function requires that msg.sender is not a contract. This is required because it's 
     * not possible for a contract to specify a gas amount when calling the (internal) send() 
     * function. Solidity imposes a maximum amount of gas (2300 gas at the time of writing)
     * 
     * Contracts can call the contribute() function instead
     */
    function () payable {
        require(msg.sender == tx.origin);
        _handleTransaction(msg.sender, msg.value);
    }


    /**
     * Handle incoming transactions
     * 
     * @param _sender Transaction sender
     * @param _received 
     */
    function _handleTransaction(address _sender, uint _received) internal at_stage(Stages.InProgress) {

        // Crowdsale is active
        require(now >= start && now <= crowdsaleEnd);

        // Whitelist check
        require(isAcceptedContributor(_sender));

        // When in presale phase
        bool presalePhase = isInPresalePhase();
        require(!presalePhase || _received >= minAcceptedAmountPresale);
        require(!presalePhase || raised < maxAmountPresale);

        // When in ico phase
        require(presalePhase || _received >= minAcceptedAmount);
        require(presalePhase || raised >= minAmountPresale);
        require(presalePhase || raised < maxAmount);

        uint acceptedAmount;
        if (presalePhase && raised + _received > maxAmountPresale) {
            acceptedAmount = maxAmountPresale - raised;
        } else if (raised + _received > maxAmount) {
            acceptedAmount = maxAmount - raised;
        } else {
            acceptedAmount = _received;
        }

        raised += acceptedAmount;
        
        if (presalePhase) {
            // During the presale phase - Non refundable
            _allocateStakeholdersEth(acceptedAmount, 0); 
        } else {
            // During the ICO phase - 100% refundable
            balances[_sender] += acceptedAmount; 
        }

        // Distribute tokens
        uint tokensToIssue = 0;
        uint phase = getCurrentPhase();
        var rate = getRate(phase, acceptedAmount);
        if (rate == 0) {
            revert(); // Paused phase
        }

        var (volumes, releaseDates) = getDistributionData(
            phase, acceptedAmount);
        
        // Allocate tokens
        for (uint i = 0; i < volumes.length; i++) {
            var tokensAtCurrentRate = toTokens(volumes[i], rate);
            if (rate > baseRate && releaseDates[i] > now) {
                uint bonusTokens = tokensAtCurrentRate * (rate - baseRate) / rate;
                _allocateTokens(_sender, bonusTokens, releaseDates[i]);

                tokensToIssue += tokensAtCurrentRate - bonusTokens;
            } else {
                tokensToIssue += tokensAtCurrentRate;
            }
        }

        // Issue tokens
        if (tokensToIssue > 0 && !token.issue(_sender, tokensToIssue)) {
            revert();
        }

        // Refund due to max cap hit
        if (_received - acceptedAmount > 0 && !_sender.send(_received - acceptedAmount)) {
            revert();
        }
    }


    /**
     * Allocate ETH
     *
     * @param _beneficiary The account to alocate the eth for
     * @param _amount The amount of ETH to allocate
     * @param _releaseDate The date after which the eth can be withdrawn
     */    
    function _allocateEth(address _beneficiary, uint _amount, uint _releaseDate) internal {
        if (hasBalance(_beneficiary, _releaseDate)) {
            allocated[_beneficiary][_releaseDate].eth += _amount;
        } else {
            allocated[_beneficiary][_releaseDate] = Balance(
                _amount, 0, allocatedIndex[_beneficiary].push(_releaseDate) - 1);
        }

        allocatedEth += _amount;
    }


    /**
     * Allocate Tokens
     *
     * @param _beneficiary The account to allocate the tokens for
     * @param _amount The amount of tokens to allocate
     * @param _releaseDate The date after which the tokens can be withdrawn
     */    
    function _allocateTokens(address _beneficiary, uint _amount, uint _releaseDate) internal {
        if (hasBalance(_beneficiary, _releaseDate)) {
            allocated[_beneficiary][_releaseDate].tokens += _amount;
        } else {
            allocated[_beneficiary][_releaseDate] = Balance(
                0, _amount, allocatedIndex[_beneficiary].push(_releaseDate) - 1);
        }

        allocatedTokens += _amount;
    }


    /**
     * Allocate ETH for stakeholders
     *
     * @param _amount The amount of ETH to allocate
     * @param _releaseDate The date after which the eth can be withdrawn
     */    
    function _allocateStakeholdersEth(uint _amount, uint _releaseDate) internal {
        for (uint i = 0; i < stakeholderPercentagesIndex.length; i++) {
            Percentage storage p = stakeholderPercentages[stakeholderPercentagesIndex[i]];
            if (p.eth > 0) {
                _allocateEth(stakeholderPercentagesIndex[i], _amount * p.eth / percentageDenominator, _releaseDate);
            }
        }
    }


    /**
     * Allocate Tokens for stakeholders
     *
     * @param _amount The amount of tokens created
     * @param _releaseDate The date after which the tokens can be withdrawn (unless overwitten)
     */    
    function _allocateStakeholdersTokens(uint _amount, uint _releaseDate) internal {
        for (uint i = 0; i < stakeholderPercentagesIndex.length; i++) {
            Percentage storage p = stakeholderPercentages[stakeholderPercentagesIndex[i]];
            if (p.tokens > 0) {
                _allocateTokens(
                    stakeholderPercentagesIndex[i], 
                    _amount * p.tokens / percentageDenominator, 
                    p.overwriteReleaseDate ? p.fixedReleaseDate : _releaseDate);
            }
        }
    }


    /**
     * Allows the implementing contract to validate a 
     * contributing account
     *
     * @param _contributor Address that is being validated
     * @return Wheter the contributor is accepted or not
     */
    function isAcceptedContributor(address _contributor) internal constant returns (bool);
}


/**
 * @title GLACrowdsale
 *
 * Gladius is the decentralized solution to protect against DDoS attacks by allowing you to connect 
 * with protection pools near you to provide better protection and accelerate your content. With an easy 
 * to use interface as well as powerful insight tools, Gladius enables anyone to protect and accelerate 
 * their website. Visit https://gladius.io/ 
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract GLACrowdsale is Crowdsale, ITokenRetreiver, IWingsAdapter {

    // Whitelist used for authentication
    IWhitelist private whitelist;

    // Presale
    bool private presaleAttached;
    IToken private presaleToken;
    ICrowdsale private presale;
    mapping(address => bool) private presaleConversions;


    /**
     * Setup the whitelist
     *
     * @param _whitelist The address of the whitelist authenticator
     */
    function setupWhitelist(address _whitelist) public only_owner at_stage(Stages.Deploying) {
        whitelist = IWhitelist(_whitelist);
    }


    /**
     * Wings integration - Get the total raised amount of Ether
     *
     * Can only increased, means if you withdraw ETH from the wallet, should be not modified (you can use two fields 
     * to keep one with a total accumulated amount) amount of ETH in contract and totalCollected for total amount of ETH collected
     *
     * @return Total raised Ether amount
     */
    function totalCollected() public constant returns (uint) {
        return raised;
    }


    /**
     * Allows the implementing contract to validate a 
     * contributing account
     *
     * @param _contributor Address that is being validated
     * @return Wheter the contributor is accepted or not
     */
    function isAcceptedContributor(address _contributor) internal constant returns (bool) {
        return whitelist.authenticate(_contributor);
    }


    /**
     * Attach the presale contracts
     *
     * @param _presale The address of the private presale contract
     * @param _presaleToken The token used in the private presale 
     */
    function attachPresale(address _presale, address _presaleToken) public only_owner at_stage(Stages.Deploying) {
        presaleToken = IToken(_presaleToken);
        presale = ICrowdsale(_presale);
        presaleAttached = true;
    }


    /**
     * Allow investors that contributed in the private presale 
     * to generate the same amount of tokens in the actual crowdsale
     *
     * @param _contributor Account that contributed in the presale
     */
    function importPresaleContribution(address _contributor) public {
        require(presaleAttached);
        require(!presaleConversions[_contributor]);
        presaleConversions[_contributor] = true;

        // Read amounts from private presale
        uint distributedPresaleTokens = presaleToken.balanceOf(_contributor);

        // If this is zero _contributor did not contribute anything
        require(distributedPresaleTokens > 0);
        
        // Allocate tokens
        uint allocatedPresaleTokens = presale.balanceOf(_contributor);
        _allocateTokens(_contributor, allocatedPresaleTokens, crowdsaleEnd + 30 days);

        // Issue tokens
        if (!token.issue(_contributor, distributedPresaleTokens)) {
            revert();
        }
    }


    /**
     * Failsafe mechanism
     * 
     * Allows beneficary to retreive tokens from the contract
     *
     * @param _tokenContract The address of ERC20 compatible token
     */
    function retreiveTokens(address _tokenContract) public only_beneficiary {
        IToken tokenInstance = IToken(_tokenContract);

        // Retreive tokens from our token contract
        ITokenRetreiver(token).retreiveTokens(_tokenContract);

        // Retreive tokens from crowdsale contract
        uint tokenBalance = tokenInstance.balanceOf(this);
        if (tokenBalance > 0) {
            tokenInstance.transfer(beneficiary, tokenBalance);
        }
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"allocatedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_phase","type":"uint256"},{"name":"_volume","type":"uint256"}],"name":"getRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"baseRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"endCrowdsale","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"presaleEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_baseRate","type":"uint256"},{"name":"_phaseRates","type":"uint256[]"},{"name":"_phasePeriods","type":"uint256[]"},{"name":"_phaseBonusLockupPeriods","type":"uint256[]"},{"name":"_phaseUsesVolumeMultiplier","type":"bool[]"}],"name":"setupPhases","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_wei","type":"uint256"},{"name":"_rate","type":"uint256"}],"name":"toTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_token","type":"address"},{"name":"_tokenDenominator","type":"uint256"},{"name":"_percentageDenominator","type":"uint256"},{"name":"_minAmount","type":"uint256"},{"name":"_maxAmount","type":"uint256"},{"name":"_minAcceptedAmount","type":"uint256"},{"name":"_minAmountPresale","type":"uint256"},{"name":"_maxAmountPresale","type":"uint256"},{"name":"_minAcceptedAmountPresale","type":"uint256"}],"name":"setup","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"ethBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawEther","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minAcceptedAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"deploy","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_stakeholders","type":"address[]"},{"name":"_stakeholderEthPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPayoutOverwriteReleaseDates","type":"bool[]"},{"name":"_stakeholderTokenPayoutFixedReleaseDates","type":"uint256[]"},{"name":"_stakeholderTokenPayoutPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPayoutVestingPeriods","type":"uint256[]"}],"name":"setupStakeholders","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"refundableEthBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"retreiveTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_volumeMultiplierRates","type":"uint256[]"},{"name":"_volumeMultiplierLockupPeriods","type":"uint256[]"},{"name":"_volumeMultiplierThresholds","type":"uint256[]"}],"name":"setupVolumeMultipliers","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"confirmBeneficiary","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPhase","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allocatedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_releaseDate","type":"uint256"}],"name":"hasBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stage","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_presale","type":"address"},{"name":"_presaleToken","type":"address"}],"name":"attachPresale","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"}],"name":"importPresaleContribution","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"contribute","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"totalCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"raised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minAcceptedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isInPresalePhase","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_whitelist","type":"address"}],"name":"setupWhitelist","outputs":[],"payable":false,"type":"function"},{"payable":true,"type":"fallback"}]

  Contract Creation Code Switch To Opcodes View
60606040525b5b60008054600160a060020a03191633600160a060020a03161790555b601180546000919060ff19166001835b02179055505b5b612b87806100486000396000f300606060405236156101dc5763ffffffff60e060020a6000350416622f9569811461020a5780630d6f849b1461022f5780630d70e7e3146102545780631f68f20a1461027f5780632095f2d4146102a4578063229f3e29146102b95780632d92b1c0146102de57806338af3eed146103f45780634942edf9146104235780634d9aa4241461044e578063582ab0b414610473578063590e1ae3146104b15780635f48f393146104c657806370a08231146104eb5780637252bbf21461051c5780637362377b1461054d57806376c82e9214610562578063775c300c1461058757806383197ef01461059c5780638d8f2adb146105b15780638ec521a8146105c657806392099fdb1461079757806396a04925146107c8578063984c14ac146107e95780639b2cb5d8146108ba5780639c5e9023146108df578063a3a40ea5146108f4578063b19a454014610919578063b946fab11461093e578063bd51d5d014610963578063be9a655514610999578063c040e6b8146109be578063cc5c4a6b146109f5578063d01ec88614610a1c578063d7bb99ba14610a3d578063e29eb83614610a47578063f0ea4bfc14610a6c578063f1d841f114610a91578063f96c166c14610ab6578063fc0c546a14610add578063fda0c61d14610b0c575b5b32600160a060020a031633600160a060020a03161415156101fd57600080fd5b6102073334610b2d565b5b005b341561021557600080fd5b61021d610e72565b60405190815260200160405180910390f35b341561023a57600080fd5b61021d610e78565b60405190815260200160405180910390f35b341561025f57600080fd5b61021d600435602435610e7e565b60405190815260200160405180910390f35b341561028a57600080fd5b61021d610fc5565b60405190815260200160405180910390f35b34156102af57600080fd5b610207610fcb565b005b34156102c457600080fd5b61021d611195565b60405190815260200160405180910390f35b34156102e957600080fd5b6102076004803590604460248035908101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061119b95505050505050565b005b34156103ff57600080fd5b610407611368565b604051600160a060020a03909116815260200160405180910390f35b341561042e57600080fd5b61021d600435602435611377565b60405190815260200160405180910390f35b341561045957600080fd5b61021d611396565b60405190815260200160405180910390f35b341561047e57600080fd5b610207600435600160a060020a036024351660443560643560843560a43560c43560e435610104356101243561139c565b005b34156104bc57600080fd5b610207611440565b005b34156104d157600080fd5b61021d6114f9565b60405190815260200160405180910390f35b34156104f657600080fd5b61021d600160a060020a03600435166114ff565b60405190815260200160405180910390f35b341561052757600080fd5b61021d600160a060020a036004351661158f565b60405190815260200160405180910390f35b341561055857600080fd5b61020761161f565b005b341561056d57600080fd5b61021d611706565b60405190815260200160405180910390f35b341561059257600080fd5b61020761170c565b005b34156105a757600080fd5b610207611780565b005b34156105bc57600080fd5b6102076117c4565b005b34156105d157600080fd5b610207600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061190895505050505050565b005b34156107a257600080fd5b61021d600160a060020a0360043516611b8a565b60405190815260200160405180910390f35b34156107d357600080fd5b610207600160a060020a0360043516611bcd565b005b34156107f457600080fd5b61020760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650611d5b95505050505050565b005b34156108c557600080fd5b61021d611e62565b60405190815260200160405180910390f35b34156108ea57600080fd5b610207611e68565b005b34156108ff57600080fd5b61021d611ec1565b60405190815260200160405180910390f35b341561092457600080fd5b61021d611f14565b60405190815260200160405180910390f35b341561094957600080fd5b61021d611f1a565b60405190815260200160405180910390f35b341561096e57600080fd5b610985600160a060020a0360043516602435611f20565b604051901515815260200160405180910390f35b34156109a457600080fd5b61021d611f98565b60405190815260200160405180910390f35b34156109c957600080fd5b6109d1611f9e565b604051808260038111156109e157fe5b60ff16815260200191505060405180910390f35b3415610a0057600080fd5b610207600160a060020a0360043581169060243516611fa7565b005b3415610a2757600080fd5b610207600160a060020a036004351661205b565b005b610207612267565b005b3415610a5257600080fd5b61021d612274565b60405190815260200160405180910390f35b3415610a7757600080fd5b61021d61227b565b60405190815260200160405180910390f35b3415610a9c57600080fd5b61021d612281565b60405190815260200160405180910390f35b3415610ac157600080fd5b610985612287565b604051901515815260200160405180910390f35b3415610ae857600080fd5b6104076122c0565b604051600160a060020a03909116815260200160405180910390f35b3415610b1757600080fd5b610207600160a060020a03600435166122d4565b005b6000806000806000610b3d6129c3565b610b456129c3565b600080806002805b60115460ff166003811115610b5e57fe5b14610b6857600080fd5b600b544210158015610b7c5750600d544211155b1515610b8757600080fd5b610b908d61233d565b1515610b9b57600080fd5b610ba3612287565b9a508a1580610bb457506007548c10155b1515610bbf57600080fd5b8a1580610bcf5750600654600e54105b1515610bda57600080fd5b8a80610be857506004548c10155b1515610bf357600080fd5b8a80610c035750600554600e5410155b1515610c0e57600080fd5b8a80610c1d5750600354600e54105b1515610c2857600080fd5b8a8015610c3a57506006548c600e5401115b15610c4d57600e54600654039950610c6d565b6003548c600e54011115610c6957600e54600354039950610c6d565b8b99505b5b600e80548b0190558a15610c8c57610c878a60006123ba565b610cab565b600160a060020a038d16600090815260126020526040902080548b0190555b60009850610cb7611ec1565b9750610cc3888b610e7e565b9650861515610cd157600080fd5b610cdb888b61248a565b95509550600093505b8551841015610d8957610d0c868581518110610cfc57fe5b9060200190602002015188611377565b925060015487118015610d33575042858581518110610d2757fe5b90602001906020020151115b15610d78578660015488038402811515610d4957fe5b049150610d6c8d83878781518110610d5d57fe5b90602001906020020151612712565b81830389019850610d7d565b978201975b5b600190930192610ce4565b600089118015610e1557506011546101009004600160a060020a031663867904b48e8b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610df857600080fd5b6102c65a03f11515610e0957600080fd5b50505060405180519050155b15610e1f57600080fd5b60008a8d03118015610e575750600160a060020a038d168a8d0380156108fc0290604051600060405180830381858888f19350505050155b15610e6157600080fd5b5b5b50505050505050505050505050565b60105481565b60055481565b60008080808060025b60115460ff166003811115610e9857fe5b148015610ea75750600b544210155b15610fb5576018805488908110610eba57fe5b906000526020600020906004020160005b508054600382015490955090935060ff168015610eeb5750601a54600090115b8015610f155750601a80546000908110610f0157fe5b906000526020600020900160005b50548610155b15610fb557601a5491505b6000821115610fb557601a80546000198401908110610f3b57fe5b906000526020600020900160005b50548610610fa85760196000601a60018503815481101515610f6757fe5b906000526020600020900160005b5054815260200190815260200160002090506009548160000154846000015402811515610f9e57fe5b0484019350610fb5565b5b60001990910190610f20565b5b5b8394505b5050505092915050565b60015481565b600080806002805b60115460ff166003811115610fe457fe5b14610fee57600080fd5b600d544211806110025750600354600e5410155b151561100d57600080fd5b600254600e54101561101e57600080fd5b601180546003919060ff19166001835b02179055506011546101009004600160a060020a031663a69df4b56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561108057600080fd5b6102c65a03f1151561109157600080fd5b5050506040518051905015156110a657600080fd5b6010546011546101009004600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110f657600080fd5b6102c65a03f1151561110757600080fd5b50505060405180519050019350600092505b60175483101561117457601780548490811061113157fe5b906000526020600020906002020160005b5091506111686009548360000154860281151561115b57fe5b04836001015442016127f7565b5b600190920191611119565b61118d600f5430600160a060020a0316310360006123ba565b5b5b50505050565b600c5481565b60008054819033600160a060020a039081169116146111b957600080fd5b6000805b60115460ff1660038111156111ce57fe5b146111d857600080fd5b6001889055856000815181106111ea57fe5b90602001906020020151600b54908101600c55600d55600092505b86518310156112e35785838151811061121a57fe5b90602001906020020151600d80549091019055601880546001810161123f83826129d5565b916000526020600020906004020160005b6080604051908101604052808b888151811061126857fe5b906020019060200201518152602001600d5481526020016000815260200188888151811061129257fe5b90602001906020020151151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600190920191611205565b600091505b865182101561135b5760008583815181106112ff57fe5b90602001906020020151111561134f5784828151811061131b57fe5b90602001906020020151600d540160188381548110151561133857fe5b906000526020600020906004020160005b50600201555b5b6001909101906112e8565b5b5b505b50505050505050565b600854600160a060020a031681565b600a54600090670de0b6b3a764000090848402025b0490505b92915050565b600d5481565b60005433600160a060020a039081169116146113b757600080fd5b6000805b60115460ff1660038111156113cc57fe5b146113d657600080fd5b6011805474ffffffffffffffffffffffffffffffffffffffff001916610100600160a060020a038d1602179055600a8990556009889055600b8b90556002879055600386905560048590556005849055600683905560078290555b5b505b50505050505050505050565b600d54600090421161145157600080fd5b6002805b60115460ff16600381111561146657fe5b1461147057600080fd5b600254600e541061148057600080fd5b600160a060020a03331660009081526012602052604081208054908290559250821180156114d15750600160a060020a03331682156108fc0283604051600060405180830381858888f19350505050155b156114f257600160a060020a03331660009081526012602052604090208290555b5b5b505b50565b60035481565b600080805b600160a060020a03841660009081526014602052604090205481101561158457600160a060020a03841660009081526013602090815260408083206014909252822080549192918490811061155557fe5b906000526020600020900160005b5054815260200190815260200160002060010154820191505b600101611504565b8192505b5050919050565b600080805b600160a060020a03841660009081526014602052604090205481101561158457600160a060020a0384166000908152601360209081526040808320601490925282208054919291849081106115e557fe5b906000526020600020900160005b5054815260200190815260200160002060000154820191505b600101611594565b8192505b5050919050565b60008080805b600160a060020a0333166000908152601460205260409020548310156116bb57600160a060020a033316600090815260146020526040902080548490811061166957fe5b906000526020600020900160005b505491504282116116af5750600160a060020a0333166000908152601360209081526040808320848452909152812080549181559301925b5b600190920191611625565b600084111561118d57600f80548590039055600160a060020a03331684156108fc0285604051600060405180830381858888f19350505050151561118d57600080fd5b5b5b50505050565b60075481565b60005433600160a060020a0390811691161461172757600080fd5b6000805b60115460ff16600381111561173c57fe5b1461174657600080fd5b6018546000901161175657600080fd5b6016546000901161176657600080fd5b601180546001919060ff191682805b02179055505b5b505b565b60085433600160a060020a0390811691161461179b57600080fd5b600d546303c2670090810142116117b157600080fd5b600854600160a060020a0316ff5b5b505b565b60008080805b600160a060020a03331660009081526014602052604090205483101561186457600160a060020a033316600090815260146020526040902080548490811061180e57fe5b906000526020600020900160005b505491504282116118585750600160a060020a033316600090815260136020908152604080832084845290915281206001810180549290559301925b5b6001909201916117ca565b600084111561118d576010805485900390556011546101009004600160a060020a031663867904b4338660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b50505060405180519050151561118d57600080fd5b5b5b50505050565b60008054819033600160a060020a0390811691161461192657600080fd5b6000805b60115460ff16600381111561193b57fe5b1461194557600080fd5b8960008151811061195257fe5b906020019060200201516008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600092505b8951831015611aec5760168054600181016119a98382612a07565b916000526020600020900160005b8c86815181106119c357fe5b90602001906020020151909190916101000a815481600160a060020a030219169083600160a060020a031602179055505060a0604051908101604052808a8581518110611a0c57fe5b906020019060200201518152602001898581518110611a2757fe5b906020019060200201518152602001888581518110611a4257fe5b9060200190602002015115158152602001878581518110611a5f57fe5b906020019060200201518152602001849052601560008c8681518110611a8157fe5b90602001906020020151600160a060020a0316815260208101919091526040016000208151815560208201518160010155604082015160028201805460ff1916911515919091179055606082015181600301556080820151600490910155505b60019092019161198e565b600091505b8451821015611434576017805460018101611b0c8382612a31565b916000526020600020906002020160005b6040805190810160405280898781518110611b3457fe5b906020019060200201518152602001888781518110611b4f57fe5b90602001906020020151905291905081518155602082015181600101555050505b600190910190611af1565b5b5b505b505050505050505050565b6000600d5442118015611ba05750600254600e54105b611bab576000611bc5565b600160a060020a0382166000908152601260205260409020545b90505b919050565b600854600090819033600160a060020a03908116911614611bed57600080fd5b6011548392506101009004600160a060020a03166396a049258360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611c4557600080fd5b6102c65a03f11515611c5657600080fd5b50505081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611cb057600080fd5b6102c65a03f11515611cc157600080fd5b50505060405180519150506000811115611d5457600854600160a060020a038084169163a9059cbb91168360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611d3857600080fd5b6102c65a03f11515611d4957600080fd5b505050604051805150505b5b5b505050565b6000805433600160a060020a03908116911614611d7757600080fd5b6000805b60115460ff166003811115611d8c57fe5b14611d9657600080fd5b60185460009011611da657600080fd5b601a838051611db9929160200190612a63565b50600091505b601a54821015611e58576040805190810160405280868481518110611de057fe5b906020019060200201518152602001858481518110611dfb57fe5b9060200190602002015181525060196000601a85815481101515611e1b57fe5b906000526020600020900160005b50548152602001908152602001600020600082015181556020820151600190910155505b600190910190611dbf565b5b5b505b50505050565b60025481565b60085433600160a060020a03908116911614611e8357600080fd5b6001805b60115460ff166003811115611e9857fe5b14611ea257600080fd5b601180546002919060ff1916600183611775565b02179055505b5b505b565b6000805b601854811015611f0a576018805482908110611edd57fe5b906000526020600020906004020160005b50600101544211611f0157809150611f10565b5b600101611ec5565b60185491505b5090565b600f5481565b60065481565b600160a060020a0382166000908152601460205260408120548190118015611f8f5750600160a060020a0383166000908152601460209081526040808320601383528184208685529092529091206002015481548110611f7c57fe5b906000526020600020900160005b505482145b90505b92915050565b600b5481565b60115460ff1681565b60005433600160a060020a03908116911614611fc257600080fd5b6000805b60115460ff166003811115611fd757fe5b14611fe157600080fd5b601c8054600160a060020a0380851673ffffffffffffffffffffffffffffffffffffffff1992831617909255601d805492861692909116919091179055601b805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790555b5b505b5050565b601b54600090819074010000000000000000000000000000000000000000900460ff16151561208957600080fd5b600160a060020a0383166000908152601e602052604090205460ff16156120af57600080fd5b600160a060020a038084166000908152601e6020526040808220805460ff19166001179055601c54909216916370a08231918691516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561212657600080fd5b6102c65a03f1151561213757600080fd5b50505060405180519250506000821161214f57600080fd5b601d54600160a060020a03166370a082318460006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156121a857600080fd5b6102c65a03f115156121b957600080fd5b5050506040518051905090506121d78382600d5462278d0001612712565b6011546101009004600160a060020a031663867904b4848460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561223b57600080fd5b6102c65a03f1151561224c57600080fd5b505050604051805190501515611d5457600080fd5b5b505050565b61177e3334610b2d565b5b565b600e545b90565b600e5481565b60045481565b600060025b60115460ff16600381111561229d57fe5b1480156122ac5750600b544210155b80156122ba5750600c544211155b90505b90565b6011546101009004600160a060020a031681565b60005433600160a060020a039081169116146122ef57600080fd5b6000805b60115460ff16600381111561230457fe5b1461230e57600080fd5b601b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b5b505b50565b601b54600090600160a060020a03166308e0d29d83836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561239857600080fd5b6102c65a03f115156123a957600080fd5b50505060405180519150505b919050565b6000805b60165482101561118d57601560006016848154811015156123db57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002090506000816000015411156124765761247660168381548110151561243c57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03166009548360000154870281151561246f57fe5b04856128e1565b5b5b6001909101906123be565b5b50505050565b6124926129c3565b61249a6129c3565b60008060006124a76129c3565b6124af6129c3565b600080600080600060188e8154811015156124c657fe5b906000526020600020906004020160005b5099508c98506000975060016040518059106124f05750595b908082528060200260200182016040525b50965060016040518059106125135750595b908082528060200260200182016040525b5060038b015490965060ff16801561253f5750601a54600090115b80156125695750601a8054600090811061255557fe5b906000526020600020900160005b50548d10155b156126c157600d5460028b0154601a54919003955093505b60008411156126c157601a8054600019860190811061259c57fe5b906000526020600020900160005b50548d106126b45787151561260857836001016040518059106125ca5750595b908082528060200260200182016040525b509650836001016040518059106125ef5750595b908082528060200260200182016040525b509550600197505b60196000601a6001870381548110151561261e57fe5b906000526020600020900160005b5054815260200190815260200160002092506009548360010154860281151561265157fe5b048a60020154019150601a6001850381548110151561266c57fe5b906000526020600020900160005b5054890390508087858151811061268d57fe5b60209081029091010152818685815181106126a457fe5b6020908102909101015297889003975b5b60001990930192612581565b5b88876000815181106126d057fe5b6020908102909101015260028a0154866000815181106126ec57fe5b906020019060200201818152505086869b509b505b505050505050505050509250929050565b61271c8382611f20565b1561275257600160a060020a038316600090815260136020908152604080832084845290915290206001018054830190556127e9565b6060604051908101604090815260008083526020808401869052600160a060020a038716825260149052819020805491830191600191908083016127968382612a07565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b60108054830190555b505050565b6000805b60165482101561118d576015600060168481548110151561281857fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002090506000816001015411156128cd576128cd60168381548110151561287957fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600954836001015487028115156128ac57fe5b60028501549190049060ff166128c257856128c8565b83600301545b612712565b5b5b6001909101906127fb565b5b50505050565b6128eb8382611f20565b1561291e57600160a060020a038316600090815260136020908152604080832084845290915290208054830190556129b5565b6060604051908101604090815283825260006020808401829052600160a060020a038716825260149052819020805491830191600191908083016129628382612a07565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b600f8054830190555b505050565b60206040519081016040526000815290565b815481835581811511611d5457600402816004028360005260206000209182019101611d549190612ad9565b5b505050565b815481835581811511611d5457600083815260209020611d54918101908301612b13565b5b505050565b815481835581811511611d5457600202816002028360005260206000209182019101611d549190612b34565b5b505050565b828054828255906000526020600020908101928215612a9e579160200282015b82811115612a9e578251825591602001919060010190612a83565b5b50611f10929150612b13565b5090565b815481835581811511611d5457600083815260209020611d54918101908301612b13565b5b505050565b61227891905b80821115611f1057600080825560018201819055600282015560038101805460ff19169055600401612adf565b5090565b90565b61227891905b80821115611f105760008155600101612b19565b5090565b90565b61227891905b80821115611f105760008082556001820155600201612b3a565b5090565b905600a165627a7a723058207079464f88d6844a993195b4b25d0e0f044454e7eda4243a5e19fed601563b1e0029

   Swarm Source:
bzzr://7079464f88d6844a993195b4b25d0e0f044454e7eda4243a5e19fed601563b1e

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.