ETH Price: $3,211.58 (+1.27%)

Contract

0x4863E8c8BD928BD1Cf85EeA784736E35c2F48a6A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer137932382021-12-12 23:00:111067 days ago1639350011IN
Blok: Token Sale
0.45735523 ETH0.0015348473.08780828
Transfer137932032021-12-12 22:52:231067 days ago1639349543IN
Blok: Token Sale
0.45782029 ETH0.0012938761.61288631
Finalize55879792018-05-10 7:00:062380 days ago1525935606IN
Blok: Token Sale
0 ETH0.0002499613
Grant Tokens55879752018-05-10 6:57:592380 days ago1525935479IN
Blok: Token Sale
0 ETH0.002055113
Transfer55851492018-05-09 19:04:182380 days ago1525892658IN
Blok: Token Sale
0.013 ETH0.000362484
Transfer55714472018-05-07 10:12:282382 days ago1525687948IN
Blok: Token Sale
0.1 ETH0.0037154641
Transfer55651192018-05-06 7:54:452384 days ago1525593285IN
Blok: Token Sale
0.06 ETH0.0027186330
Set Tier1Partici...55615632018-05-05 17:04:462384 days ago1525539886IN
Blok: Token Sale
0 ETH0.000179594
Transfer55020742018-04-25 7:48:522395 days ago1524642532IN
Blok: Token Sale
0.2 ETH0.0037154641
Transfer54995372018-04-24 21:15:022395 days ago1524604502IN
Blok: Token Sale
0.02 ETH0.000090621
Set Tier1Partici...54510682018-04-16 13:08:092403 days ago1523884089IN
Blok: Token Sale
0 ETH0.000036571
Set Tier1Partici...54510632018-04-16 13:06:152403 days ago1523883975IN
Blok: Token Sale
0 ETH0.000036571
Set Tier1Partici...54510592018-04-16 13:05:582403 days ago1523883958IN
Blok: Token Sale
0 ETH0.000066571
Transfer54462822018-04-15 17:47:522404 days ago1523814472IN
Blok: Token Sale
0.05 ETH0.0027186330
Transfer54462542018-04-15 17:41:352404 days ago1523814095IN
Blok: Token Sale
0.06 ETH0.001869925
Transfer54234652018-04-11 21:16:142408 days ago1523481374IN
Blok: Token Sale
0.2 ETH0.0019030421
Transfer54164112018-04-10 16:55:182409 days ago1523379318IN
Blok: Token Sale
1 ETH0.0027186330
Transfer54149932018-04-10 11:17:402409 days ago1523359060IN
Blok: Token Sale
1 ETH0.0037154641
Set Tier1Partici...54138222018-04-10 6:38:092410 days ago1523342289IN
Blok: Token Sale
0 ETH0.000044891
Set Tier1Partici...54133632018-04-10 4:52:292410 days ago1523335949IN
Blok: Token Sale
0 ETH0.000133152
Set Tier1Partici...54132712018-04-10 4:31:022410 days ago1523334662IN
Blok: Token Sale
0 ETH0.000089792
Transfer54132482018-04-10 4:25:342410 days ago1523334334IN
Blok: Token Sale
2 ETH0.000181242
Transfer54131882018-04-10 4:16:072410 days ago1523333767IN
Blok: Token Sale
2 ETH0.0005911823.45970073
Transfer54128162018-04-10 2:47:072410 days ago1523328427IN
Blok: Token Sale
0.022 ETH0.000090621
Transfer54128142018-04-10 2:45:472410 days ago1523328347IN
Blok: Token Sale
0.10390937 ETH0.000090621
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
55851492018-05-09 19:04:182380 days ago1525892658
Blok: Token Sale
0.013 ETH
55714472018-05-07 10:12:282382 days ago1525687948
Blok: Token Sale
0.1 ETH
55651192018-05-06 7:54:452384 days ago1525593285
Blok: Token Sale
0.06 ETH
55020742018-04-25 7:48:522395 days ago1524642532
Blok: Token Sale
0.2 ETH
54995372018-04-24 21:15:022395 days ago1524604502
Blok: Token Sale
0.02 ETH
54462822018-04-15 17:47:522404 days ago1523814472
Blok: Token Sale
0.05 ETH
54462542018-04-15 17:41:352404 days ago1523814095
Blok: Token Sale
0.06 ETH
54234652018-04-11 21:16:142408 days ago1523481374
Blok: Token Sale
0.2 ETH
54164112018-04-10 16:55:182409 days ago1523379318
Blok: Token Sale
1 ETH
54149932018-04-10 11:17:402409 days ago1523359060
Blok: Token Sale
1 ETH
54132482018-04-10 4:25:342410 days ago1523334334
Blok: Token Sale
2 ETH
54128162018-04-10 2:47:072410 days ago1523328427
Blok: Token Sale
0.022 ETH
54128142018-04-10 2:45:472410 days ago1523328347
Blok: Token Sale
0.10390937 ETH
54127732018-04-10 2:37:432410 days ago1523327863
Blok: Token Sale
0.13490937 ETH
54127442018-04-10 2:30:442410 days ago1523327444
Blok: Token Sale
0.16390937 ETH
54127242018-04-10 2:25:512410 days ago1523327151
Blok: Token Sale
0.18790937 ETH
54127082018-04-10 2:22:372410 days ago1523326957
Blok: Token Sale
0.21390937 ETH
54126942018-04-10 2:18:242410 days ago1523326704
Blok: Token Sale
0.218 ETH
54126932018-04-10 2:18:032410 days ago1523326683
Blok: Token Sale
0.218 ETH
54126882018-04-10 2:17:062410 days ago1523326626
Blok: Token Sale
0.218 ETH
54126732018-04-10 2:12:502410 days ago1523326370
Blok: Token Sale
0.218 ETH
54126702018-04-10 2:12:022410 days ago1523326322
Blok: Token Sale
0.218 ETH
54126682018-04-10 2:11:032410 days ago1523326263
Blok: Token Sale
0.218 ETH
54126622018-04-10 2:09:502410 days ago1523326190
Blok: Token Sale
0.218 ETH
54126562018-04-10 2:08:522410 days ago1523326132
Blok: Token Sale
0.218 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BlokTokenSale

Compiler Version
v0.4.13+commit.fb4cb1a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.13;

contract ERC20 {
    uint256 public totalSupply;
    function balanceOf(address _owner) constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
    function approve(address _spender, uint256 _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract BasicToken is ERC20 {
    using SafeMath for uint256;

    uint256 public totalSupply;
    mapping (address => mapping (address => uint256)) allowed;
    mapping (address => uint256) balances;

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    /// @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
    /// @param _spender address The address which will spend the funds.
    /// @param _value uint256 The amount of tokens to be spent.
    function approve(address _spender, uint256 _value) public returns (bool) {
        // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
        if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) {
            revert();
        }

        allowed[msg.sender][_spender] = _value;

        Approval(msg.sender, _spender, _value);

        return true;
    }

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


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

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

        Transfer(msg.sender, _to, _value);

        return true;
    }

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

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);

        allowed[_from][msg.sender] = _allowance.sub(_value);

        Transfer(_from, _to, _value);

        return true;
    }
}

contract Ownable {
    address public owner;
    address public newOwnerCandidate;

    event OwnershipRequested(address indexed _by, address indexed _to);
    event OwnershipTransferred(address indexed _from, address indexed _to);

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

    /// @dev Reverts if called by any account other than the owner.
    modifier onlyOwner() {
        if (msg.sender != owner) {
            revert();
        }

        _;
    }

    modifier onlyOwnerCandidate() {
        if (msg.sender != newOwnerCandidate) {
            revert();
        }

        _;
    }

    /// @dev Proposes to transfer control of the contract to a newOwnerCandidate.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    function requestOwnershipTransfer(address _newOwnerCandidate) external onlyOwner {
        require(_newOwnerCandidate != address(0));

        newOwnerCandidate = _newOwnerCandidate;

        OwnershipRequested(msg.sender, newOwnerCandidate);
    }

    /// @dev Accept ownership transfer. This method needs to be called by the previously proposed owner.
    function acceptOwnership() external onlyOwnerCandidate {
        address previousOwner = owner;

        owner = newOwnerCandidate;
        newOwnerCandidate = address(0);

        OwnershipTransferred(previousOwner, owner);
    }
}

