Sponsored:   Color - Revolutionizing the Dapp Ecosystem, Bounty & Airdrop, Get 240,000 COL NOW!
Contract Overview | NetworkUnitsCrowdsale
Balance: 4.611928081625 Ether
Ether Value: $1,398.29 (@ $303.19/ETH)
Transactions: 72 txns
Misc
Address Watch: Add To Watch List
Contract Creator: 0xc2264f8cd959266cfcaa13124876e4654081e1eaat txn 0x536aa46c6102a981472aba12db776be705b92e0bafc7d54c8d4e45fc3e22d0f0
Token Balances:
 Latest 25 txns from a total Of 72 transactions

TxHash Age From To Value [TxFee]
0xdd1f22357760a2f3a218bd1884fc836794a35b38c1b0acd7ba871276341c9a27198 days 3 hrs ago0x93832a4fd771157fe2775c0028eebe493f58c296  IN   NetworkUnitsCrowdsale0.00082 Ether0.00084
0x05dbe1320f0628a6da9acf47134bce57ef76a6067c37f66ce3c1bbf692e60aff216 days 3 hrs ago0x5264ae1c8b18e40998907a4485316d9fc359f995  IN   NetworkUnitsCrowdsale0 Ether0.00069735
0x49d9c32eb047be9135a5a1445a0f375d39fdab18deee24d4e597869c95daf98e234 days 19 hrs ago0xa25f05e1ac13dfc31b0ba86b14b0f5bc349002a0  IN   NetworkUnitsCrowdsale0.3 Ether0.000499695
0xa9a7146cbac2b88a00bbe6e7e8d63c70beb6a674c5176f4786d10d75d579e058237 days 8 hrs ago0xf3cf676afe5fe691907534b43ac44bcc012d66c7  IN   NetworkUnitsCrowdsale0.8 Ether0.00691355
0x844066c72c6d41481ae1878a88e3ae75b77d216b66b3836b826c4d1549ae4316237 days 10 hrs ago0xa0b8b814f2ab93f63a42e37ddcab994b5b21a29b  IN   NetworkUnitsCrowdsale0.5 Ether0.00872264
0xb290360a01e21890468afd8bb83abd0a0ded8fdd774c943632d718de1ebaed1a237 days 11 hrs ago0xf3cf676afe5fe691907534b43ac44bcc012d66c7  IN   NetworkUnitsCrowdsale0.6 Ether0.0109033
0x370742288217f5290eb18618e59a2eaa2048c75307dfc93ff4b7302dbe377868237 days 17 hrs ago0x0c11a17279a9f676d694b3410f1effa896eb2341  IN   NetworkUnitsCrowdsale0.096926914 Ether0.004579386
0x718892a651ed836f40d429d03c1fa4a34479afb338317903f81da4039b6f820e238 days 4 mins ago0x7192b46101476b9298b7aaa3fa9d39ac19e4a72a  IN   NetworkUnitsCrowdsale0.4 Ether0.00109033
0x2213c601bc06942e72f46b5bbbaefdd62207ae805409992befb38c1cac11e53f238 days 12 mins ago0x7192b46101476b9298b7aaa3fa9d39ac19e4a72a  IN   NetworkUnitsCrowdsale0.4 Ether0.00099913
0x665d2a61a8f324781778abdfb80a2111cdfec532f2d60029362a3e47a352ede8238 days 3 hrs ago0x7192b46101476b9298b7aaa3fa9d39ac19e4a72a  IN   NetworkUnitsCrowdsale0.4 Ether0.00010503
0x720d093ba262a9270d537a26f41882b293053c2abda96247f0e2e583f8115f0d238 days 6 hrs ago0xaf039baddb1a8c46a839331f3cb7253cc0c0b659  IN   NetworkUnitsCrowdsale0.064993732 Ether0.004579386
0x1990215dbcdbc48156a0414997cc512a9e8cad3917ce59fc954f13ca05147405238 days 7 hrs ago0xe2489d27e7de09278ad71f16d863aa06e66c46db  IN   NetworkUnitsCrowdsale0.04276 Ether0.002616792
0x5491df0aaef992f5062a9721c87d014c25baec8e0df4237f2974f4faf16c5d13238 days 18 hrs ago0x3baa286f1fd5485ceb0b433126113a0445103884  IN   NetworkUnitsCrowdsale0.02508433 Ether0.002725825
0xbba003f1039d9655f0ffa6d7360968e50e27fd7671e6c627367014e5c7989287238 days 21 hrs ago0x1acee83486b6671b005eed45c9fb9277e7eeb63d  IN   NetworkUnitsCrowdsale2 Ether0.00872264
0xe4845460dfbd1782617b8adb30c1d20090453510273e62db87144432a9424c96238 days 22 hrs ago0x3ac23786018abadc1a93d8c546554f4530962e70  IN   NetworkUnitsCrowdsale0.15 Ether0.010685234
0xe96741f163f9971b507c0485937001ae55908ee36779cd6220aa65f18142bde1239 days 24 mins ago0x2f7e449a5336da97cc163777f0e943f3ba91c09f  IN   NetworkUnitsCrowdsale0.79 Ether0.00981297
0xc758b5d5d7b3f90322967965cca12818f6f67c2f42735b843249b859bb6d3010239 days 1 hr ago0xde628f885c86817cd3a216f7782304fbe50c5843  IN   NetworkUnitsCrowdsale0.5517 Ether0.004579386
0xebbb73cb5f8809b0672325626576bc16d6c12c3f3df04a7482ca313ac7046a52239 days 4 hrs ago0x79e95f5b9679ca97da6823864548b223024f56ff  IN   NetworkUnitsCrowdsale0.1 Ether0.006323914
0x22c48f980ce6fa2459b98c3e0149e3fcf5244025ee748e5f70c4a250c37e69a7239 days 5 hrs ago0xf0b7d6772fd1eb4cb80276ea7a0db3e84146aae3  IN   NetworkUnitsCrowdsale2.21287653 Ether0.01106168
0x163d112379403ac2fc9e832ea0446af49666e3e80f515463f9e19f61d9b4e664239 days 5 hrs ago0xf0b7d6772fd1eb4cb80276ea7a0db3e84146aae3  IN   NetworkUnitsCrowdsale0.02 Ether0.01744528
0x92392c43aeb9ebae942d945f95f224b7eb1546ca650eb29d00b6e39ff5e93eb8239 days 6 hrs ago0xe3d7a8308bf7f1ef22c92b4d0b33cf340d17e602  IN   NetworkUnitsCrowdsale0.15 Ether0.004579386
0x28a24cfb95f1b375fe58342f492ab50ecfa938d2965e16339821c6934a928282239 days 11 hrs ago0xf8133e57020313d192fb5cb8febf2f28b16f3440  IN   NetworkUnitsCrowdsale0.4 Ether0.00872264
0x229d7573284ec77279b8b34c535d7d04619a15b4e68fb1d88731f76c829bc71e239 days 12 hrs ago0x0f5a5f463cdcd812889d1d8ac0006e2b661ae94f  IN   NetworkUnitsCrowdsale0.13 Ether0.00545165
0xa21dc4fe5d84773f1c0b7cb1ee176c41f1dad03055c1bea91fc5155c52e0ddf1239 days 16 hrs ago0x27f4ecf46e8865355d8a202d2f402b78e1c1c06d  IN   NetworkUnitsCrowdsale0.04238592 Ether0.004579386
0xb7cf83ba68d2fb60bddfceea210c65affe97898891835078eb81606df6a1f586239 days 18 hrs ago0x34be37951ddbe63b59feace85ac0f57936470a6f  IN   NetworkUnitsCrowdsale0.06323165 Ether0.004579386
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 4 Internal Transactions

