ETH Price: $3,159.89 (-5.31%)
Gas: 8 Gwei

Token

 

Overview

Max Total Supply

0

Holders

1

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
1,120,000,000,000

Value
$0.00
0x6717a71b2c686c8951194cfd8d38d6047af5417b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GLACrowdsale

Compiler Version
v0.4.15+commit.bbb8e64f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-10-14
*/

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 = 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 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;


    /**
     * Setup the crowdsale
     *
     * @param _whitelist The address of the whitelist authenticator
     * @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 GLACrowdsale(address _whitelist, 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) {
        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);
    }


    /**
     * 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 Security Audit

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":"_whitelist","type":"address"},{"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"}]

6060604052601180546000919060ff19166001835b0217905550341561002457600080fd5b6040516101608061282083398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b898989898989898989895b5b60008054600160a060020a03191633600160a060020a03161790555b6011805461010060a860020a031916610100600160a060020a038c1602179055600a8890556009879055600b8a90556002869055600385905560048490556005839055600682905560078190555b505050505050505050508a601b60006101000a815481600160a060020a030219169083600160a060020a031602179055505b50505050505050505050505b6126db806101456000396000f300606060405236156101b05763ffffffff60e060020a6000350416622f956981146101de5780630d6f849b146102035780630d70e7e3146102285780631f68f20a146102535780632095f2d414610278578063229f3e291461028d5780632d92b1c0146102b257806338af3eed146103c85780634942edf9146103f75780634d9aa42414610422578063590e1ae3146104475780635f48f3931461045c57806370a08231146104815780637252bbf2146104b25780637362377b146104e357806376c82e92146104f8578063775c300c1461051d57806383197ef0146105325780638d8f2adb146105475780638ec521a81461055c57806392099fdb1461072d57806396a049251461075e578063984c14ac1461077f5780639b2cb5d8146108505780639c5e902314610875578063a3a40ea51461088a578063b19a4540146108af578063b946fab1146108d4578063bd51d5d0146108f9578063be9a65551461092f578063c040e6b814610954578063d7bb99ba1461098b578063e29eb83614610995578063f0ea4bfc146109ba578063f1d841f1146109df578063f96c166c14610a04578063fc0c546a14610a2b575b5b32600160a060020a031633600160a060020a03161415156101d157600080fd5b6101db3334610a5a565b5b005b34156101e957600080fd5b6101f1610d93565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1610d99565b60405190815260200160405180910390f35b341561023357600080fd5b6101f1600435602435610d9f565b60405190815260200160405180910390f35b341561025e57600080fd5b6101f1610ee6565b60405190815260200160405180910390f35b341561028357600080fd5b6101db610eec565b005b341561029857600080fd5b6101f16110b6565b60405190815260200160405180910390f35b34156102bd57600080fd5b6101db600480359060446024803590810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506110bc95505050505050565b005b34156103d357600080fd5b6103db611289565b604051600160a060020a03909116815260200160405180910390f35b341561040257600080fd5b6101f1600435602435611298565b60405190815260200160405180910390f35b341561042d57600080fd5b6101f16112b7565b60405190815260200160405180910390f35b341561045257600080fd5b6101db6112bd565b005b341561046757600080fd5b6101f1611376565b60405190815260200160405180910390f35b341561048c57600080fd5b6101f1600160a060020a036004351661137c565b60405190815260200160405180910390f35b34156104bd57600080fd5b6101f1600160a060020a036004351661140c565b60405190815260200160405180910390f35b34156104ee57600080fd5b6101db61149c565b005b341561050357600080fd5b6101f1611583565b60405190815260200160405180910390f35b341561052857600080fd5b6101db611589565b005b341561053d57600080fd5b6101db6115fd565b005b341561055257600080fd5b6101db611641565b005b341561056757600080fd5b6101db600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061178595505050505050565b005b341561073857600080fd5b6101f1600160a060020a0360043516611a07565b60405190815260200160405180910390f35b341561076957600080fd5b6101db600160a060020a0360043516611a4a565b005b341561078a57600080fd5b6101db60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650611bd895505050505050565b005b341561085b57600080fd5b6101f1611cdf565b60405190815260200160405180910390f35b341561088057600080fd5b6101db611ce5565b005b341561089557600080fd5b6101f1611d3e565b60405190815260200160405180910390f35b34156108ba57600080fd5b6101f1611d91565b60405190815260200160405180910390f35b34156108df57600080fd5b6101f1611d97565b60405190815260200160405180910390f35b341561090457600080fd5b61091b600160a060020a0360043516602435611d9d565b604051901515815260200160405180910390f35b341561093a57600080fd5b6101f1611e15565b60405190815260200160405180910390f35b341561095f57600080fd5b610967611e1b565b6040518082600381111561097757fe5b60ff16815260200191505060405180910390f35b6101db611e24565b005b34156109a057600080fd5b6101f1611e31565b60405190815260200160405180910390f35b34156109c557600080fd5b6101f1611e38565b60405190815260200160405180910390f35b34156109ea57600080fd5b6101f1611e3e565b60405190815260200160405180910390f35b3415610a0f57600080fd5b61091b611e44565b604051901515815260200160405180910390f35b3415610a3657600080fd5b6103db611e7d565b604051600160a060020a03909116815260200160405180910390f35b6000806000806000610a6a612517565b610a72612517565b600080806002805b60115460ff166003811115610a8b57fe5b14610a9557600080fd5b600b544210158015610aa95750600d544211155b1515610ab457600080fd5b610abd8d611e91565b1515610ac857600080fd5b610ad0611e44565b9a508a1580610ae157506007548c10155b1515610aec57600080fd5b8a1580610afc5750600654600e54105b1515610b0757600080fd5b8a80610b1557506004548c10155b1515610b2057600080fd5b8a80610b305750600554600e5410155b1515610b3b57600080fd5b8a80610b4a5750600354600e54105b1515610b5557600080fd5b8a8015610b6757506006548c600e5401115b15610b7a57600e54600654039950610b9a565b6003548c600e54011115610b9657600e54600354039950610b9a565b8b99505b5b600e80548b0190558a15610bb957610bb48a6000611f0e565b610bd8565b600160a060020a038d16600090815260126020526040902080548b0190555b60009850610be4611d3e565b9750610bf0888b610d9f565b9650610bfc888b611fde565b95509550600093505b8551841015610caa57610c2d868581518110610c1d57fe5b9060200190602002015188611298565b925060015487118015610c54575042858581518110610c4857fe5b90602001906020020151115b15610c995760015487038784811515610c6957fe5b04029150610c8d8d83878781518110610c7e57fe5b90602001906020020151612266565b81830389019850610c9e565b978201975b5b600190930192610c05565b600089118015610d3657506011546101009004600160a060020a031663867904b48e8b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610d1957600080fd5b6102c65a03f11515610d2a57600080fd5b50505060405180519050155b15610d4057600080fd5b60008a8d03118015610d785750600160a060020a038d168a8d0380156108fc0290604051600060405180830381858888f19350505050155b15610d8257600080fd5b5b5b50505050505050505050505050565b60105481565b60055481565b60008080808060025b60115460ff166003811115610db957fe5b148015610dc85750600b544210155b15610ed6576018805488908110610ddb57fe5b906000526020600020906004020160005b508054600382015490955090935060ff168015610e0c5750601a54600090115b8015610e365750601a80546000908110610e2257fe5b906000526020600020900160005b50548610155b15610ed657601a5491505b6000821115610ed657601a80546000198401908110610e5c57fe5b906000526020600020900160005b50548610610ec95760196000601a60018503815481101515610e8857fe5b906000526020600020900160005b5054815260200190815260200160002090506009548160000154846000015402811515610ebf57fe5b0484019350610ed6565b5b60001990910190610e41565b5b5b8394505b5050505092915050565b60015481565b600080806002805b60115460ff166003811115610f0557fe5b14610f0f57600080fd5b600d54421180610f235750600354600e5410155b1515610f2e57600080fd5b600254600e541015610f3f57600080fd5b601180546003919060ff19166001835b02179055506011546101009004600160a060020a031663a69df4b56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fa157600080fd5b6102c65a03f11515610fb257600080fd5b505050604051805190501515610fc757600080fd5b6010546011546101009004600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561101757600080fd5b6102c65a03f1151561102857600080fd5b50505060405180519050019350600092505b60175483101561109557601780548490811061105257fe5b906000526020600020906002020160005b5091506110896009548360000154860281151561107c57fe5b048360010154420161234b565b5b60019092019161103a565b6110ae600f5430600160a060020a031631036000611f0e565b5b5b50505050565b600c5481565b60008054819033600160a060020a039081169116146110da57600080fd5b6000805b60115460ff1660038111156110ef57fe5b146110f957600080fd5b60018890558560008151811061110b57fe5b90602001906020020151600b54908101600c55600d55600092505b86518310156112045785838151811061113b57fe5b90602001906020020151600d8054909101905560188054600181016111608382612529565b916000526020600020906004020160005b6080604051908101604052808b888151811061118957fe5b906020019060200201518152602001600d548152602001600081526020018888815181106111b357fe5b90602001906020020151151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600190920191611126565b600091505b865182101561127c57600085838151811061122057fe5b9060200190602002015111156112705784828151811061123c57fe5b90602001906020020151600d540160188381548110151561125957fe5b906000526020600020906004020160005b50600201555b5b600190910190611209565b5b5b505b50505050505050565b600854600160a060020a031681565b600a54600090670de0b6b3a764000090848402025b0490505b92915050565b600d5481565b600d5460009042116112ce57600080fd5b6002805b60115460ff1660038111156112e357fe5b146112ed57600080fd5b600254600e54106112fd57600080fd5b600160a060020a033316600090815260126020526040812080549082905592508211801561134e5750600160a060020a03331682156108fc0283604051600060405180830381858888f19350505050155b1561136f57600160a060020a03331660009081526012602052604090208290555b5b5b505b50565b60035481565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a0384166000908152601360209081526040808320601490925282208054919291849081106113d257fe5b906000526020600020900160005b5054815260200190815260200160002060010154820191505b600101611381565b8192505b5050919050565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a03841660009081526013602090815260408083206014909252822080549192918490811061146257fe5b906000526020600020900160005b5054815260200190815260200160002060000154820191505b600101611411565b8192505b5050919050565b60008080805b600160a060020a03331660009081526014602052604090205483101561153857600160a060020a03331660009081526014602052604090208054849081106114e657fe5b906000526020600020900160005b5054915042821161152c5750600160a060020a0333166000908152601360209081526040808320848452909152812080549181559301925b5b6001909201916114a2565b60008411156110ae57600f80548590039055600160a060020a03331684156108fc0285604051600060405180830381858888f1935050505015156110ae57600080fd5b5b5b50505050565b60075481565b60005433600160a060020a039081169116146115a457600080fd5b6000805b60115460ff1660038111156115b957fe5b146115c357600080fd5b601854600090116115d357600080fd5b601654600090116115e357600080fd5b601180546001919060ff191682805b02179055505b5b505b565b60085433600160a060020a0390811691161461161857600080fd5b600d546303c26700908101421161162e57600080fd5b600854600160a060020a0316ff5b5b505b565b60008080805b600160a060020a0333166000908152601460205260409020548310156116e157600160a060020a033316600090815260146020526040902080548490811061168b57fe5b906000526020600020900160005b505491504282116116d55750600160a060020a033316600090815260136020908152604080832084845290915281206001810180549290559301925b5b600190920191611647565b60008411156110ae576010805485900390556011546101009004600160a060020a031663867904b4338660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561175757600080fd5b6102c65a03f1151561176857600080fd5b5050506040518051905015156110ae57600080fd5b5b5b50505050565b60008054819033600160a060020a039081169116146117a357600080fd5b6000805b60115460ff1660038111156117b857fe5b146117c257600080fd5b896000815181106117cf57fe5b906020019060200201516008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600092505b8951831015611969576016805460018101611826838261255b565b916000526020600020900160005b8c868151811061184057fe5b90602001906020020151909190916101000a815481600160a060020a030219169083600160a060020a031602179055505060a0604051908101604052808a858151811061188957fe5b9060200190602002015181526020018985815181106118a457fe5b9060200190602002015181526020018885815181106118bf57fe5b90602001906020020151151581526020018785815181106118dc57fe5b906020019060200201518152602001849052601560008c86815181106118fe57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000208151815560208201518160010155604082015160028201805460ff1916911515919091179055606082015181600301556080820151600490910155505b60019092019161180b565b600091505b84518210156119f85760178054600181016119898382612585565b916000526020600020906002020160005b60408051908101604052808987815181106119b157fe5b9060200190602002015181526020018887815181106119cc57fe5b90602001906020020151905291905081518155602082015181600101555050505b60019091019061196e565b5b5b505b505050505050505050565b6000600d5442118015611a1d5750600254600e54105b611a28576000611a42565b600160a060020a0382166000908152601260205260409020545b90505b919050565b600854600090819033600160a060020a03908116911614611a6a57600080fd5b6011548392506101009004600160a060020a03166396a049258360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611ac257600080fd5b6102c65a03f11515611ad357600080fd5b50505081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611b2d57600080fd5b6102c65a03f11515611b3e57600080fd5b50505060405180519150506000811115611bd157600854600160a060020a038084169163a9059cbb91168360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bb557600080fd5b6102c65a03f11515611bc657600080fd5b505050604051805150505b5b5b505050565b6000805433600160a060020a03908116911614611bf457600080fd5b6000805b60115460ff166003811115611c0957fe5b14611c1357600080fd5b60185460009011611c2357600080fd5b601a838051611c369291602001906125b7565b50600091505b601a54821015611cd5576040805190810160405280868481518110611c5d57fe5b906020019060200201518152602001858481518110611c7857fe5b9060200190602002015181525060196000601a85815481101515611c9857fe5b906000526020600020900160005b50548152602001908152602001600020600082015181556020820151600190910155505b600190910190611c3c565b5b5b505b50505050565b60025481565b60085433600160a060020a03908116911614611d0057600080fd5b6001805b60115460ff166003811115611d1557fe5b14611d1f57600080fd5b601180546002919060ff19166001836115f2565b02179055505b5b505b565b6000805b601854811015611d87576018805482908110611d5a57fe5b906000526020600020906004020160005b50600101544211611d7e57809150611d8d565b5b600101611d42565b60185491505b5090565b600f5481565b60065481565b600160a060020a0382166000908152601460205260408120548190118015611e0c5750600160a060020a0383166000908152601460209081526040808320601383528184208685529092529091206002015481548110611df957fe5b906000526020600020900160005b505482145b90505b92915050565b600b5481565b60115460ff1681565b6115fb3334610a5a565b5b565b600e545b90565b600e5481565b60045481565b600060025b60115460ff166003811115611e5a57fe5b148015611e695750600b544210155b8015611e775750600c544211155b90505b90565b6011546101009004600160a060020a031681565b601b54600090600160a060020a03166308e0d29d83836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611eec57600080fd5b6102c65a03f11515611efd57600080fd5b50505060405180519150505b919050565b6000805b6016548210156110ae5760156000601684815481101515611f2f57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000209050600081600001541115611fca57611fca601683815481101515611f9057fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660095483600001548702811515611fc357fe5b0485612435565b5b5b600190910190611f12565b5b50505050565b611fe6612517565b611fee612517565b6000806000611ffb612517565b612003612517565b600080600080600060188e81548110151561201a57fe5b906000526020600020906004020160005b5099508c98506000975060016040518059106120445750595b908082528060200260200182016040525b50965060016040518059106120675750595b908082528060200260200182016040525b5060038b015490965060ff1680156120935750601a54600090115b80156120bd5750601a805460009081106120a957fe5b906000526020600020900160005b50548d10155b1561221557600d5460028b0154601a54919003955093505b600084111561221557601a805460001986019081106120f057fe5b906000526020600020900160005b50548d106122085787151561215c578360010160405180591061211e5750595b908082528060200260200182016040525b509650836001016040518059106121435750595b908082528060200260200182016040525b509550600197505b60196000601a6001870381548110151561217257fe5b906000526020600020900160005b505481526020019081526020016000209250600954836001015486028115156121a557fe5b048a60020154019150601a600185038154811015156121c057fe5b906000526020600020900160005b505489039050808785815181106121e157fe5b60209081029091010152818685815181106121f857fe5b6020908102909101015297889003975b5b600019909301926120d5565b5b888760008151811061222457fe5b6020908102909101015260028a01548660008151811061224057fe5b906020019060200201818152505086869b509b505b505050505050505050509250929050565b6122708382611d9d565b156122a657600160a060020a0383166000908152601360209081526040808320848452909152902060010180548301905561233d565b6060604051908101604090815260008083526020808401869052600160a060020a038716825260149052819020805491830191600191908083016122ea838261255b565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b60108054830190555b505050565b6000805b6016548210156110ae576015600060168481548110151561236c57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000209050600081600101541115612421576124216016838154811015156123cd57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03166009548360010154870281151561240057fe5b60028501549190049060ff16612416578561241c565b83600301545b612266565b5b5b60019091019061234f565b5b50505050565b61243f8382611d9d565b1561247257600160a060020a03831660009081526013602090815260408083208484529091529020805483019055612509565b6060604051908101604090815283825260006020808401829052600160a060020a038716825260149052819020805491830191600191908083016124b6838261255b565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b600f8054830190555b505050565b60206040519081016040526000815290565b815481835581811511611bd157600402816004028360005260206000209182019101611bd1919061262d565b5b505050565b815481835581811511611bd157600083815260209020611bd1918101908301612667565b5b505050565b815481835581811511611bd157600202816002028360005260206000209182019101611bd19190612688565b5b505050565b8280548282559060005260206000209081019282156125f2579160200282015b828111156125f25782518255916020019190600101906125d7565b5b50611d8d929150612667565b5090565b815481835581811511611bd157600083815260209020611bd1918101908301612667565b5b505050565b611e3591905b80821115611d8d57600080825560018201819055600282015560038101805460ff19169055600401612633565b5090565b90565b611e3591905b80821115611d8d576000815560010161266d565b5090565b90565b611e3591905b80821115611d8d576000808255600182015560020161268e565b5090565b905600a165627a7a7230582088589bbc8a1182cefb50c4693e5524aedacb4305fa2b46df8862e07546c2eb0900290000000000000000000000001a0987a5c068ec6ce645bb897d8de4c82281deae0000000000000000000000000000000000000000000000000000000059e34dc00000000000000000000000004632d1c31c5d9e28e84eae0173b3afc9aca81ac80000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000175d539876d15c000000000000000000000000000000000000000000000000012413c9365097c380000000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000175d539876d15c000000000000000000000000000000000000000000000000009209e49b284be1c0000000000000000000000000000000000000000000000000001d7d843dc3b480000

Deployed Bytecode

0x606060405236156101b05763ffffffff60e060020a6000350416622f956981146101de5780630d6f849b146102035780630d70e7e3146102285780631f68f20a146102535780632095f2d414610278578063229f3e291461028d5780632d92b1c0146102b257806338af3eed146103c85780634942edf9146103f75780634d9aa42414610422578063590e1ae3146104475780635f48f3931461045c57806370a08231146104815780637252bbf2146104b25780637362377b146104e357806376c82e92146104f8578063775c300c1461051d57806383197ef0146105325780638d8f2adb146105475780638ec521a81461055c57806392099fdb1461072d57806396a049251461075e578063984c14ac1461077f5780639b2cb5d8146108505780639c5e902314610875578063a3a40ea51461088a578063b19a4540146108af578063b946fab1146108d4578063bd51d5d0146108f9578063be9a65551461092f578063c040e6b814610954578063d7bb99ba1461098b578063e29eb83614610995578063f0ea4bfc146109ba578063f1d841f1146109df578063f96c166c14610a04578063fc0c546a14610a2b575b5b32600160a060020a031633600160a060020a03161415156101d157600080fd5b6101db3334610a5a565b5b005b34156101e957600080fd5b6101f1610d93565b60405190815260200160405180910390f35b341561020e57600080fd5b6101f1610d99565b60405190815260200160405180910390f35b341561023357600080fd5b6101f1600435602435610d9f565b60405190815260200160405180910390f35b341561025e57600080fd5b6101f1610ee6565b60405190815260200160405180910390f35b341561028357600080fd5b6101db610eec565b005b341561029857600080fd5b6101f16110b6565b60405190815260200160405180910390f35b34156102bd57600080fd5b6101db600480359060446024803590810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506110bc95505050505050565b005b34156103d357600080fd5b6103db611289565b604051600160a060020a03909116815260200160405180910390f35b341561040257600080fd5b6101f1600435602435611298565b60405190815260200160405180910390f35b341561042d57600080fd5b6101f16112b7565b60405190815260200160405180910390f35b341561045257600080fd5b6101db6112bd565b005b341561046757600080fd5b6101f1611376565b60405190815260200160405180910390f35b341561048c57600080fd5b6101f1600160a060020a036004351661137c565b60405190815260200160405180910390f35b34156104bd57600080fd5b6101f1600160a060020a036004351661140c565b60405190815260200160405180910390f35b34156104ee57600080fd5b6101db61149c565b005b341561050357600080fd5b6101f1611583565b60405190815260200160405180910390f35b341561052857600080fd5b6101db611589565b005b341561053d57600080fd5b6101db6115fd565b005b341561055257600080fd5b6101db611641565b005b341561056757600080fd5b6101db600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061178595505050505050565b005b341561073857600080fd5b6101f1600160a060020a0360043516611a07565b60405190815260200160405180910390f35b341561076957600080fd5b6101db600160a060020a0360043516611a4a565b005b341561078a57600080fd5b6101db60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650611bd895505050505050565b005b341561085b57600080fd5b6101f1611cdf565b60405190815260200160405180910390f35b341561088057600080fd5b6101db611ce5565b005b341561089557600080fd5b6101f1611d3e565b60405190815260200160405180910390f35b34156108ba57600080fd5b6101f1611d91565b60405190815260200160405180910390f35b34156108df57600080fd5b6101f1611d97565b60405190815260200160405180910390f35b341561090457600080fd5b61091b600160a060020a0360043516602435611d9d565b604051901515815260200160405180910390f35b341561093a57600080fd5b6101f1611e15565b60405190815260200160405180910390f35b341561095f57600080fd5b610967611e1b565b6040518082600381111561097757fe5b60ff16815260200191505060405180910390f35b6101db611e24565b005b34156109a057600080fd5b6101f1611e31565b60405190815260200160405180910390f35b34156109c557600080fd5b6101f1611e38565b60405190815260200160405180910390f35b34156109ea57600080fd5b6101f1611e3e565b60405190815260200160405180910390f35b3415610a0f57600080fd5b61091b611e44565b604051901515815260200160405180910390f35b3415610a3657600080fd5b6103db611e7d565b604051600160a060020a03909116815260200160405180910390f35b6000806000806000610a6a612517565b610a72612517565b600080806002805b60115460ff166003811115610a8b57fe5b14610a9557600080fd5b600b544210158015610aa95750600d544211155b1515610ab457600080fd5b610abd8d611e91565b1515610ac857600080fd5b610ad0611e44565b9a508a1580610ae157506007548c10155b1515610aec57600080fd5b8a1580610afc5750600654600e54105b1515610b0757600080fd5b8a80610b1557506004548c10155b1515610b2057600080fd5b8a80610b305750600554600e5410155b1515610b3b57600080fd5b8a80610b4a5750600354600e54105b1515610b5557600080fd5b8a8015610b6757506006548c600e5401115b15610b7a57600e54600654039950610b9a565b6003548c600e54011115610b9657600e54600354039950610b9a565b8b99505b5b600e80548b0190558a15610bb957610bb48a6000611f0e565b610bd8565b600160a060020a038d16600090815260126020526040902080548b0190555b60009850610be4611d3e565b9750610bf0888b610d9f565b9650610bfc888b611fde565b95509550600093505b8551841015610caa57610c2d868581518110610c1d57fe5b9060200190602002015188611298565b925060015487118015610c54575042858581518110610c4857fe5b90602001906020020151115b15610c995760015487038784811515610c6957fe5b04029150610c8d8d83878781518110610c7e57fe5b90602001906020020151612266565b81830389019850610c9e565b978201975b5b600190930192610c05565b600089118015610d3657506011546101009004600160a060020a031663867904b48e8b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610d1957600080fd5b6102c65a03f11515610d2a57600080fd5b50505060405180519050155b15610d4057600080fd5b60008a8d03118015610d785750600160a060020a038d168a8d0380156108fc0290604051600060405180830381858888f19350505050155b15610d8257600080fd5b5b5b50505050505050505050505050565b60105481565b60055481565b60008080808060025b60115460ff166003811115610db957fe5b148015610dc85750600b544210155b15610ed6576018805488908110610ddb57fe5b906000526020600020906004020160005b508054600382015490955090935060ff168015610e0c5750601a54600090115b8015610e365750601a80546000908110610e2257fe5b906000526020600020900160005b50548610155b15610ed657601a5491505b6000821115610ed657601a80546000198401908110610e5c57fe5b906000526020600020900160005b50548610610ec95760196000601a60018503815481101515610e8857fe5b906000526020600020900160005b5054815260200190815260200160002090506009548160000154846000015402811515610ebf57fe5b0484019350610ed6565b5b60001990910190610e41565b5b5b8394505b5050505092915050565b60015481565b600080806002805b60115460ff166003811115610f0557fe5b14610f0f57600080fd5b600d54421180610f235750600354600e5410155b1515610f2e57600080fd5b600254600e541015610f3f57600080fd5b601180546003919060ff19166001835b02179055506011546101009004600160a060020a031663a69df4b56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fa157600080fd5b6102c65a03f11515610fb257600080fd5b505050604051805190501515610fc757600080fd5b6010546011546101009004600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561101757600080fd5b6102c65a03f1151561102857600080fd5b50505060405180519050019350600092505b60175483101561109557601780548490811061105257fe5b906000526020600020906002020160005b5091506110896009548360000154860281151561107c57fe5b048360010154420161234b565b5b60019092019161103a565b6110ae600f5430600160a060020a031631036000611f0e565b5b5b50505050565b600c5481565b60008054819033600160a060020a039081169116146110da57600080fd5b6000805b60115460ff1660038111156110ef57fe5b146110f957600080fd5b60018890558560008151811061110b57fe5b90602001906020020151600b54908101600c55600d55600092505b86518310156112045785838151811061113b57fe5b90602001906020020151600d8054909101905560188054600181016111608382612529565b916000526020600020906004020160005b6080604051908101604052808b888151811061118957fe5b906020019060200201518152602001600d548152602001600081526020018888815181106111b357fe5b90602001906020020151151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600190920191611126565b600091505b865182101561127c57600085838151811061122057fe5b9060200190602002015111156112705784828151811061123c57fe5b90602001906020020151600d540160188381548110151561125957fe5b906000526020600020906004020160005b50600201555b5b600190910190611209565b5b5b505b50505050505050565b600854600160a060020a031681565b600a54600090670de0b6b3a764000090848402025b0490505b92915050565b600d5481565b600d5460009042116112ce57600080fd5b6002805b60115460ff1660038111156112e357fe5b146112ed57600080fd5b600254600e54106112fd57600080fd5b600160a060020a033316600090815260126020526040812080549082905592508211801561134e5750600160a060020a03331682156108fc0283604051600060405180830381858888f19350505050155b1561136f57600160a060020a03331660009081526012602052604090208290555b5b5b505b50565b60035481565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a0384166000908152601360209081526040808320601490925282208054919291849081106113d257fe5b906000526020600020900160005b5054815260200190815260200160002060010154820191505b600101611381565b8192505b5050919050565b600080805b600160a060020a03841660009081526014602052604090205481101561140157600160a060020a03841660009081526013602090815260408083206014909252822080549192918490811061146257fe5b906000526020600020900160005b5054815260200190815260200160002060000154820191505b600101611411565b8192505b5050919050565b60008080805b600160a060020a03331660009081526014602052604090205483101561153857600160a060020a03331660009081526014602052604090208054849081106114e657fe5b906000526020600020900160005b5054915042821161152c5750600160a060020a0333166000908152601360209081526040808320848452909152812080549181559301925b5b6001909201916114a2565b60008411156110ae57600f80548590039055600160a060020a03331684156108fc0285604051600060405180830381858888f1935050505015156110ae57600080fd5b5b5b50505050565b60075481565b60005433600160a060020a039081169116146115a457600080fd5b6000805b60115460ff1660038111156115b957fe5b146115c357600080fd5b601854600090116115d357600080fd5b601654600090116115e357600080fd5b601180546001919060ff191682805b02179055505b5b505b565b60085433600160a060020a0390811691161461161857600080fd5b600d546303c26700908101421161162e57600080fd5b600854600160a060020a0316ff5b5b505b565b60008080805b600160a060020a0333166000908152601460205260409020548310156116e157600160a060020a033316600090815260146020526040902080548490811061168b57fe5b906000526020600020900160005b505491504282116116d55750600160a060020a033316600090815260136020908152604080832084845290915281206001810180549290559301925b5b600190920191611647565b60008411156110ae576010805485900390556011546101009004600160a060020a031663867904b4338660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561175757600080fd5b6102c65a03f1151561176857600080fd5b5050506040518051905015156110ae57600080fd5b5b5b50505050565b60008054819033600160a060020a039081169116146117a357600080fd5b6000805b60115460ff1660038111156117b857fe5b146117c257600080fd5b896000815181106117cf57fe5b906020019060200201516008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600092505b8951831015611969576016805460018101611826838261255b565b916000526020600020900160005b8c868151811061184057fe5b90602001906020020151909190916101000a815481600160a060020a030219169083600160a060020a031602179055505060a0604051908101604052808a858151811061188957fe5b9060200190602002015181526020018985815181106118a457fe5b9060200190602002015181526020018885815181106118bf57fe5b90602001906020020151151581526020018785815181106118dc57fe5b906020019060200201518152602001849052601560008c86815181106118fe57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000208151815560208201518160010155604082015160028201805460ff1916911515919091179055606082015181600301556080820151600490910155505b60019092019161180b565b600091505b84518210156119f85760178054600181016119898382612585565b916000526020600020906002020160005b60408051908101604052808987815181106119b157fe5b9060200190602002015181526020018887815181106119cc57fe5b90602001906020020151905291905081518155602082015181600101555050505b60019091019061196e565b5b5b505b505050505050505050565b6000600d5442118015611a1d5750600254600e54105b611a28576000611a42565b600160a060020a0382166000908152601260205260409020545b90505b919050565b600854600090819033600160a060020a03908116911614611a6a57600080fd5b6011548392506101009004600160a060020a03166396a049258360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611ac257600080fd5b6102c65a03f11515611ad357600080fd5b50505081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611b2d57600080fd5b6102c65a03f11515611b3e57600080fd5b50505060405180519150506000811115611bd157600854600160a060020a038084169163a9059cbb91168360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bb557600080fd5b6102c65a03f11515611bc657600080fd5b505050604051805150505b5b5b505050565b6000805433600160a060020a03908116911614611bf457600080fd5b6000805b60115460ff166003811115611c0957fe5b14611c1357600080fd5b60185460009011611c2357600080fd5b601a838051611c369291602001906125b7565b50600091505b601a54821015611cd5576040805190810160405280868481518110611c5d57fe5b906020019060200201518152602001858481518110611c7857fe5b9060200190602002015181525060196000601a85815481101515611c9857fe5b906000526020600020900160005b50548152602001908152602001600020600082015181556020820151600190910155505b600190910190611c3c565b5b5b505b50505050565b60025481565b60085433600160a060020a03908116911614611d0057600080fd5b6001805b60115460ff166003811115611d1557fe5b14611d1f57600080fd5b601180546002919060ff19166001836115f2565b02179055505b5b505b565b6000805b601854811015611d87576018805482908110611d5a57fe5b906000526020600020906004020160005b50600101544211611d7e57809150611d8d565b5b600101611d42565b60185491505b5090565b600f5481565b60065481565b600160a060020a0382166000908152601460205260408120548190118015611e0c5750600160a060020a0383166000908152601460209081526040808320601383528184208685529092529091206002015481548110611df957fe5b906000526020600020900160005b505482145b90505b92915050565b600b5481565b60115460ff1681565b6115fb3334610a5a565b5b565b600e545b90565b600e5481565b60045481565b600060025b60115460ff166003811115611e5a57fe5b148015611e695750600b544210155b8015611e775750600c544211155b90505b90565b6011546101009004600160a060020a031681565b601b54600090600160a060020a03166308e0d29d83836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611eec57600080fd5b6102c65a03f11515611efd57600080fd5b50505060405180519150505b919050565b6000805b6016548210156110ae5760156000601684815481101515611f2f57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000209050600081600001541115611fca57611fca601683815481101515611f9057fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660095483600001548702811515611fc357fe5b0485612435565b5b5b600190910190611f12565b5b50505050565b611fe6612517565b611fee612517565b6000806000611ffb612517565b612003612517565b600080600080600060188e81548110151561201a57fe5b906000526020600020906004020160005b5099508c98506000975060016040518059106120445750595b908082528060200260200182016040525b50965060016040518059106120675750595b908082528060200260200182016040525b5060038b015490965060ff1680156120935750601a54600090115b80156120bd5750601a805460009081106120a957fe5b906000526020600020900160005b50548d10155b1561221557600d5460028b0154601a54919003955093505b600084111561221557601a805460001986019081106120f057fe5b906000526020600020900160005b50548d106122085787151561215c578360010160405180591061211e5750595b908082528060200260200182016040525b509650836001016040518059106121435750595b908082528060200260200182016040525b509550600197505b60196000601a6001870381548110151561217257fe5b906000526020600020900160005b505481526020019081526020016000209250600954836001015486028115156121a557fe5b048a60020154019150601a600185038154811015156121c057fe5b906000526020600020900160005b505489039050808785815181106121e157fe5b60209081029091010152818685815181106121f857fe5b6020908102909101015297889003975b5b600019909301926120d5565b5b888760008151811061222457fe5b6020908102909101015260028a01548660008151811061224057fe5b906020019060200201818152505086869b509b505b505050505050505050509250929050565b6122708382611d9d565b156122a657600160a060020a0383166000908152601360209081526040808320848452909152902060010180548301905561233d565b6060604051908101604090815260008083526020808401869052600160a060020a038716825260149052819020805491830191600191908083016122ea838261255b565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b60108054830190555b505050565b6000805b6016548210156110ae576015600060168481548110151561236c57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000209050600081600101541115612421576124216016838154811015156123cd57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03166009548360010154870281151561240057fe5b60028501549190049060ff16612416578561241c565b83600301545b612266565b5b5b60019091019061234f565b5b50505050565b61243f8382611d9d565b1561247257600160a060020a03831660009081526013602090815260408083208484529091529020805483019055612509565b6060604051908101604090815283825260006020808401829052600160a060020a038716825260149052819020805491830191600191908083016124b6838261255b565b916000526020600020900160005b50859055039052600160a060020a0384166000908152601360209081526040808320858452909152902081518155602082015181600101556040820151600290910155505b600f8054830190555b505050565b60206040519081016040526000815290565b815481835581811511611bd157600402816004028360005260206000209182019101611bd1919061262d565b5b505050565b815481835581811511611bd157600083815260209020611bd1918101908301612667565b5b505050565b815481835581811511611bd157600202816002028360005260206000209182019101611bd19190612688565b5b505050565b8280548282559060005260206000209081019282156125f2579160200282015b828111156125f25782518255916020019190600101906125d7565b5b50611d8d929150612667565b5090565b815481835581811511611bd157600083815260209020611bd1918101908301612667565b5b505050565b611e3591905b80821115611d8d57600080825560018201819055600282015560038101805460ff19169055600401612633565b5090565b90565b611e3591905b80821115611d8d576000815560010161266d565b5090565b90565b611e3591905b80821115611d8d576000808255600182015560020161268e565b5090565b905600a165627a7a7230582088589bbc8a1182cefb50c4693e5524aedacb4305fa2b46df8862e07546c2eb090029

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

0000000000000000000000001a0987a5c068ec6ce645bb897d8de4c82281deae0000000000000000000000000000000000000000000000000000000059e34dc00000000000000000000000004632d1c31c5d9e28e84eae0173b3afc9aca81ac80000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000175d539876d15c000000000000000000000000000000000000000000000000012413c9365097c380000000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000175d539876d15c000000000000000000000000000000000000000000000000009209e49b284be1c0000000000000000000000000000000000000000000000000001d7d843dc3b480000

-----Decoded View---------------
Arg [0] : _whitelist (address): 0x1a0987A5c068EC6ce645bB897d8DE4c82281deAe
Arg [1] : _start (uint256): 1508068800
Arg [2] : _token (address): 0x4632d1c31c5D9E28E84eAE0173B3aFc9acA81aC8
Arg [3] : _tokenDenominator (uint256): 100000000
Arg [4] : _percentageDenominator (uint256): 10000
Arg [5] : _minAmount (uint256): 6896000000000000000000
Arg [6] : _maxAmount (uint256): 86206000000000000000000
Arg [7] : _minAcceptedAmount (uint256): 40000000000000000
Arg [8] : _minAmountPresale (uint256): 6896000000000000000000
Arg [9] : _maxAmountPresale (uint256): 43103000000000000000000
Arg [10] : _minAcceptedAmountPresale (uint256): 34000000000000000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a0987a5c068ec6ce645bb897d8de4c82281deae
Arg [1] : 0000000000000000000000000000000000000000000000000000000059e34dc0
Arg [2] : 0000000000000000000000004632d1c31c5d9e28e84eae0173b3afc9aca81ac8
Arg [3] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 000000000000000000000000000000000000000000000175d539876d15c00000
Arg [6] : 0000000000000000000000000000000000000000000012413c9365097c380000
Arg [7] : 000000000000000000000000000000000000000000000000008e1bc9bf040000
Arg [8] : 000000000000000000000000000000000000000000000175d539876d15c00000
Arg [9] : 0000000000000000000000000000000000000000000009209e49b284be1c0000
Arg [10] : 000000000000000000000000000000000000000000000001d7d843dc3b480000


Swarm Source

bzzr://88589bbc8a1182cefb50c4693e5524aedacb4305fa2b46df8862e07546c2eb09
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.