library SafeMath {
    function mul(uint256 a, uint256 b) internal returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

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

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

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

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

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

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

contract TokenHolder is Ownable {
    /// @dev Allow the owner to transfer out any accidentally sent ERC20 tokens.
    /// @param _tokenAddress address The address of the ERC20 contract.
    /// @param _amount uint256 The amount of tokens to be transferred.
    function transferAnyERC20Token(address _tokenAddress, uint256 _amount) onlyOwner returns (bool success) {
        return ERC20(_tokenAddress).transfer(owner, _amount);
    }
}

contract BlokToken is Ownable, BasicToken, TokenHolder {
    using SafeMath for uint256;

    string public constant name = "Blok";
    string public constant symbol = "BLO";

    // Using same decimal value as ETH (makes ETH-BLO conversion much easier).
    uint8 public constant decimals = 18;

    // States whether creating more tokens is allowed or not.
    // Used during token sale.
    bool public isMinting = true;

    event MintingEnded();

    modifier onlyDuringMinting() {
        require(isMinting);

        _;
    }

    modifier onlyAfterMinting() {
        require(!isMinting);

        _;
    }

    /// @dev Mint Blok tokens.
    /// @param _to address Address to send minted Blok to.
    /// @param _amount uint256 Amount of Blok tokens to mint.
    function mint(address _to, uint256 _amount) external onlyOwner onlyDuringMinting {
        totalSupply = totalSupply.add(_amount);
        balances[_to] = balances[_to].add(_amount);

        Transfer(0x0, _to, _amount);
    }

    /// @dev End minting mode.
    function endMinting() external onlyOwner {
        if (isMinting == false) {
            return;
        }

        isMinting = false;

        MintingEnded();
    }

    /// @dev Same ERC20 behavior, but reverts if still minting.
    /// @param _spender address The address which will spend the funds.
    /// @param _value uint256 The amount of tokens to be spent.
    function approve(address _spender, uint256 _value) public onlyAfterMinting returns (bool) {
        return super.approve(_spender, _value);
    }

    /// @dev Same ERC20 behavior, but reverts if still minting.
    /// @param _to address The address to transfer to.
    /// @param _value uint256 The amount to be transferred.
    function transfer(address _to, uint256 _value) public onlyAfterMinting returns (bool) {
        return super.transfer(_to, _value);
    }

    /// @dev Same ERC20 behavior, but reverts if still minting.
    /// @param _from address The address which you want to send tokens from.
    /// @param _to address The address which you want to transfer to.
    /// @param _value uint256 the amount of tokens to be transferred.
    function transferFrom(address _from, address _to, uint256 _value) public onlyAfterMinting returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }
}