ParentTxHash Block Age From To Value
0x413cec477aa4d0f35196572cc3fc96f6af0a0d4a240c573453678b46252acb9a4980019202 days 12 hrs ago0x5c9f77612069eabd4b06be53d67e3f16af2d84360xe431c50efb8035862b724c6f82cfd2b61432627b13.835784244875 Ether
0x5ba9e7d8888bed7ef7d3538ba895a1e94b1a35c557279f8573d9c2166b7270ed4514332282 days 2 hrs ago0x5c9f77612069eabd4b06be53d67e3f16af2d84360xc2264f8cd959266cfcaa13124876e4654081e1ea23.5875 Ether
0x0e9953be6d862bef033d535a9354d5729b8e3b1c857d21180b0ba0dcb6bd8a6b4514328282 days 2 hrs ago0x5c9f77612069eabd4b06be53d67e3f16af2d84360x201f2129bf943ff4b0042ec05f123f6c8c52637c15.725 Ether
0x57691983b324a46adcbedf776b90fea19f9ac1e32cd66085d7c42067c25502f54514301282 days 2 hrs ago0x5c9f77612069eabd4b06be53d67e3f16af2d84360xe431c50efb8035862b724c6f82cfd2b61432627b117.9375 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) Solidity compiler bugs.

Contract Source Code Verified (Similar match)
Note: Displaying similar matching verified source code at contract 0x6cbd17dcb8331e61baf3d2c7355a27ff9deff619(excluding Constructor Arguments if any)
Contract Name: NUCrowdsale
Compiler Version: 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 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 = Stages.Deploying;

    // 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);
        _;
    }


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


    /**
     * 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 Crowdsale(uint _start, address _token, uint _tokenDenominator, uint _percentageDenominator, uint _minAmount, uint _maxAmount, uint _minAcceptedAmount, uint _minAmountPresale, uint _maxAmountPresale, uint _minAcceptedAmountPresale) {
        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 found) {
        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) private 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);
        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 * (rate - baseRate);
                _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) private {
        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) private {
        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) private {
        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) private {
        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);
            }
        }
    }
}


/**
 * @title NUCrowdsale
 *
 * Network Units (NU) is a decentralised worldwide collaboration of computing power
 *
 * By allowing gamers and service providers to participate in our unique mining 
 * process, we will create an ultra-fast, blockchain controlled multiplayer infrastructure 
 * rentable by developers
 *
 * Visit https://networkunits.io/
 *
 * #created 22/10/2017
 * #author Frank Bonnet
 */