contract BlokTokenSale is Ownable, TokenHolder {
    using SafeMath for uint256;

    // External parties:

    // BLO token contract.
    BlokToken public blok;

    // Vesting contract for pre-sale participants.
    VestingTrustee public trustee;

    // Received funds are forwarded to this address.
    address public fundingRecipient;

    // Blok token unit.
    // Using same decimal value as ETH (makes ETH-BLO conversion much easier).
    // This is the same as in Blok token contract.
    uint256 public constant TOKEN_UNIT = 10 ** 18;

    // Maximum number of tokens in circulation: 10 trillion.
    uint256 public constant MAX_TOKENS = 360000000 * TOKEN_UNIT;

    // Maximum tokens offered in the sale.
    uint256 public constant MAX_TOKENS_SOLD = 234000000 * TOKEN_UNIT;

    // BLO to 1 wei ratio.
    uint256 public constant BLO_PER_WEI = 5700;

    // Sale start and end timestamps.
    uint256 public constant SALE_DURATION = 30 days;
    uint256 public startTime;
    uint256 public endTime;

    // Amount of tokens sold until now in the sale.
    uint256 public tokensSold = 0;

    // Participation caps, according to KYC tiers.
    uint256 public constant TIER_1_CAP = 20000 ether; // Maximum uint256 value

    // Accumulated amount each participant has contributed so far.
    mapping (address => uint256) public participationHistory;

    // Maximum amount that each participant is allowed to contribute (in WEI).
    mapping (address => uint256) public participationCaps;

    // Maximum amount ANYBODY is currently allowed to contribute.
    uint256 public hardParticipationCap = uint256(-1);

    // Vesting information for special addresses:
    struct TokenGrant {
        uint256 value;
        uint256 startOffset;
        uint256 cliffOffset;
        uint256 endOffset;
        uint256 installmentLength;
        uint8 percentVested;
    }

    address[] public tokenGrantees;
    mapping (address => TokenGrant) public tokenGrants;
    uint256 public lastGrantedIndex = 0;
    uint256 public constant MAX_TOKEN_GRANTEES = 100;
    uint256 public constant GRANT_BATCH_SIZE = 10;

    address public constant RESERVE_TOKENS = 0xA67E1c56A5e0363B61a23670FFC0FcD8F09f178d;
    address public constant TEAM_WALLET = 0x52aA6A62404107742ac01Ff247ED47b49b16c40A;
    address public constant BOUNTY_WALLET = 0xCf1e64Ce2740A03192F1d7a3234AABd88c025c4B;    

    event TokensIssued(address indexed _to, uint256 _tokens);

    /// @dev Reverts if called when not during sale.
    modifier onlyDuringSale() {
        require(!saleEnded() && now >= startTime);

        _;
    }

    /// @dev Reverts if called before sale ends.
    modifier onlyAfterSale() {
        require(saleEnded());

        _;
    }

    /// @dev Constructor that initializes the sale conditions.
    /// @param _fundingRecipient address The address of the funding recipient.
    /// @param _startTime uint256 The start time of the token sale.
    function BlokTokenSale(address _fundingRecipient, uint256 _startTime) {
        require(_fundingRecipient != address(0));
        require(_startTime > now);

        // Deploy new BlokToken contract.
        blok = new BlokToken();

        // Deploy new VestingTrustee contract.
        trustee = new VestingTrustee(blok);

        fundingRecipient = _fundingRecipient;
        startTime = _startTime;
        endTime = startTime + SALE_DURATION;

        // Initialize special vesting grants.
        initTokenGrants();
    }

    /// @dev Initialize token grants.
    function initTokenGrants() private onlyOwner {
        tokenGrantees.push(RESERVE_TOKENS);
        tokenGrants[RESERVE_TOKENS] = TokenGrant(MAX_TOKENS.mul(18).div(100), 0, 0, 10 days, 1 days, 0);

        tokenGrantees.push(TEAM_WALLET);
        tokenGrants[TEAM_WALLET] = TokenGrant(MAX_TOKENS.mul(13).div(100), 0, 0, 10 days, 1 days, 0);

        tokenGrantees.push(BOUNTY_WALLET);
        tokenGrants[BOUNTY_WALLET] = TokenGrant(MAX_TOKENS.mul(4).div(100), 0, 0, 10 days, 1 days, 0);
    }

    /// @dev Adds a Blok token vesting grant.
    /// @param _grantee address The address of the token grantee. Can be granted only once.
    /// @param _value uint256 The value of the grant.
    function addTokenGrant(address _grantee, uint256 _value) external onlyOwner {
        require(_grantee != address(0));
        require(_value > 0);
        require(tokenGrantees.length + 1 <= MAX_TOKEN_GRANTEES);

        // Verify the grant doesn't already exist.
        require(tokenGrants[_grantee].value == 0);
        for (uint i = 0; i < tokenGrantees.length; i++) {
            require(tokenGrantees[i] != _grantee);
        }

        // Add grant and add to grantee list.
        tokenGrantees.push(_grantee);
        tokenGrants[_grantee] = TokenGrant(_value, 0, 1 years, 1 years, 1 days, 50);
    }

    /// @dev Deletes a Blok token grant.
    /// @param _grantee address The address of the token grantee.
    function deleteTokenGrant(address _grantee) external onlyOwner {
        require(_grantee != address(0));

        // Delete the grant from the keys array.
        for (uint i = 0; i < tokenGrantees.length; i++) {
            if (tokenGrantees[i] == _grantee) {
                delete tokenGrantees[i];

                break;
            }
        }

        // Delete the grant from the mapping.
        delete tokenGrants[_grantee];
    }

    /// @dev Add a list of participants to a capped participation tier.
    /// @param _participants address[] The list of participant addresses.
    /// @param _cap uint256 The cap amount (in ETH).
    function setParticipationCap(address[] _participants, uint256 _cap) private onlyOwner {
        for (uint i = 0; i < _participants.length; i++) {
            participationCaps[_participants[i]] = _cap;
        }
    }

    /// @dev Add a list of participants to cap tier #1.
    /// @param _participants address[] The list of participant addresses.
    function setTier1Participants(address[] _participants) external onlyOwner {
        setParticipationCap(_participants, TIER_1_CAP);
    }

    /// @dev Set hard participation cap for all participants.
    /// @param _cap uint256 The hard cap amount.
    function setHardParticipationCap(uint256 _cap) external onlyOwner {
        require(_cap > 0);

        hardParticipationCap = _cap;
    }

    /// @dev Fallback function that will delegate the request to create().
    function () external payable onlyDuringSale {
        create(msg.sender);
    }

    /// @dev Create and sell tokens to the caller.
    /// @param _recipient address The address of the recipient receiving the tokens.
    function create(address _recipient) public payable onlyDuringSale {
        require(_recipient != address(0));

        // Enforce participation cap (in Wei received).
        uint256 weiAlreadyParticipated = participationHistory[msg.sender];
        uint256 participationCap = SafeMath.min256(TOKEN_UNIT.mul(15).add(participationCaps[msg.sender]), hardParticipationCap);
        uint256 cappedWeiReceived = SafeMath.min256(msg.value, participationCap.sub(weiAlreadyParticipated));
        require(cappedWeiReceived > 0);

        // Accept funds and transfer to funding recipient.
        uint256 weiLeftInSale = MAX_TOKENS_SOLD.sub(tokensSold).div(BLO_PER_WEI);
        uint256 weiToParticipate = SafeMath.min256(cappedWeiReceived, weiLeftInSale);
        participationHistory[msg.sender] = weiAlreadyParticipated.add(weiToParticipate);
        fundingRecipient.transfer(weiToParticipate);

        // Issue tokens and transfer to recipient.
        uint256 tokensLeftInSale = MAX_TOKENS_SOLD.sub(tokensSold);
        uint256 tokensToIssue = weiToParticipate.mul(BLO_PER_WEI);
        if (tokensLeftInSale.sub(tokensToIssue) < BLO_PER_WEI) {
            // If purchase would cause less than BLO_PER_WEI tokens left then nobody could ever buy them.
            // So, gift them to the last buyer.
            tokensToIssue = tokensLeftInSale;
        }
        tokensSold = tokensSold.add(tokensToIssue);
        issueTokens(_recipient, tokensToIssue);

        // Partial refund if full participation not possible
        // e.g. due to cap being reached.
        uint256 refund = msg.value.sub(weiToParticipate);
        if (refund > 0) {
            msg.sender.transfer(refund);
        }
    }

    /// @dev Finalizes the token sale event, by stopping token minting.
    function finalize() external onlyAfterSale onlyOwner {
        if (!blok.isMinting()) {
            revert();
        }

        require(lastGrantedIndex == tokenGrantees.length);

        // Finish minting.
        blok.endMinting();
    }

    /// @dev Grants pre-configured token grants in batches. When the method is called, it'll resume from the last grant,
    /// from its previous run, and will finish either after granting GRANT_BATCH_SIZE grants or finishing the whole list
    /// of grants.
    function grantTokens() external onlyAfterSale onlyOwner {
        uint endIndex = SafeMath.min256(tokenGrantees.length, lastGrantedIndex + GRANT_BATCH_SIZE);
        for (uint i = lastGrantedIndex; i < endIndex; i++) {
            address grantee = tokenGrantees[i];

            // Calculate how many tokens have been granted, vested, and issued such that: granted = vested + issued.
            TokenGrant memory tokenGrant = tokenGrants[grantee];
            uint256 tokensGranted = tokenGrant.value;
            uint256 tokensVesting = tokensGranted.mul(tokenGrant.percentVested).div(100);
            uint256 tokensIssued = tokensGranted.sub(tokensVesting);

            // Transfer issued tokens that have yet to be transferred to grantee.
            if (tokensIssued > 0) {
                issueTokens(grantee, tokensIssued);
            }

            // Transfer vested tokens that have yet to be transferred to vesting trustee, and initialize grant.
            if (tokensVesting > 0) {
                issueTokens(trustee, tokensVesting);
                trustee.grant(grantee, tokensVesting, now.add(tokenGrant.startOffset), now.add(tokenGrant.cliffOffset),
                    now.add(tokenGrant.endOffset), tokenGrant.installmentLength, true);
            }

            lastGrantedIndex++;
        }
    }

    /// @dev Issues tokens for the recipient.
    /// @param _recipient address The address of the recipient.
    /// @param _tokens uint256 The amount of tokens to issue.
    function issueTokens(address _recipient, uint256 _tokens) private {
        // Request Blok token contract to mint the requested tokens for the buyer.
        blok.mint(_recipient, _tokens);

        TokensIssued(_recipient, _tokens);
    }

    /// @dev Returns whether the sale has ended.
    /// @return bool Whether the sale has ended or not.
    function saleEnded() private constant returns (bool) {
        return tokensSold >= MAX_TOKENS_SOLD || now >= endTime;
    }

    /// @dev Requests to transfer control of the Blok token contract to a new owner.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    ///
    /// NOTE:
    ///   1. The new owner will need to call Blok token contract's acceptOwnership directly in order to accept the ownership.
    ///   2. Calling this method during the token sale will prevent the token sale to continue, since only the owner of
    ///      the Blok token contract can issue new tokens.
    function requestBlokTokenOwnershipTransfer(address _newOwnerCandidate) external onlyOwner {
        blok.requestOwnershipTransfer(_newOwnerCandidate);
    }

    /// @dev Accepts new ownership on behalf of the Blok token contract.
    // This can be used by the sale contract itself to claim back ownership of the Blok token contract.
    function acceptBlokTokenOwnership() external onlyOwner {
        blok.acceptOwnership();
    }

    /// @dev Requests to transfer control of the VestingTrustee contract to a new owner.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    ///
    /// NOTE:
    ///   1. The new owner will need to call VestingTrustee's acceptOwnership directly in order to accept the ownership.
    ///   2. Calling this method during the token sale will prevent the token sale from finalizaing, since only the owner
    ///      of the VestingTrustee contract can issue new token grants.
    function requestVestingTrusteeOwnershipTransfer(address _newOwnerCandidate) external onlyOwner {
        trustee.requestOwnershipTransfer(_newOwnerCandidate);
    }

    /// @dev Accepts new ownership on behalf of the VestingTrustee contract.
    /// This can be used by the token sale contract itself to claim back ownership of the VestingTrustee contract.
    function acceptVestingTrusteeOwnership() external onlyOwner {
        trustee.acceptOwnership();
    }
}