contract NUCrowdsale is Crowdsale, ITokenRetreiver, IWingsAdapter {


    /**
     * 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 precision 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 NUCrowdsale(uint _start, address _token, uint _tokenDenominator, uint _percentageDenominator, uint _minAmount, uint _maxAmount, uint _minAcceptedAmount, uint _minAmountPresale, uint _maxAmountPresale, uint _minAcceptedAmountPresale) 
        Crowdsale(_start, _token, _tokenDenominator, _percentageDenominator, _minAmount, _maxAmount, _minAcceptedAmount, _minAmountPresale, _maxAmountPresale, _minAcceptedAmountPresale) {
    }


    /**
     * 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 _contributor != address(0x0);
    }


    /**
     * 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":"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":"found","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":"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"},{"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"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"}]

  Contract Creation Code Switch To Opcodes View
6060604052601180546000919060ff19166001835b0217905550341561002457600080fd5b60405161014080612786833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b898989898989898989895b5b60008054600160a060020a03191633600160a060020a03161790555b6011805461010060a860020a031916610100600160a060020a038c1602179055600a8890556009879055600b8a90556002869055600385905560048490556005839055600682905560078190555b505050505050505050505b505050505050505050505b612670806101166000396000f300606060405236156101b05763ffffffff60e060020a6000350416622f956981146101de5780630d6f849b146102035780630d70e7e3146102285780631f68f20a146102535780632095f2d414610278578063229f3e291461028d5780632d92b1c0146102b257806338af3eed146103c85780634942edf9146103f75780634d9aa42414610422578063590e1ae3146104475780635f48f3931461045c57806370a08231146104815780637252bbf2146104b25780637362377b146104e357806376c82e92146104f8578063775c300c1461051d57806383197ef0146105325780638d8f2adb146105475780638ec521a81461055c57806392099fdb1461072d57806396a049251461075e578063984c14ac1461077f5780639b2cb5d8146108505780639c5e902314610875578063a3a40ea51461088a578063b19a4540146108af578063b946fab1146108d4578063bd51d5d0146108f9578063be9a65551461092f578063c040e6b814610954578063d7bb99ba1461098b578063e29eb83614610995578063f0ea4bfc146109ba578063f1d841f1146109df578063f96c166c14610a04578063fc0c546a14610a2b575b5b32600160a060020a031633600160a060020a03161415156101d157600080fd5b6101db3334610a5a565b5b005b34156101e957600080fd5b6101f1610d93565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1610d99565b60405190815260200160405180910390f35b341561023357600080fd5b6101f1600435602435610d9f565b60405190815260200160405180910390f35b341561025e57600080fd5b6101f1610ee6565b60405190815260200160405180910390f35b341561028357600080fd5b6101db610eec565b005b341561029857600080fd5b6101f16110b6565b60405190815260200160405180910390f35b34156102bd57600080fd5b6101db600480359060446024803590810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506110bc95505050505050565b005b34156103d357600080fd5b6103db611289565b604051600160a060020a03909116815260200160405180910390f35b341561040257600080fd5b6101f1600435602435611298565b60405190815260200160405180910390f35b341561042d57600080fd5b6101f16112b7565b60405190815260200160405180910390f35b341561045257600080fd5b6101db6112bd565b005b341561046757600080fd5b6101f1611376565b60405190815260200160405180910390f35b341561048c57600080fd5b6101f1600160a060020a036004351661137c565b60405190815260200160405180910390f35b34156104bd57600080fd5b6101f1600160a060020a036004351661140c565b60405190815260200160405180910390f35b34156104ee57600080fd5b6101db61149c565b005b341561050357600080fd5b6101f1611583565b60405190815260200160405180910390f35b341561052857600080fd5b6101db611589565b005b341561053d57600080fd5b6101db6115fd565b005b341561055257600080fd5b6101db611641565b005b341561056757600080fd5b6101db600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061178595505050505050565b005b341561073857600080fd5b6101f1600160a060020a0360043516611a07565b60405190815260200160405180910390f35b341561076957600080fd5b6101db600160a060020a0360043516611a4a565b005b341561078a57600080fd5b6101db60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650611bd895505050505050565b005b341561085b57600080fd5b6101f1611cdf565b60405190815260200160405180910390f35b341561088057600080fd5b6101db611ce5565b005b341561089557600080fd5b6101f1611d3e565b60405190815260200160405180910390f35b34156108ba57600080fd5b6101f1611d91565b60405190815260200160405180910390f35b34156108df57600080fd5b6101f1611d97565b60405190815260200160405180910390f35b341561090457600080fd5b61091b600160a060020a0360043516602435611d9d565b604051901515815260200160405180910390f35b341561093a57600080fd5b6101f1611e15565b60405190815260200160405180910390f35b341561095f57600080fd5b610967611e1b565b6040518082600381111561097757fe5b60ff16815260200191505060405180910390f35b6101db611e24565b005b34156109a057600080fd5b6101f1611e31565b60405190815260200160405180910390f35b34156109c557600080fd5b6101f1611e38565b60405190815260200160405180910390f35b34156109ea57600080fd5b6101f1611e3e565b60405190815260200160405180910390f35b3415610a0f57600080fd5b61091b611e44565b604051901515815260200160405180910390f35b3415610a3657600080fd5b6103db611e7d565b604051600160a060020a03909116815260200160405180910390f35b6000806000806000610a6a6124ac565b610a726124ac565b600080806002805b60115460ff166003811115610a8b57fe5b14610a9557600080fd5b600b544210158015610aa95750600d544211155b1515610ab457600080fd5b610abd8d611e91565b1515610ac857600080fd5b610ad0611e44565b9a508a1580610ae157506007548c10155b1515610aec57600080fd5b8a1580610afc5750600654600e54105b1515610b0757600080fd5b8a80610b1557506004548c10155b1515610b2057600080fd5b8a80610b305750600554600e5410155b1515610b3b57600080fd5b8a80610b4a5750600354600e54105b1515610b5557600080fd5b8a8015610b6757506006548c600e5401115b15610b7a57600e54600654039950610b9a565b6003548c600e54011115610b9657600e54600354039950610b9a565b8b99505b5b600e80548b0190558a15610bb957610bb48a6000611ea3565b610bd8565b600160a060020a038d16600090815260126020526040902080548b0190555b60009850610be4611d3e565b9750610bf0888b610d9f565b9650610bfc888b611f73565b95509550600093505b8551841015610caa57610c2d868581518110610c1d57fe5b9060200190602002015188611298565b925060015487118015610c54575042858581518110610c4857fe5b90602001906020020151115b15610c995760015487038784811515610c6957fe5b04029150610c8d8d83878781518110610c7e57fe5b906020019060200201516121fb565b81830389019850610c9e565b978201975b5b600190930192610c05565b600089118015610d3657506011546101009004600160a060020a031663867904b48e8b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610d1957600080fd5b6102c65a03f11515610d2a57600080fd5b50505060405180519050155b15610d4057600080fd5b60008a8d03118015610d785750600160a060020a038d168a8d0380156108fc0290604051600060405180830381858888f19350505050155b15610d8257600080fd5b5b5b50505050505050505050505050565b60105481565b60055481565b60008080808060025b60115460ff166003811115610db957fe5b148015610dc85750600b544210155b15610ed6576018805488908110610ddb57fe5b906000526020600020906004020160005b508054600382015490955090935060ff168015610e0c5750601a54600090115b8015610e365750601a80546000908110610e2257fe5b906000526020600020900160005b50548610155b15610ed657601a5491505b6000821115610ed657601a80546000198401908110610e5c57fe5b906000526020600020900160005b50548610610ec95760196000601a60018503815481101515610e8857fe5b906000526020600020900160005b5054815260200190815260200160002090506009548160000154846000015402811515610ebf57fe5b0484019350610ed6565b5b60001990910190610e41565b5b5b8394505b5050505092915050565b60015481565b600080806002805b60115460ff166003811115610f0557fe5b14610f0f57600080fd5b600d54421180610f235750600354600e5410155b1515610f2e57600080fd5b600254600e541015610f3f57600080fd5b601180546003919060ff19166001835b02179055506011546101009004600160a060020a031663a69df4b56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fa157600080fd5b6102c65a03f11515610fb257600080fd5b505050604051805190501515610fc757600080fd5b6010546011546101009004600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561101757600080fd5b6102c65a03f1151561102857600080fd5b50505060405180519050019350600092505b60175483101561109557601780548490811061105257fe5b906000526020600020906002020160005b5091506110896009548360000154860281151561107c57fe5b04836001015442016122e0565b5b60019092019161103a565b6110ae600f5430600160a060020a031631036000611ea3565b5b5b50505050565b600c5481565b60008054819033600160a060020a039081169116146110da57600080fd5b6000805b60115460ff1660038111156110ef57fe5b146110f957600080fd5b60018890558560008151811061110b57fe5b90602001906020020151600b54908101600c55600d55600092505b86518310156112045785838151811061113b57fe5b90602001906020020151600d80549091019055601880546001810161116083826124be565b916000526020600020906004020160005b6080604051908101604052808b888151811061118957fe5b906020019060200201518152602001600d548152602001600081526020018888815181106111b357fe5b90602001906020020151151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600190920191611126565b600091505b865182101561127c57600085838151811061122057fe5b9060200190602002015111156112705784828151811061123c57fe5b90602001906020020151600d540160188381548110151561125957fe5b906000526020600020906004020160005b50600201555b5b600190910190611209565b5b5b505b50505050505050565b600854600160a060020a031681565b600a54600090670de0b6b3a764000090848402025b0490505b92915050565b600d5481565b600d5460009042116112ce57600080fd5b6002805b60115460ff1660038111156112e357fe5b146112ed57600080fd5b600254600e54106112fd57600080fd5b600160a060020a033316600090815260126020526040812080549082905592508211801561134e5750600160a060020a03331682156108fc0283604051600060405180830381858888f19350505050155b1561136f57600160a060020a03331660009081526012602052604090208290555b5b5b505b50565b60035481565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a0384166000908152601360209081526040808320601490925282208054919291849081106113d257fe5b906000526020600020900160005b5054815260200190815260200160002060010154820191505b600101611381565b8192505b5050919050565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a03841660009081526013602090815260408083206014909252822080549192918490811061146257fe5b906000526020600020900160005b5054815260200190815260200160002060000154820191505b600101611411565b8192505b5050919050565b60008080805b600160a060020a03331660009081526014602052604090205483101561153857600160a060020a03331660009081526014602052604090208054849081106114e657fe5b906000526020600020900160005b5054915042821161152c5750600160a060020a0333166000908152601360209081526040808320848452909152812080549181559301925b5b6001909201916114a2565b60008411156110ae57600f80548590039055600160a060020a03331684156108fc0285604051600060405180830381858888f1935050505015156110ae57600080fd5b5b5b50505050565b60075481565b60005433600160a060020a039081169116146115a457600080fd5b6000805b60115460ff1660038111156115b957fe5b146115c357600080fd5b601854600090116115d357600080fd5b601654600090116115e357600080fd5b601180546001919060ff191682805b02179055505b5b505b565b60085433600160a060020a0390811691161461161857600080fd5b600d546303c26700908101421161162e57600080fd5b600854600160a060020a0316ff5b5b505b565b60008080805b600160a060020a0333166000908152601460205260409020548310156116e157600160a060020a033316600090815260146020526040902080548490811061168b57fe5b906000526020600020900160005b505491504282116116d55750600160a060020a033316600090815260136020908152604080832084845290915281206001810180549290559301925b5b600190920191611647565b60008411156110ae576010805485900390556011546101009004600160a060020a031663867904b4338660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561175757600080fd5b6102c65a03f1151561176857600080fd5b5050506040518051905015156110ae57600080fd5b5b5b50505050565b60008054819033600160a060020a039081169116146117a357600080fd5b6000805b60115460ff1660038111156117b857fe5b146117c257600080fd5b896000815181106117cf57fe5b906020019060200201516008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600092505b895183101561196957601680546001810161182683826124f0565b916000526020600020900160005b8c868151811061184057fe5b90602001906020020151909190916101000a815481600160a060020a030219169083600160a060020a031602179055505060a0604051908101604052808a858151811061188957fe5b9060200190602002015181526020018985815181106118a457fe5b9060200190602002015181526020018885815181106118bf57fe5b90602001906020020151151581526020018785815181106118dc57fe5b906020019060200201518152602001849052601560008c86815181106118fe57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000208151815560208201518160010155604082015160028201805460ff1916911515919091179055606082015181600301556080820151600490910155505b60019092019161180b565b600091505b84518210156119f8576017805460018101611989838261251a565b916000526020600020906002020160005b60408051908101604052808987815181106119b157fe5b9060200190602002015181526020018887815181106119cc57fe5b90602001906020020151905291905081518155602082015181600101555050505b60019091019061196e565b5b5b505b505050505050505050565b6000600d5442118015611a1d5750600254600e54105b611a28576000611a42565b600160a060020a0382166000908152601260205260409020545b90505b919050565b600854600090819033600160a060020a03908116911614611a6a57600080fd5b6011548392506101009004600160a060020a03166396a049258360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611ac257600080fd5b6102c65a03f11515611ad357600080fd5b50505081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611b2d57600080fd5b6102c65a03f11515611b3e57600080fd5b50505060405180519150506000811115611bd157600854600160a060020a038084169163a9059cbb91168360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bb557600080fd5b6102c65a03f11515611bc657600080fd5b505050604051805150505b5b5b505050565b6000805433600160a060020a03908116911614611bf457600080fd5b6000805b60115460ff166003811115611c0957fe5b14611c1357600080fd5b60185460009011611c2357600080fd5b601a838051611c3692916020019061254c565b50600091505b601a54821015611cd5576040805190810160405280868481518110611c5d57fe5b906020019060200201518152602001858481518110611c7857fe5b9060200190602002015181525060196000601a85815481101515611c9857fe5b906000526020600020900160005b50548152602001908152602001600020600082015181556020820151600190910155505b600190910190611c3c565b5b5b505b50505050565b60025481565b60085433600160a060020a03908116911614611d0057600080fd5b6001805b60115460ff166003811115611d1557fe5b14611d1f57600080fd5b601180546002919060ff19166001836115f2565b02179055505b5b505b565b6000805b601854811015611d87576018805482908110611d5a57fe5b906000526020600020906004020160005b50600101544211611d7e57809150611d8d565b5b600101611d42565b60185491505b5090565b600f5481565b60065481565b600160a060020a0382166000908152601460205260408120548190118015611e0c5750600160a060020a0383166000908152601460209081526040808320601383528184208685529092529091206002015481548110611df957fe5b906000526020600020900160005b505482145b90505b92915050565b600b5481565b60115460ff1681565b6115fb3334610a5a565b5b565b600e545b90565b600e5481565b60045481565b600060025b60115460ff166003811115611e5a57fe5b148015611e695750600b544210155b8015611e775750600c544211155b90505b90565b6011546101009004600160a060020a031681565b600160a060020a03811615155b919050565b6000805b6016548210156110ae5760156000601684815481101515611ec457fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000209050600081600001541115611f5f57611f5f601683815481101515611f2557fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660095483600001548702811515611f5857fe5b04856123ca565b5b5b600190910190611ea7565b5b50505050565b611f7b6124ac565b611f836124ac565b6000806000611f906124ac565b611f986124ac565b600080600080600060188e815481101515611faf57fe5b906000526020600020906004020160005b5099508c9850600097506001604051805910611fd95750595b908082528060200260200182016040525b5096506001604051805910611ffc5750595b908082528060200260200182016040525b5060038b015490965060ff1680156120285750601a54600090115b80156120525750601a8054600090811061203e57fe5b906000526020600020900160005b50548d10155b156121aa57600d5460028b0154601a54919003955093505b60008411156121aa57601a8054600019860190811061208557fe5b906000526020600020900160005b50548d1061219d578715156120f157836001016040518059106120b35750595b908082528060200260200182016040525b509650836001016040518059106120d85750595b908082528060200260200182016040525b509550600197505b60196000601a6001870381548110151561210757fe5b906000526020600020900160005b5054815260200190815260200160002092506009548360010154860281151561213a57fe5b048a60020154019150601a6001850381548110151561215557fe5b906000526020600020900160005b5054890390508087858151811061217657fe5b602090810290910101528186858151811061218d57fe5b6020908102909101015297889003975b5b6000199093019261206a565b5b88876000815181106121b957fe5b6020908102909101015260028a0154866000815181106121d557fe5b906020019060200201818152505086869b509b505b505050505050505050509250929050565b6122058382611d9d565b1561223b57600160a060020a038316600090815260136020908152604080832084845290915290206001018054830190556122d2565b6060604051908101604090815260008083526020808401869052600160a060020a0387168252601490528190208054918301916001919080830161227f83826124f0565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b60108054830190555b505050565b6000805b6016548210156110ae576015600060168481548110151561230157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002090506000816001015411156123b6576123b660168381548110151561236257fe5b906000526020600020900160005b9054906101000a9004600160a060020a03166009548360010154870281151561239557fe5b60028501549190049060ff166123ab57856123b1565b83600301545b6121fb565b5b5b6001909101906122e4565b5b50505050565b6123d48382611d9d565b1561240757600160a060020a0383166000908152601360209081526040808320848452909152902080548301905561249e565b6060604051908101604090815283825260006020808401829052600160a060020a0387168252601490528190208054918301916001919080830161244b83826124f0565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b600f8054830190555b505050565b60206040519081016040526000815290565b815481835581811511611bd157600402816004028360005260206000209182019101611bd191906125c2565b5b505050565b815481835581811511611bd157600083815260209020611bd19181019083016125fc565b5b505050565b815481835581811511611bd157600202816002028360005260206000209182019101611bd1919061261d565b5b505050565b828054828255906000526020600020908101928215612587579160200282015b8281111561258757825182559160200191906001019061256c565b5b50611d8d9291506125fc565b5090565b815481835581811511611bd157600083815260209020611bd19181019083016125fc565b5b505050565b611e3591905b80821115611d8d57600080825560018201819055600282015560038101805460ff191690556004016125c8565b5090565b90565b611e3591905b80821115611d8d5760008155600101612602565b5090565b90565b611e3591905b80821115611d8d5760008082556001820155600201612623565b5090565b905600a165627a7a72305820756a213df77a1815a05f7a9451a331a5308219a9cdc8597524760e7b20be391a0029000000000000000000000000000000000000000000000000000000005a02ffd0000000000000000000000000c1a28f14218f5c4f533014f8084e1d410274c7bd0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000b4aeaab10258f4000000000000000000000000000000000000000000000000038777362bbf64280000000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000002386f26fc10000

   Swarm Source:
bzzr://756a213df77a1815a05f7a9451a331a5308219a9cdc8597524760e7b20be391a

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.