contract VestingTrustee is Ownable {
    using SafeMath for uint256;

    // Blok token contract.
    BlokToken public blok;

    // Vesting grant for a speicifc holder.
    struct Grant {
        uint256 value;
        uint256 start;
        uint256 cliff;
        uint256 end;
        uint256 installmentLength; // In seconds.
        uint256 transferred;
        bool revokable;
    }

    // Holder to grant information mapping.
    mapping (address => Grant) public grants;

    // Total tokens available for vesting.
    uint256 public totalVesting;

    event NewGrant(address indexed _from, address indexed _to, uint256 _value);
    event TokensUnlocked(address indexed _to, uint256 _value);
    event GrantRevoked(address indexed _holder, uint256 _refund);

    /// @dev Constructor that initializes the address of the Blok token contract.
    /// @param _blok BlokToken The address of the previously deployed Blok token contract.
    function VestingTrustee(BlokToken _blok) {
        require(_blok != address(0));

        blok = _blok;
    }

    /// @dev Grant tokens to a specified address.
    /// @param _to address The holder address.
    /// @param _value uint256 The amount of tokens to be granted.
    /// @param _start uint256 The beginning of the vesting period.
    /// @param _cliff uint256 Duration of the cliff period (when the first installment is made).
    /// @param _end uint256 The end of the vesting period.
    /// @param _installmentLength uint256 The length of each vesting installment (in seconds).
    /// @param _revokable bool Whether the grant is revokable or not.
    function grant(address _to, uint256 _value, uint256 _start, uint256 _cliff, uint256 _end,
        uint256 _installmentLength, bool _revokable)
        external onlyOwner {

        require(_to != address(0));
        require(_to != address(this)); // Don't allow holder to be this contract.
        require(_value > 0);

        // Require that every holder can be granted tokens only once.
        require(grants[_to].value == 0);

        // Require for time ranges to be consistent and valid.
        require(_start <= _cliff && _cliff <= _end);

        // Require installment length to be valid and no longer than (end - start).
        require(_installmentLength > 0 && _installmentLength <= _end.sub(_start));

        // Grant must not exceed the total amount of tokens currently available for vesting.
        require(totalVesting.add(_value) <= blok.balanceOf(address(this)));

        // Assign a new grant.
        grants[_to] = Grant({
            value: _value,
            start: _start,
            cliff: _cliff,
            end: _end,
            installmentLength: _installmentLength,
            transferred: 0,
            revokable: _revokable
        });

        // Since tokens have been granted, reduce the total amount available for vesting.
        totalVesting = totalVesting.add(_value);

        NewGrant(msg.sender, _to, _value);
    }

    /// @dev Revoke the grant of tokens of a specifed address.
    /// @param _holder The address which will have its tokens revoked.
    function revoke(address _holder) public onlyOwner {
        Grant memory grant = grants[_holder];

        // Grant must be revokable.
        require(grant.revokable);

        // Calculate amount of remaining tokens that are still available to be
        // returned to owner.
        uint256 refund = grant.value.sub(grant.transferred);

        // Remove grant information.
        delete grants[_holder];

        // Update total vesting amount and transfer previously calculated tokens to owner.
        totalVesting = totalVesting.sub(refund);
        blok.transfer(msg.sender, refund);

        GrantRevoked(_holder, refund);
    }

    /// @dev Calculate the total amount of vested tokens of a holder at a given time.
    /// @param _holder address The address of the holder.
    /// @param _time uint256 The specific time to calculate against.
    /// @return a uint256 Representing a holder's total amount of vested tokens.
    function vestedTokens(address _holder, uint256 _time) external constant returns (uint256) {
        Grant memory grant = grants[_holder];
        if (grant.value == 0) {
            return 0;
        }

        return calculateVestedTokens(grant, _time);
    }

    /// @dev Calculate amount of vested tokens at a specifc time.
    /// @param _grant Grant The vesting grant.
    /// @param _time uint256 The time to be checked
    /// @return a uint256 Representing the amount of vested tokens of a specific grant.
    function calculateVestedTokens(Grant _grant, uint256 _time) private constant returns (uint256) {
        // If we're before the cliff, then nothing is vested.
        if (_time < _grant.cliff) {
            return 0;
        }

        // If we're after the end of the vesting period - everything is vested;
        if (_time >= _grant.end) {
            return _grant.value;
        }

        // Calculate amount of installments past until now.
        //
        // NOTE result gets floored because of integer division.
        uint256 installmentsPast = _time.sub(_grant.start).div(_grant.installmentLength);

        // Calculate amount of days in entire vesting period.
        uint256 vestingDays = _grant.end.sub(_grant.start);

        // Calculate and return installments that have passed according to vesting days that have passed.
        return _grant.value.mul(installmentsPast.mul(_grant.installmentLength)).div(vestingDays);
    }

    /// @dev Unlock vested tokens and transfer them to their holder.
    /// @return a uint256 Representing the amount of vested tokens transferred to their holder.
    function unlockVestedTokens() external {
        Grant storage grant = grants[msg.sender];

        // Require that there will be funds left in grant to tranfser to holder.
        require(grant.value != 0);

        // Get the total amount of vested tokens, acccording to grant.
        uint256 vested = calculateVestedTokens(grant, now);
        if (vested == 0) {
            return;
        }

        // Make sure the holder doesn't transfer more than what he already has.
        uint256 transferable = vested.sub(grant.transferred);
        if (transferable == 0) {
            return;
        }

        // Update transferred and total vesting amount, then transfer remaining vested funds to holder.
        grant.transferred = grant.transferred.add(transferable);
        totalVesting = totalVesting.sub(transferable);
        blok.transfer(msg.sender, transferable);

        TokensUnlocked(msg.sender, transferable);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"lastGrantedIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestOwnershipTransfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKENS_SOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestBlokTokenOwnershipTransfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TEAM_WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"blok","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"grantTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_grantee","type":"address"}],"name":"deleteTokenGrant","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"participationHistory","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_cap","type":"uint256"}],"name":"setHardParticipationCap","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hardParticipationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"SALE_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"participationCaps","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TIER_1_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKEN_GRANTEES","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptBlokTokenOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"create","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_participants","type":"address[]"}],"name":"setTier1Participants","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_UNIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"BLO_PER_WEI","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenGrants","outputs":[{"name":"value","type":"uint256"},{"name":"startOffset","type":"uint256"},{"name":"cliffOffset","type":"uint256"},{"name":"endOffset","type":"uint256"},{"name":"installmentLength","type":"uint256"},{"name":"percentVested","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_grantee","type":"address"},{"name":"_value","type":"uint256"}],"name":"addTokenGrant","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestVestingTrusteeOwnershipTransfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"RESERVE_TOKENS","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptVestingTrusteeOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"newOwnerCandidate","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenGrantees","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"BOUNTY_WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"GRANT_BATCH_SIZE","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"trustee","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_fundingRecipient","type":"address"},{"name":"_startTime","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokens","type":"uint256"}],"name":"TokensIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526000600755600019600a556000600d5534156200002057600080fd5b60405160408062003b5483398101604052808051919060200180519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a03821615156200007257600080fd5b4281116200007f57600080fd5b62000089620005b9565b604051809103906000f0801515620000a057600080fd5b60028054600160a060020a031916600160a060020a03928316179081905516620000c9620005ca565b600160a060020a039091168152602001604051809103906000f0801515620000f057600080fd5b60038054600160a060020a0319908116600160a060020a039384161790915560048054909116918416919091179055600581905562278d008101600655620001456401000000006200014e8102620018581704565b5b50506200062c565b60005433600160a060020a039081169116146200016a57600080fd5b600b8054600181016200017e8382620005db565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9091021790555060c0604051908101604052806200020c6064620001f76b0129c8f71ad02e2a680000006012640100000000620016236200056a82021704565b906401000000006200169d6200059c82021704565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9052600c90527fcd72efd5a552ae8b00e80f47cc5c15519eb33b2275d1356fad767525313d6cfc815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101620002d28382620005db565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167352aa6a62404107742ac01ff247ed47b49b16c40a9091021790555060c060405190810160405280620003606064620001f76b0129c8f71ad02e2a68000000600d640100000000620016236200056a82021704565b906401000000006200169d6200059c82021704565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a09092018190527352aa6a62404107742ac01ff247ed47b49b16c40a9052600c90527f5f419449e46e991718ec28a3ebc27fdb5d7a78821599a3815e22121d1f646f64815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101620004268382620005db565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673cf1e64ce2740a03192f1d7a3234aabd88c025c4b9091021790555060c060405190810160405280620004b46064620001f76b0129c8f71ad02e2a680000006004640100000000620016236200056a82021704565b906401000000006200169d6200059c82021704565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273cf1e64ce2740a03192f1d7a3234aabd88c025c4b9052600c90527fa4dae35cfd6005e9263f99ea9d6b696013c9155b5f35b1c48c1a1773c4aa9ae5815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b565b60008282028315806200058857508284828115156200058557fe5b04145b15156200059157fe5b8091505b5092915050565b6000808284811515620005ab57fe5b0490508091505b5092915050565b604051610c16806200229983390190565b604051610ca58062002eaf83390190565b81548183558181151162000602576000838152602090206200060291810190830162000608565b5b505050565b6200062991905b808211156200062557600081556001016200060f565b5090565b90565b611c5d806200063c6000396000f300606060405236156101c75763ffffffff60e060020a6000350416630423974381146101fc5780630952c5041461022157806317f5de95146102425780631bb534ba1461026757806329dd0d7d146102965780632b905bf6146102b75780633097f94c146102e65780633197cbb61461031557806334fa37da1461033a5780633b8253021461034f57806349432923146103705780634bb278f3146103a1578063518ab2a8146103b657806364329400146103db57806365b9e37d146103f35780636d79207c1461041857806376e532211461043d57806378e979251461046e57806379ba509714610493578063830ced52146104a85780638da5cb5b146104cd57806391f5f3c9146104fc578063999377ec146105215780639ed9331814610536578063a3ea478f1461054c578063a5c9cd821461056c578063ad631abe14610591578063b81a4d8f146105b6578063b8ad2abe14610610578063c28f9df114610634578063c35d1e0114610655578063cfabe67b14610684578063d091b55014610699578063dbeea819146106c8578063dc39d06d146106fa578063dc6055dd14610730578063f47c84c51461075f578063fa73af0b14610784578063fdf97cb2146107a9575b6101fa5b6101d36107d8565b1580156101e257506005544210155b15156101ed57600080fd5b6101f633610801565b5b5b565b005b341561020757600080fd5b61020f610a33565b60405190815260200160405180910390f35b341561022c57600080fd5b6101fa600160a060020a0360043516610a39565b005b341561024d57600080fd5b61020f610ace565b60405190815260200160405180910390f35b341561027257600080fd5b61027a610add565b604051600160a060020a03909116815260200160405180910390f35b34156102a157600080fd5b6101fa600160a060020a0360043516610aec565b005b34156102c257600080fd5b61027a610b70565b604051600160a060020a03909116815260200160405180910390f35b34156102f157600080fd5b61027a610b88565b604051600160a060020a03909116815260200160405180910390f35b341561032057600080fd5b61020f610b97565b60405190815260200160405180910390f35b341561034557600080fd5b6101fa610b9d565b005b341561035a57600080fd5b6101fa600160a060020a0360043516610df4565b005b341561037b57600080fd5b61020f600160a060020a0360043516610f02565b60405190815260200160405180910390f35b34156103ac57600080fd5b6101fa610f14565b005b34156103c157600080fd5b61020f611018565b60405190815260200160405180910390f35b34156103e657600080fd5b6101fa60043561101e565b005b34156103fe57600080fd5b61020f611050565b60405190815260200160405180910390f35b341561042357600080fd5b61020f611056565b60405190815260200160405180910390f35b341561044857600080fd5b61020f600160a060020a036004351661105d565b60405190815260200160405180910390f35b341561047957600080fd5b61020f61106f565b60405190815260200160405180910390f35b341561049e57600080fd5b6101fa611075565b005b34156104b357600080fd5b61020f611104565b60405190815260200160405180910390f35b34156104d857600080fd5b61027a611112565b604051600160a060020a03909116815260200160405180910390f35b341561050757600080fd5b61020f611121565b60405190815260200160405180910390f35b341561052c57600080fd5b6101fa611126565b005b6101fa600160a060020a0360043516610801565b005b341561055757600080fd5b6101fa6004803560248101910135611198565b005b341561057757600080fd5b61020f6111fb565b60405190815260200160405180910390f35b341561059c57600080fd5b61020f611207565b60405190815260200160405180910390f35b34156105c157600080fd5b6105d5600160a060020a036004351661120d565b60405195865260208601949094526040808601939093526060850191909152608084015260ff90911660a083015260c0909101905180910390f35b341561061b57600080fd5b6101fa600160a060020a0360043516602435611245565b005b341561063f57600080fd5b6101fa600160a060020a03600435166113f2565b005b341561066057600080fd5b61027a611476565b604051600160a060020a03909116815260200160405180910390f35b341561068f57600080fd5b6101fa61148e565b005b34156106a457600080fd5b61027a611500565b604051600160a060020a03909116815260200160405180910390f35b34156106d357600080fd5b61027a60043561150f565b604051600160a060020a03909116815260200160405180910390f35b341561070557600080fd5b61071c600160a060020a0360043516602435611541565b604051901515815260200160405180910390f35b341561073b57600080fd5b61027a6115e7565b604051600160a060020a03909116815260200160405180910390f35b341561076a57600080fd5b61020f6115ff565b60405190815260200160405180910390f35b341561078f57600080fd5b61020f61160f565b60405190815260200160405180910390f35b34156107b457600080fd5b61027a611614565b604051600160a060020a03909116815260200160405180910390f35b6000670de0b6b3a7640000630df28e80026007541015806107fb57506006544210155b90505b90565b6000806000806000806000806108156107d8565b15801561082457506005544210155b151561082f57600080fd5b600160a060020a038916151561084457600080fd5b600160a060020a0333166000908152600860209081526040808320546009909252909120549098506108a1906108999061088d670de0b6b3a7640000600f63ffffffff61162316565b9063ffffffff61165216565b600a5461166c565b96506108bc346108b7898b63ffffffff61168616565b61166c565b9550600086116108cb57600080fd5b6007546108fe90611644906108f2906ac18f6d6b0751352a0000009063ffffffff61168616565b9063ffffffff61169d16565b945061090a868661166c565b935061091c888563ffffffff61165216565b600160a060020a033381166000908152600860205260409081902092909255600454169085156108fc0290869051600060405180830381858888f19350505050151561096757600080fd5b600754610986906ac18f6d6b0751352a0000009063ffffffff61168616565b925061099a8461164463ffffffff61162316565b91506116446109af848463ffffffff61168616565b10156109b9578291505b6007546109cc908363ffffffff61165216565b6007556109d989836116b9565b6109e9348563ffffffff61168616565b90506000811115610a2557600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610a2557600080fd5b5b5b5b505050505050505050565b600d5481565b60005433600160a060020a03908116911614610a5457600080fd5b600160a060020a0381161515610a6957600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b6ac18f6d6b0751352a00000081565b600454600160a060020a031681565b60005433600160a060020a03908116911614610b0757600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610b5757600080fd5b6102c65a03f11515610b6857600080fd5b5050505b5b50565b7352aa6a62404107742ac01ff247ed47b49b16c40a81565b600254600160a060020a031681565b60065481565b6000806000610baa6117d3565b6000806000610bb76107d8565b1515610bc257600080fd5b60005433600160a060020a03908116911614610bdd57600080fd5b600b54600d54610bf09190600a0161166c565b9650600d5495505b86861015610de857600b805487908110610c0e57fe5b906000526020600020900160005b9054600160a060020a036101009290920a9004166000818152600c60205260409081902091965060c0905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff1660a0820152935083519250610cb760646108f28660a00151869060ff1663ffffffff61162316565b9063ffffffff61169d16565b9150610cc9838363ffffffff61168616565b90506000811115610cde57610cde85826116b9565b5b6000821115610dd357600354610cfe90600160a060020a0316836116b9565b600354600160a060020a031663957924308684610d266020890151429063ffffffff61165216565b610d3b8960400151429063ffffffff61165216565b610d508a60600151429063ffffffff61165216565b8a60800151600160405160e060020a63ffffffff8a16028152600160a060020a039097166004880152602487019590955260448601939093526064850191909152608484015260a4830152151560c482015260e401600060405180830381600087803b1515610dbe57600080fd5b6102c65a03f11515610dcf57600080fd5b5050505b600d805460010190555b600190950194610bf8565b5b5b5b50505050505050565b6000805433600160a060020a03908116911614610e1057600080fd5b600160a060020a0382161515610e2557600080fd5b5060005b600b54811015610eb95781600160a060020a0316600b82815481101515610e4c57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610eb057600b805482908110610e8957fe5b906000526020600020900160005b6101000a815490600160a060020a030219169055610eb9565b5b600101610e29565b600160a060020a0382166000908152600c602052604081208181556001810182905560028101829055600381018290556004810191909155600501805460ff191690555b5b5050565b60086020526000908152604090205481565b610f1c6107d8565b1515610f2757600080fd5b60005433600160a060020a03908116911614610f4257600080fd5b600254600160a060020a0316632a8092df6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f8a57600080fd5b6102c65a03f11515610f9b57600080fd5b505050604051805190501515610fb057600080fd5b600b54600d5414610fc057600080fd5b600254600160a060020a031663ef70aebf6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b5b565b60075481565b60005433600160a060020a0390811691161461103957600080fd5b6000811161104657600080fd5b600a8190555b5b50565b600a5481565b62278d0081565b60096020526000908152604090205481565b60055481565b60015460009033600160a060020a0390811691161461109357600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b69043c33c193756480000081565b600054600160a060020a031681565b606481565b60005433600160a060020a0390811691161461114157600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b565b60005433600160a060020a039081169116146111b357600080fd5b610efd8282808060200260200160405190810160405280939291908181526020018383602002808284375069043c33c193756480000094506117659350505050565b5b5b5050565b670de0b6b3a764000081565b61164481565b600c60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6000805433600160a060020a0390811691161461126157600080fd5b600160a060020a038316151561127657600080fd5b6000821161128357600080fd5b600b5460646001909101111561129857600080fd5b600160a060020a0383166000908152600c6020526040902054156112bb57600080fd5b5060005b600b548110156113185782600160a060020a0316600b828154811015156112e257fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416141561130f57600080fd5b5b6001016112bf565b600b80546001810161132a838261180d565b916000526020600020900160005b8154600160a060020a038088166101009390930a928302920219161790555060c06040519081016040908152838252600060208084018290526301e133808385018190526060850152620151806080850152603260a0850152600160a060020a0387168252600c905220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b505050565b60005433600160a060020a0390811691161461140d57600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610b5757600080fd5b6102c65a03f11515610b6857600080fd5b5050505b5b50565b73a67e1c56a5e0363b61a23670ffc0fcd8f09f178d81565b60005433600160a060020a039081169116146114a957600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b565b600154600160a060020a031681565b600b80548290811061151d57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805433600160a060020a0390811691161461155d57600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156115c357600080fd5b6102c65a03f115156115d457600080fd5b50505060405180519150505b5b92915050565b73cf1e64ce2740a03192f1d7a3234aabd88c025c4b81565b6b0129c8f71ad02e2a6800000081565b600a81565b600354600160a060020a031681565b600082820283158061163f575082848281151561163c57fe5b04145b151561164757fe5b8091505b5092915050565b60008282018381101561164757fe5b8091505b5092915050565b600081831061167b578161167d565b825b90505b92915050565b60008282111561169257fe5b508082035b92915050565b60008082848115156116ab57fe5b0490508091505b5092915050565b600254600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561170f57600080fd5b6102c65a03f1151561172057600080fd5b50505081600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08260405190815260200160405180910390a25b5050565b6000805433600160a060020a0390811691161461178157600080fd5b5060005b825181101561101057816009600085848151811061179f57fe5b90602001906020020151600160a060020a031681526020810191909152604001600020555b600101611785565b5b5b505050565b60c0604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681525090565b81548183558181151161101057600083815260209020611010918101908301611837565b5b505050565b6107fe91905b80821115611851576000815560010161183d565b5090565b90565b60005433600160a060020a0390811691161461187357600080fd5b600b805460018101611885838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9091021790555060c0604051908101604052806118ff60646108f26b0129c8f71ad02e2a68000000601263ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9052600c90527fcd72efd5a552ae8b00e80f47cc5c15519eb33b2275d1356fad767525313d6cfc815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b8054600181016119c3838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167352aa6a62404107742ac01ff247ed47b49b16c40a9091021790555060c060405190810160405280611a3d60646108f26b0129c8f71ad02e2a68000000600d63ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a09092018190527352aa6a62404107742ac01ff247ed47b49b16c40a9052600c90527f5f419449e46e991718ec28a3ebc27fdb5d7a78821599a3815e22121d1f646f64815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101611b01838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673cf1e64ce2740a03192f1d7a3234aabd88c025c4b9091021790555060c060405190810160405280611b7b60646108f26b0129c8f71ad02e2a68000000600463ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273cf1e64ce2740a03192f1d7a3234aabd88c025c4b9052600c90527fa4dae35cfd6005e9263f99ea9d6b696013c9155b5f35b1c48c1a1773c4aa9ae5815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b5600a165627a7a72305820d22c5d1194a73d933d9f314969e70bdc2e38344120ce41ab6b8a18878aa04133002960606040526006805460ff191660011790555b60018054600160a060020a03191633600160a060020a03161790555b5b610bd88061003e6000396000f300606060405236156100ee5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100f35780630952c5041461017e578063095ea7b31461019f57806318160ddd146101d557806323b872dd146101fa5780632a8092df14610236578063313ce5671461025d57806340c10f191461028657806370a08231146102aa57806379ba5097146102db5780638da5cb5b146102f057806395d89b411461031f578063a9059cbb146103aa578063d091b550146103e0578063dc39d06d1461040f578063dd62ed3e14610445578063ef70aebf1461047c575b600080fd5b34156100fe57600080fd5b610106610491565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561018957600080fd5b61019d600160a060020a03600435166104c8565b005b34156101aa57600080fd5b6101c1600160a060020a036004351660243561055d565b604051901515815260200160405180910390f35b34156101e057600080fd5b6101e8610584565b60405190815260200160405180910390f35b341561020557600080fd5b6101c1600160a060020a036004358116906024351660443561058a565b604051901515815260200160405180910390f35b341561024157600080fd5b6101c16105b3565b604051901515815260200160405180910390f35b341561026857600080fd5b6102706105bc565b60405160ff909116815260200160405180910390f35b341561029157600080fd5b61019d600160a060020a03600435166024356105c1565b005b34156102b557600080fd5b6101e8600160a060020a0360043516610685565b60405190815260200160405180910390f35b34156102e657600080fd5b61019d6106a4565b005b34156102fb57600080fd5b610303610733565b604051600160a060020a03909116815260200160405180910390f35b341561032a57600080fd5b610106610742565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103b557600080fd5b6101c1600160a060020a0360043516602435610779565b604051901515815260200160405180910390f35b34156103eb57600080fd5b6103036107a0565b604051600160a060020a03909116815260200160405180910390f35b341561041a57600080fd5b6101c1600160a060020a03600435166024356107af565b604051901515815260200160405180910390f35b341561045057600080fd5b6101e8600160a060020a036004358116906024351661086d565b60405190815260200160405180910390f35b341561048757600080fd5b61019d61089a565b005b60408051908101604052600481527f426c6f6b00000000000000000000000000000000000000000000000000000000602082015281565b60015433600160a060020a039081169116146104e357600080fd5b600160a060020a03811615156104f857600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b60065460009060ff161561057057600080fd5b61057a8383610900565b90505b5b92915050565b60035481565b60065460009060ff161561059d57600080fd5b6105a88484846109a9565b90505b5b9392505050565b60065460ff1681565b601281565b60015433600160a060020a039081169116146105dc57600080fd5b60065460ff1615156105ed57600080fd5b600354610600908263ffffffff610abb16565b600355600160a060020a03821660009081526005602052604090205461062c908263ffffffff610abb16565b600160a060020a0383166000818152600560205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9084905190815260200160405180910390a35b5b5b5050565b600160a060020a0381166000908152600560205260409020545b919050565b60025460009033600160a060020a039081169116146106c257600080fd5b50600180546002805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b600154600160a060020a031681565b60408051908101604052600381527f424c4f0000000000000000000000000000000000000000000000000000000000602082015281565b60065460009060ff161561078c57600080fd5b61057a8383610ad5565b90505b5b92915050565b600254600160a060020a031681565b60015460009033600160a060020a039081169116146107cd57600080fd5b600154600160a060020a038085169163a9059cbb9116846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561084957600080fd5b6102c65a03f1151561085a57600080fd5b50505060405180519150505b5b92915050565b600160a060020a038083166000908152600460209081526040808320938516835292905220545b92915050565b60015433600160a060020a039081169116146108b557600080fd5b60065460ff1615156108c6576108fd565b6006805460ff191690557ff48339e4a272bd7aee715c343ca34ad137607f1df78cf8d7ba137228954d2d8560405160405180910390a15b5b565b600081158015906109355750600160a060020a0333811660009081526004602090815260408083209387168352929052205415155b1561093f57600080fd5b600160a060020a03338116600081815260046020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b600160a060020a0380841660008181526004602090815260408083203390951683529381528382205492825260059052918220546109ed908463ffffffff610b9516565b600160a060020a038087166000908152600560205260408082209390935590861681522054610a22908463ffffffff610abb16565b600160a060020a038516600090815260056020526040902055610a4b818463ffffffff610b9516565b600160a060020a03808716600081815260046020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b509392505050565b600082820183811015610aca57fe5b8091505b5092915050565b600160a060020a033316600090815260056020526040812054610afe908363ffffffff610b9516565b600160a060020a033381166000908152600560205260408082209390935590851681522054610b33908363ffffffff610abb16565b600160a060020a0380851660008181526005602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b92915050565b600082821115610ba157fe5b508082035b929150505600a165627a7a72305820cd86ff87d6077ca6241da3f17159a15d5919070affb84aea252d7c8af6698ca200296060604052341561000f57600080fd5b604051602080610ca5833981016040528080519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a038116151561005857600080fd5b60028054600160a060020a031916600160a060020a0383161790555b505b610c20806100856000396000f300606060405236156100935763ffffffff60e060020a6000350416630952c50481146100985780631a64adae146100b95780633097f94c146100ed57806374a8f1031461011c57806379ba50971461013d5780637c17357d1461015257806383fcf973146101775780638da5cb5b1461018c57806395792430146101bb578063b869cea3146101f0578063d091b5501461024d575b600080fd5b34156100a357600080fd5b6100b7600160a060020a036004351661027c565b005b34156100c457600080fd5b6100db600160a060020a0360043516602435610311565b60405190815260200160405180910390f35b34156100f857600080fd5b6101006103ae565b604051600160a060020a03909116815260200160405180910390f35b341561012757600080fd5b6100b7600160a060020a03600435166103bd565b005b341561014857600080fd5b6100b7610595565b005b341561015d57600080fd5b6100db610624565b60405190815260200160405180910390f35b341561018257600080fd5b6100b761062a565b005b341561019757600080fd5b6101006107cf565b604051600160a060020a03909116815260200160405180910390f35b34156101c657600080fd5b6100b7600160a060020a036004351660243560443560643560843560a43560c43515156107de565b005b34156101fb57600080fd5b61020f600160a060020a0360043516610a33565b60405196875260208701959095526040808701949094526060860192909252608085015260a084015290151560c083015260e0909101905180910390f35b341561025857600080fd5b610100610a74565b604051600160a060020a03909116815260200160405180910390f35b60005433600160a060020a0390811691161461029757600080fd5b600160a060020a03811615156102ac57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b600061031b610bb4565b600160a060020a038416600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015290508051151561039a57600091506103a7565b6103a48184610a83565b91505b5092915050565b600254600160a060020a031681565b6103c5610bb4565b6000805433600160a060020a039081169116146103e157600080fd5b600160a060020a038316600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c0820190815290925051151561045e57600080fd5b6104748260a0015183519063ffffffff610b3816565b600160a060020a03841660009081526003602081905260408220828155600181018390556002810183905590810182905560048082018390556005820192909255600601805460ff19169055549091506104d4908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561053657600080fd5b6102c65a03f1151561054757600080fd5b50505060405180515050600160a060020a0383167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f8260405190815260200160405180910390a25b5b505050565b60015460009033600160a060020a039081169116146105b357600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b60045481565b600160a060020a033316600090815260036020526040812080549091908190151561065457600080fd5b6106b08360e0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015242610a83565b91508115156106be5761058f565b60058301546106d490839063ffffffff610b3816565b90508015156106e25761058f565b60058301546106f7908263ffffffff610b4f16565b600584015560045461070f908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561077157600080fd5b6102c65a03f1151561078257600080fd5b50505060405180515050600160a060020a0333167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888260405190815260200160405180910390a25b505050565b600054600160a060020a031681565b60005433600160a060020a039081169116146107f957600080fd5b600160a060020a038716151561080e57600080fd5b30600160a060020a031687600160a060020a03161415151561082f57600080fd5b6000861161083c57600080fd5b600160a060020a0387166000908152600360205260409020541561085f57600080fd5b83851115801561086f5750828411155b151561087a57600080fd5b6000821180156108995750610895838663ffffffff610b3816565b8211155b15156108a457600080fd5b600254600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156108fd57600080fd5b6102c65a03f1151561090e57600080fd5b505050604051805160045490915061092c908863ffffffff610b4f16565b111561093757600080fd5b60e0604051908101604090815287825260208083018890528183018790526060830186905260808301859052600060a0840181905284151560c0850152600160a060020a038b168152600390915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff1916911515919091179055506004546109e49087610b4f565b600455600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458860405190815260200160405180910390a35b5b50505050505050565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006909501549395929492939192909160ff1687565b600154600160a060020a031681565b60008060008460400151841015610a9d5760009250610b30565b84606001518410610ab15784519250610b30565b610ada8560800151610ace8760200151879063ffffffff610b3816565b9063ffffffff610b6916565b9150610af5856020015186606001519063ffffffff610b3816565b9050610b2d81610ace610b138860800151869063ffffffff610b8516565b88519063ffffffff610b8516565b9063ffffffff610b6916565b92505b505092915050565b600082821115610b4457fe5b508082035b92915050565b600082820183811015610b5e57fe5b8091505b5092915050565b6000808284811515610b7757fe5b0490508091505b5092915050565b6000828202831580610ba15750828482811515610b9e57fe5b04145b1515610b5e57fe5b8091505b5092915050565b60e06040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815250905600a165627a7a7230582070fe28d3116ed1d12e84879db9c3bea2f6f03d1a331ab0bf6d956e6a4b5006bb0029000000000000000000000000f354e8d1030168d32d94435fc23de1fd6b46840f000000000000000000000000000000000000000000000000000000005acbfe80

Deployed Bytecode

0x606060405236156101c75763ffffffff60e060020a6000350416630423974381146101fc5780630952c5041461022157806317f5de95146102425780631bb534ba1461026757806329dd0d7d146102965780632b905bf6146102b75780633097f94c146102e65780633197cbb61461031557806334fa37da1461033a5780633b8253021461034f57806349432923146103705780634bb278f3146103a1578063518ab2a8146103b657806364329400146103db57806365b9e37d146103f35780636d79207c1461041857806376e532211461043d57806378e979251461046e57806379ba509714610493578063830ced52146104a85780638da5cb5b146104cd57806391f5f3c9146104fc578063999377ec146105215780639ed9331814610536578063a3ea478f1461054c578063a5c9cd821461056c578063ad631abe14610591578063b81a4d8f146105b6578063b8ad2abe14610610578063c28f9df114610634578063c35d1e0114610655578063cfabe67b14610684578063d091b55014610699578063dbeea819146106c8578063dc39d06d146106fa578063dc6055dd14610730578063f47c84c51461075f578063fa73af0b14610784578063fdf97cb2146107a9575b6101fa5b6101d36107d8565b1580156101e257506005544210155b15156101ed57600080fd5b6101f633610801565b5b5b565b005b341561020757600080fd5b61020f610a33565b60405190815260200160405180910390f35b341561022c57600080fd5b6101fa600160a060020a0360043516610a39565b005b341561024d57600080fd5b61020f610ace565b60405190815260200160405180910390f35b341561027257600080fd5b61027a610add565b604051600160a060020a03909116815260200160405180910390f35b34156102a157600080fd5b6101fa600160a060020a0360043516610aec565b005b34156102c257600080fd5b61027a610b70565b604051600160a060020a03909116815260200160405180910390f35b34156102f157600080fd5b61027a610b88565b604051600160a060020a03909116815260200160405180910390f35b341561032057600080fd5b61020f610b97565b60405190815260200160405180910390f35b341561034557600080fd5b6101fa610b9d565b005b341561035a57600080fd5b6101fa600160a060020a0360043516610df4565b005b341561037b57600080fd5b61020f600160a060020a0360043516610f02565b60405190815260200160405180910390f35b34156103ac57600080fd5b6101fa610f14565b005b34156103c157600080fd5b61020f611018565b60405190815260200160405180910390f35b34156103e657600080fd5b6101fa60043561101e565b005b34156103fe57600080fd5b61020f611050565b60405190815260200160405180910390f35b341561042357600080fd5b61020f611056565b60405190815260200160405180910390f35b341561044857600080fd5b61020f600160a060020a036004351661105d565b60405190815260200160405180910390f35b341561047957600080fd5b61020f61106f565b60405190815260200160405180910390f35b341561049e57600080fd5b6101fa611075565b005b34156104b357600080fd5b61020f611104565b60405190815260200160405180910390f35b34156104d857600080fd5b61027a611112565b604051600160a060020a03909116815260200160405180910390f35b341561050757600080fd5b61020f611121565b60405190815260200160405180910390f35b341561052c57600080fd5b6101fa611126565b005b6101fa600160a060020a0360043516610801565b005b341561055757600080fd5b6101fa6004803560248101910135611198565b005b341561057757600080fd5b61020f6111fb565b60405190815260200160405180910390f35b341561059c57600080fd5b61020f611207565b60405190815260200160405180910390f35b34156105c157600080fd5b6105d5600160a060020a036004351661120d565b60405195865260208601949094526040808601939093526060850191909152608084015260ff90911660a083015260c0909101905180910390f35b341561061b57600080fd5b6101fa600160a060020a0360043516602435611245565b005b341561063f57600080fd5b6101fa600160a060020a03600435166113f2565b005b341561066057600080fd5b61027a611476565b604051600160a060020a03909116815260200160405180910390f35b341561068f57600080fd5b6101fa61148e565b005b34156106a457600080fd5b61027a611500565b604051600160a060020a03909116815260200160405180910390f35b34156106d357600080fd5b61027a60043561150f565b604051600160a060020a03909116815260200160405180910390f35b341561070557600080fd5b61071c600160a060020a0360043516602435611541565b604051901515815260200160405180910390f35b341561073b57600080fd5b61027a6115e7565b604051600160a060020a03909116815260200160405180910390f35b341561076a57600080fd5b61020f6115ff565b60405190815260200160405180910390f35b341561078f57600080fd5b61020f61160f565b60405190815260200160405180910390f35b34156107b457600080fd5b61027a611614565b604051600160a060020a03909116815260200160405180910390f35b6000670de0b6b3a7640000630df28e80026007541015806107fb57506006544210155b90505b90565b6000806000806000806000806108156107d8565b15801561082457506005544210155b151561082f57600080fd5b600160a060020a038916151561084457600080fd5b600160a060020a0333166000908152600860209081526040808320546009909252909120549098506108a1906108999061088d670de0b6b3a7640000600f63ffffffff61162316565b9063ffffffff61165216565b600a5461166c565b96506108bc346108b7898b63ffffffff61168616565b61166c565b9550600086116108cb57600080fd5b6007546108fe90611644906108f2906ac18f6d6b0751352a0000009063ffffffff61168616565b9063ffffffff61169d16565b945061090a868661166c565b935061091c888563ffffffff61165216565b600160a060020a033381166000908152600860205260409081902092909255600454169085156108fc0290869051600060405180830381858888f19350505050151561096757600080fd5b600754610986906ac18f6d6b0751352a0000009063ffffffff61168616565b925061099a8461164463ffffffff61162316565b91506116446109af848463ffffffff61168616565b10156109b9578291505b6007546109cc908363ffffffff61165216565b6007556109d989836116b9565b6109e9348563ffffffff61168616565b90506000811115610a2557600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610a2557600080fd5b5b5b5b505050505050505050565b600d5481565b60005433600160a060020a03908116911614610a5457600080fd5b600160a060020a0381161515610a6957600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b6ac18f6d6b0751352a00000081565b600454600160a060020a031681565b60005433600160a060020a03908116911614610b0757600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610b5757600080fd5b6102c65a03f11515610b6857600080fd5b5050505b5b50565b7352aa6a62404107742ac01ff247ed47b49b16c40a81565b600254600160a060020a031681565b60065481565b6000806000610baa6117d3565b6000806000610bb76107d8565b1515610bc257600080fd5b60005433600160a060020a03908116911614610bdd57600080fd5b600b54600d54610bf09190600a0161166c565b9650600d5495505b86861015610de857600b805487908110610c0e57fe5b906000526020600020900160005b9054600160a060020a036101009290920a9004166000818152600c60205260409081902091965060c0905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff1660a0820152935083519250610cb760646108f28660a00151869060ff1663ffffffff61162316565b9063ffffffff61169d16565b9150610cc9838363ffffffff61168616565b90506000811115610cde57610cde85826116b9565b5b6000821115610dd357600354610cfe90600160a060020a0316836116b9565b600354600160a060020a031663957924308684610d266020890151429063ffffffff61165216565b610d3b8960400151429063ffffffff61165216565b610d508a60600151429063ffffffff61165216565b8a60800151600160405160e060020a63ffffffff8a16028152600160a060020a039097166004880152602487019590955260448601939093526064850191909152608484015260a4830152151560c482015260e401600060405180830381600087803b1515610dbe57600080fd5b6102c65a03f11515610dcf57600080fd5b5050505b600d805460010190555b600190950194610bf8565b5b5b5b50505050505050565b6000805433600160a060020a03908116911614610e1057600080fd5b600160a060020a0382161515610e2557600080fd5b5060005b600b54811015610eb95781600160a060020a0316600b82815481101515610e4c57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610eb057600b805482908110610e8957fe5b906000526020600020900160005b6101000a815490600160a060020a030219169055610eb9565b5b600101610e29565b600160a060020a0382166000908152600c602052604081208181556001810182905560028101829055600381018290556004810191909155600501805460ff191690555b5b5050565b60086020526000908152604090205481565b610f1c6107d8565b1515610f2757600080fd5b60005433600160a060020a03908116911614610f4257600080fd5b600254600160a060020a0316632a8092df6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f8a57600080fd5b6102c65a03f11515610f9b57600080fd5b505050604051805190501515610fb057600080fd5b600b54600d5414610fc057600080fd5b600254600160a060020a031663ef70aebf6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b5b565b60075481565b60005433600160a060020a0390811691161461103957600080fd5b6000811161104657600080fd5b600a8190555b5b50565b600a5481565b62278d0081565b60096020526000908152604090205481565b60055481565b60015460009033600160a060020a0390811691161461109357600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b69043c33c193756480000081565b600054600160a060020a031681565b606481565b60005433600160a060020a0390811691161461114157600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b565b60005433600160a060020a039081169116146111b357600080fd5b610efd8282808060200260200160405190810160405280939291908181526020018383602002808284375069043c33c193756480000094506117659350505050565b5b5b5050565b670de0b6b3a764000081565b61164481565b600c60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6000805433600160a060020a0390811691161461126157600080fd5b600160a060020a038316151561127657600080fd5b6000821161128357600080fd5b600b5460646001909101111561129857600080fd5b600160a060020a0383166000908152600c6020526040902054156112bb57600080fd5b5060005b600b548110156113185782600160a060020a0316600b828154811015156112e257fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416141561130f57600080fd5b5b6001016112bf565b600b80546001810161132a838261180d565b916000526020600020900160005b8154600160a060020a038088166101009390930a928302920219161790555060c06040519081016040908152838252600060208084018290526301e133808385018190526060850152620151806080850152603260a0850152600160a060020a0387168252600c905220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b505050565b60005433600160a060020a0390811691161461140d57600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610b5757600080fd5b6102c65a03f11515610b6857600080fd5b5050505b5b50565b73a67e1c56a5e0363b61a23670ffc0fcd8f09f178d81565b60005433600160a060020a039081169116146114a957600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610fff57600080fd5b6102c65a03f1151561101057600080fd5b5050505b5b565b600154600160a060020a031681565b600b80548290811061151d57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805433600160a060020a0390811691161461155d57600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156115c357600080fd5b6102c65a03f115156115d457600080fd5b50505060405180519150505b5b92915050565b73cf1e64ce2740a03192f1d7a3234aabd88c025c4b81565b6b0129c8f71ad02e2a6800000081565b600a81565b600354600160a060020a031681565b600082820283158061163f575082848281151561163c57fe5b04145b151561164757fe5b8091505b5092915050565b60008282018381101561164757fe5b8091505b5092915050565b600081831061167b578161167d565b825b90505b92915050565b60008282111561169257fe5b508082035b92915050565b60008082848115156116ab57fe5b0490508091505b5092915050565b600254600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561170f57600080fd5b6102c65a03f1151561172057600080fd5b50505081600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08260405190815260200160405180910390a25b5050565b6000805433600160a060020a0390811691161461178157600080fd5b5060005b825181101561101057816009600085848151811061179f57fe5b90602001906020020151600160a060020a031681526020810191909152604001600020555b600101611785565b5b5b505050565b60c0604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681525090565b81548183558181151161101057600083815260209020611010918101908301611837565b5b505050565b6107fe91905b80821115611851576000815560010161183d565b5090565b90565b60005433600160a060020a0390811691161461187357600080fd5b600b805460018101611885838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9091021790555060c0604051908101604052806118ff60646108f26b0129c8f71ad02e2a68000000601263ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273a67e1c56a5e0363b61a23670ffc0fcd8f09f178d9052600c90527fcd72efd5a552ae8b00e80f47cc5c15519eb33b2275d1356fad767525313d6cfc815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b8054600181016119c3838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167352aa6a62404107742ac01ff247ed47b49b16c40a9091021790555060c060405190810160405280611a3d60646108f26b0129c8f71ad02e2a68000000600d63ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a09092018190527352aa6a62404107742ac01ff247ed47b49b16c40a9052600c90527f5f419449e46e991718ec28a3ebc27fdb5d7a78821599a3815e22121d1f646f64815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101611b01838261180d565b916000526020600020900160005b8154600160a060020a036101009290920a918202191673cf1e64ce2740a03192f1d7a3234aabd88c025c4b9091021790555060c060405190810160405280611b7b60646108f26b0129c8f71ad02e2a68000000600463ffffffff61162316565b9063ffffffff61169d16565b81526000602080830182905260408301829052620d2f00606084015262015180608084015260a090920181905273cf1e64ce2740a03192f1d7a3234aabd88c025c4b9052600c90527fa4dae35cfd6005e9263f99ea9d6b696013c9155b5f35b1c48c1a1773c4aa9ae5815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b5600a165627a7a72305820d22c5d1194a73d933d9f314969e70bdc2e38344120ce41ab6b8a18878aa041330029

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

000000000000000000000000f354e8d1030168d32d94435fc23de1fd6b46840f000000000000000000000000000000000000000000000000000000005acbfe80

-----Decoded View---------------
Arg [0] : _fundingRecipient (address): 0xf354e8d1030168D32D94435Fc23De1fD6B46840f
Arg [1] : _startTime (uint256): 1523318400

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f354e8d1030168d32d94435fc23de1fd6b46840f
Arg [1] : 000000000000000000000000000000000000000000000000000000005acbfe80


Swarm Source

bzzr://70fe28d3116ed1d12e84879db9c3bea2f6f03d1a331ab0bf6d956e6a4b5006bb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.