ETH Price: $2,786.77 (+6.17%)

Contract

0x8BfE5EbB128eE82F4BA80f56bb32409CC87bC6fb
 
Transaction Hash
Method
Block
From
To
Transfer111358552020-10-27 2:29:291396 days ago1603765769IN
Kin: Token Sale
0.01 ETH0.0009881545
Transfer111358462020-10-27 2:27:291396 days ago1603765649IN
Kin: Token Sale
0.01 ETH0.00056727
Transfer51911842018-03-03 21:26:022365 days ago1520112362IN
Kin: Token Sale
0.01038035 ETH0.000128156
Transfer45980042017-11-22 2:06:412466 days ago1511316401IN
Kin: Token Sale
0.12 ETH0.0004485321
Transfer45812122017-11-19 9:07:142469 days ago1511082434IN
Kin: Token Sale
0.0001 ETH0.000106795
Transfer43376532017-10-05 1:04:062514 days ago1507165446IN
Kin: Token Sale
0.08 ETH0.004221
Transfer43235862017-09-30 3:11:452519 days ago1506741105IN
Kin: Token Sale
4 ETH0.017644
Request Vesting ...43195092017-09-28 16:44:452521 days ago1506617085IN
Kin: Token Sale
0 ETH0.001016921
Request Ownershi...43195062017-09-28 16:42:232521 days ago1506616943IN
Kin: Token Sale
0 ETH0.0009500821
Request Kin Toke...43195042017-09-28 16:42:052521 days ago1506616925IN
Kin: Token Sale
0 ETH0.0010192721
Transfer43130072017-09-26 10:27:262523 days ago1506421646IN
Kin: Token Sale
0.015 ETH0.004221
Finalize43126152017-09-26 7:14:412523 days ago1506410081IN
Kin: Token Sale
0 ETH0.0004700424.68999174
Grant Tokens43124582017-09-26 5:58:212523 days ago1506405501IN
Kin: Token Sale
0 ETH0.0143507264.93188453
Add Token Grant43124552017-09-26 5:54:432523 days ago1506405283IN
Kin: Token Sale
0 ETH0.0130059264.93188453
Transfer43124392017-09-26 5:43:532523 days ago1506404633IN
Kin: Token Sale
11 ETH0.5994165694
Transfer43124372017-09-26 5:39:482523 days ago1506404388IN
Kin: Token Sale
11 ETH0.2227538834.93188453
Transfer43124352017-09-26 5:37:492523 days ago1506404269IN
Kin: Token Sale
12.1 ETH0.1339122121
Grant Tokens43124272017-09-26 5:36:202523 days ago1506404180IN
Kin: Token Sale
0 ETH0.0914211764.93188453
Grant Tokens43124272017-09-26 5:36:202523 days ago1506404180IN
Kin: Token Sale
0 ETH0.129957264.93188453
Grant Tokens43124272017-09-26 5:36:202523 days ago1506404180IN
Kin: Token Sale
0 ETH0.1289832264.93188453
Grant Tokens43124262017-09-26 5:35:282523 days ago1506404128IN
Kin: Token Sale
0 ETH0.129957264.93188453
Grant Tokens43124212017-09-26 5:34:072523 days ago1506404047IN
Kin: Token Sale
0 ETH0.1205688364.93188453
Transfer43124182017-09-26 5:32:112523 days ago1506403931IN
Kin: Token Sale
0.5 ETH0.0049863724.93188453
Set Tier2Partici...43123922017-09-26 5:19:402523 days ago1506403180IN
Kin: Token Sale
0 ETH0.0027243261.12044915
Transfer43123712017-09-26 5:07:272523 days ago1506402447IN
Kin: Token Sale
0.89 ETH0.004221
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
43124072017-09-26 5:27:532523 days ago1506403673
Kin: Token Sale
9,206.11102991 ETH
43124072017-09-26 5:27:532523 days ago1506403673
Kin: Token Sale
90,793.88897008 ETH
43124072017-09-26 5:27:532523 days ago1506403673
Kin: Token Sale
100,000 ETH
43123722017-09-26 5:07:452523 days ago1506402465
Kin: Token Sale
100,000 ETH
43123672017-09-26 5:04:432523 days ago1506402283
Kin: Token Sale
0.04519399 ETH
43123652017-09-26 5:00:202523 days ago1506402020
Kin: Token Sale
19 ETH
43123632017-09-26 4:59:302523 days ago1506401970
Kin: Token Sale
6 ETH
43123632017-09-26 4:59:302523 days ago1506401970
Kin: Token Sale
5 ETH
43123622017-09-26 4:59:032523 days ago1506401943
Kin: Token Sale
30 ETH
43123612017-09-26 4:58:542523 days ago1506401934
Kin: Token Sale
0.1 ETH
43123572017-09-26 4:56:522523 days ago1506401812
Kin: Token Sale
0.08 ETH
43123572017-09-26 4:56:522523 days ago1506401812
Kin: Token Sale
3.97923875 ETH
43123572017-09-26 4:56:522523 days ago1506401812
Kin: Token Sale
3.92076124 ETH
43123562017-09-26 4:55:532523 days ago1506401753
Kin: Token Sale
6 ETH
43123542017-09-26 4:55:272523 days ago1506401727
Kin: Token Sale
6.53050062 ETH
43123502017-09-26 4:54:202523 days ago1506401660
Kin: Token Sale
78 ETH
43123492017-09-26 4:54:042523 days ago1506401644
Kin: Token Sale
13 ETH
43123452017-09-26 4:52:182523 days ago1506401538
Kin: Token Sale
0.00209678 ETH
43123452017-09-26 4:52:182523 days ago1506401538
Kin: Token Sale
5 ETH
43123442017-09-26 4:51:442523 days ago1506401504
Kin: Token Sale
9.5 ETH
43123412017-09-26 4:50:372523 days ago1506401437
Kin: Token Sale
2.4 ETH
43123362017-09-26 4:49:022523 days ago1506401342
Kin: Token Sale
285.8670456 ETH
43123332017-09-26 4:48:232523 days ago1506401303
Kin: Token Sale
1 ETH
43123332017-09-26 4:48:232523 days ago1506401303
Kin: Token Sale
0.00548247 ETH
43123332017-09-26 4:48:232523 days ago1506401303
Kin: Token Sale
24 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KinTokenSale

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-09-11
*/

pragma solidity ^0.4.15;

/// @title Ownable
/// @dev The Ownable contract has an owner address, and provides basic authorization control functions, this simplifies
/// and the implementation of "user permissions".
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);
    }
}

/// @title Math operations with safety checks
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;
    }
}

/// @title ERC Token Standard #20 Interface (https://github.com/ethereum/EIPs/issues/20)
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);
}


/// @title Basic ERC20 token contract implementation.
/// @dev Based on OpenZeppelin's StandardToken.
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;
    }
}


/// @title Token holder contract.
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);
    }
}


/// @title Kin token contract.
contract KinToken is Ownable, BasicToken, TokenHolder {
    using SafeMath for uint256;

    string public constant name = "Kin";
    string public constant symbol = "KIN";

    // Using same decimal value as ETH (makes ETH-KIN 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 Kin tokens.
    /// @param _to address Address to send minted Kin to.
    /// @param _amount uint256 Amount of Kin 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);
    }
}


/// @title Vesting trustee contract for Kin token.
contract VestingTrustee is Ownable {
    using SafeMath for uint256;

    // Kin token contract.
    KinToken public kin;

    // 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 Kin token contract.
    /// @param _kin KinToken The address of the previously deployed Kin token contract.
    function VestingTrustee(KinToken _kin) {
        require(_kin != address(0));

        kin = _kin;
    }

    /// @dev Grant tokens to a specified address. Please note, that the trustee must have enough ungranted tokens to
    /// accomodate the new grant. Otherwise, the call with fail.
    /// @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)); // Protect this contract from receiving a grant.
        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) <= kin.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 can still be returned.
        uint256 refund = grant.value.sub(grant.transferred);

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

        // Update total vesting amount and transfer previously calculated tokens to owner.
        totalVesting = totalVesting.sub(refund);
        kin.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 An 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 the number of tokens 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 the grantee.
    function unlockVestedTokens() external {
        Grant storage grant = grants[msg.sender];

        // Make sure the grant has tokens available.
        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);
        kin.transfer(msg.sender, transferable);

        TokensUnlocked(msg.sender, transferable);
    }
}


/// @title Kin token sale contract.
contract KinTokenSale is Ownable, TokenHolder {
    using SafeMath for uint256;

    // External parties:

    // KIN token contract.
    KinToken public kin;

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

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

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

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

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

    // Wei to 1 USD ratio.
    uint256 public constant WEI_PER_USD = uint256(1 ether) / 289;

    // KIN to 1 USD ratio,
    // such that MAX_TOKENS_SOLD / KIN_PER_USD is the $75M cap.
    uint256 public constant KIN_PER_USD = 6829 * TOKEN_UNIT;

    // KIN to 1 wei ratio.
    uint256 public constant KIN_PER_WEI = KIN_PER_USD / WEI_PER_USD;

    // Sale start and end timestamps.
    uint256 public constant SALE_DURATION = 14 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 = 100000 * WEI_PER_USD;
    uint256 public constant TIER_2_CAP = uint256(-1); // 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 = 4393 * WEI_PER_USD;

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

    // Post-TDE multisig addresses.
    address public constant KIN_FOUNDATION_ADDRESS = 0x56aE76573EC54754bC5B6A8cBF04bBd7Dc86b0A0;
    address public constant KIK_ADDRESS = 0x3bf4BbE253153678E9E8E540395C22BFf7fCa87d;

    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 KinTokenSale(address _fundingRecipient, uint256 _startTime) {
        require(_fundingRecipient != address(0));
        require(_startTime > now);

        // Deploy new KinToken contract.
        kin = new KinToken();

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

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

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

    /// @dev Initialize token grants.
    function initTokenGrants() private onlyOwner {
        // Issue the remaining 60% to Kin Foundation's multisig wallet. In a few days, after the token sale is
        // finalized, these tokens will be loaded into the KinVestingTrustee smart contract, according to the white
        // paper. Please note, that this is implied by setting a 0% vesting percent.
        tokenGrantees.push(KIN_FOUNDATION_ADDRESS);
        tokenGrants[KIN_FOUNDATION_ADDRESS] = TokenGrant(MAX_TOKENS.mul(60).div(100), 0, 0, 3 years, 1 days, 0);

        // Kik, 30%
        tokenGrantees.push(KIK_ADDRESS);
        tokenGrants[KIK_ADDRESS] = TokenGrant(MAX_TOKENS.mul(30).div(100), 0, 0, 120 weeks, 12 weeks, 100);
    }

    /// @dev Adds a Kin 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 Kin 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 Add a list of participants to tier #2.
    /// @param _participants address[] The list of participant addresses.
    function setTier2Participants(address[] _participants) external onlyOwner {
        setParticipationCap(_participants, TIER_2_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(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(KIN_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(KIN_PER_WEI);
        if (tokensLeftInSale.sub(tokensToIssue) < KIN_PER_WEI) {
            // If purchase would cause less than KIN_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 (!kin.isMinting()) {
            revert();
        }

        require(lastGrantedIndex == tokenGrantees.length);

        // Finish minting.
        kin.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.mul(tokensSold).div(MAX_TOKENS_SOLD);
            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 Kin token contract to mint the requested tokens for the buyer.
        kin.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 Kin token contract to a new owner.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    ///
    /// NOTE:
    ///   1. The new owner will need to call Kin 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 Kin token contract can issue new tokens.
    function requestKinTokenOwnershipTransfer(address _newOwnerCandidate) external onlyOwner {
        kin.requestOwnershipTransfer(_newOwnerCandidate);
    }

    /// @dev Accepts new ownership on behalf of the Kin token contract.
    // This can be used by the sale contract itself to claim back ownership of the Kin token contract.
    function acceptKinTokenOwnership() external onlyOwner {
        kin.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 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":true,"inputs":[],"name":"TIER_2_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"WEI_PER_USD","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptKinTokenOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"grantTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_participants","type":"address[]"}],"name":"setTier2Participants","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":"KIN_PER_WEI","outputs":[{"name":"","type":"uint256"}],"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":true,"inputs":[],"name":"kin","outputs":[{"name":"","type":"address"}],"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":"","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":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":"KIN_PER_USD","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"KIK_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestKinTokenOwnershipTransfer","outputs":[],"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"},{"constant":true,"inputs":[],"name":"KIN_FOUNDATION_ADDRESS","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"}]

60606040526000600755610121670de0b6b3a76400005b0461112902600a556000600d5534156200002f57600080fd5b60405160408062003a6d83398101604052808051919060200180519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a03821615156200008157600080fd5b4281116200008e57600080fd5b620000986200047b565b604051809103906000f0801515620000af57600080fd5b60028054600160a060020a031916600160a060020a03928316179081905516620000d86200048c565b600160a060020a039091168152602001604051809103906000f0801515620000ff57600080fd5b60038054600160a060020a0319908116600160a060020a0393841617909155600480549091169184169190911790556005819055621275008101600655620001546401000000006200015d8102620019e61704565b5b5050620004ee565b60005433600160a060020a039081169116146200017957600080fd5b600b8054600181016200018d83826200049d565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09091021790555060c0604051908101604052806200021c6064620002076c7e37be2022c0914b2680000000603c640100000000620018186200042c82021704565b90640100000000620017e26200045e82021704565b815260006020808301829052604083018290526305a39a80606084015262015180608084015260a09092018190527356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09052600c90527fd06905af1297742ddb9ac089725ec482c86000f9368110004c772fb62e96d44c815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101620002e383826200049d565b916000526020600020900160005b8154600160a060020a036101009290920a9182021916733bf4bbe253153678e9e8e540395c22bff7fca87d9091021790555060c060405190810160405280620003726064620002076c7e37be2022c0914b2680000000601e640100000000620018186200042c82021704565b90640100000000620017e26200045e82021704565b815260006020808301829052604083018290526304536c006060840152626ebe006080840152606460a090930192909252733bf4bbe253153678e9e8e540395c22bff7fca87d9052600c90527f4045339027fddef4527290ad0313e692803d46494547232e9766f18e24607f88815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b565b60008282028315806200044a57508284828115156200044757fe5b04145b15156200045357fe5b8091505b5092915050565b60008082848115156200046d57fe5b0490508091505b5092915050565b604051610c1680620021b283390190565b604051610ca58062002dc883390190565b815481835581811511620004c457600083815260209020620004c4918101908301620004ca565b5b505050565b620004eb91905b80821115620004e75760008155600101620004d1565b5090565b90565b611cb480620004fe6000396000f300606060405236156101e85763ffffffff60e060020a6000350416630423974381146102185780630952c5041461023d57806317f5de951461025e5780631bb534ba14610283578063301dd027146102b25780633197cbb6146102d757806332bbc1c8146102fc578063333abd901461032157806334fa37da1461033657806335400daf1461034b5780633b8253021461036b578063494329231461038c5780634bb278f3146103bd5780634bc4d2ba146103d2578063518ab2a8146103f7578063643294001461041c57806365b9e37d146104345780636d79207c1461045957806376e532211461047e57806378e97925146104af57806379ba5097146104d4578063830ced52146104e95780638da5cb5b1461050e57806391f5f3c91461053d5780639743efe5146105625780639ed9331814610591578063a3ea478f146105a7578063a5c9cd82146105c7578063b81a4d8f146105ec578063b8ad2abe14610646578063c28f9df11461066a578063cfabe67b1461068b578063d091b550146106a0578063dbeea819146106cf578063dc39d06d14610701578063e264a2f414610737578063e4b1443b1461075c578063e5e534931461078b578063f47c84c5146107ac578063fa73af0b146107d1578063fdf97cb2146107f6578063ff25f85914610825575b5b6101f1610854565b15801561020057506005544210155b151561020b57600080fd5b6102143361087e565b5b5b005b341561022357600080fd5b61022b610aee565b60405190815260200160405180910390f35b341561024857600080fd5b610214600160a060020a0360043516610af4565b005b341561026957600080fd5b61022b610b89565b60405190815260200160405180910390f35b341561028e57600080fd5b610296610b9a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b61022b610ba9565b60405190815260200160405180910390f35b34156102e257600080fd5b61022b610baf565b60405190815260200160405180910390f35b341561030757600080fd5b61022b610bb5565b60405190815260200160405180910390f35b341561032c57600080fd5b610214610bc6565b005b341561034157600080fd5b610214610c38565b005b341561035657600080fd5b6102146004803560248101910135610ec2565b005b341561037657600080fd5b610214600160a060020a0360043516610f1d565b005b341561039757600080fd5b61022b600160a060020a036004351661102b565b60405190815260200160405180910390f35b34156103c857600080fd5b61021461103d565b005b34156103dd57600080fd5b61022b611141565b60405190815260200160405180910390f35b341561040257600080fd5b61022b611167565b60405190815260200160405180910390f35b341561042757600080fd5b61021460043561116d565b005b341561043f57600080fd5b61022b61119f565b60405190815260200160405180910390f35b341561046457600080fd5b61022b6111a5565b60405190815260200160405180910390f35b341561048957600080fd5b61022b600160a060020a03600435166111ac565b60405190815260200160405180910390f35b34156104ba57600080fd5b61022b6111be565b60405190815260200160405180910390f35b34156104df57600080fd5b6102146111c4565b005b34156104f457600080fd5b61022b611253565b60405190815260200160405180910390f35b341561051957600080fd5b610296611269565b604051600160a060020a03909116815260200160405180910390f35b341561054857600080fd5b61022b611278565b60405190815260200160405180910390f35b341561056d57600080fd5b61029661127d565b604051600160a060020a03909116815260200160405180910390f35b610214600160a060020a036004351661087e565b005b34156105b257600080fd5b610214600480356024810191013561128c565b005b34156105d257600080fd5b61022b6112fc565b60405190815260200160405180910390f35b34156105f757600080fd5b61060b600160a060020a0360043516611308565b60405195865260208601949094526040808601939093526060850191909152608084015260ff90911660a083015260c0909101905180910390f35b341561065157600080fd5b610214600160a060020a0360043516602435611340565b005b341561067557600080fd5b610214600160a060020a03600435166114ed565b005b341561069657600080fd5b610214611571565b005b34156106ab57600080fd5b6102966115e3565b604051600160a060020a03909116815260200160405180910390f35b34156106da57600080fd5b6102966004356115f2565b604051600160a060020a03909116815260200160405180910390f35b341561070c57600080fd5b610723600160a060020a0360043516602435611624565b604051901515815260200160405180910390f35b341561074257600080fd5b61022b6116ca565b60405190815260200160405180910390f35b341561076757600080fd5b6102966116d8565b604051600160a060020a03909116815260200160405180910390f35b341561079657600080fd5b610214600160a060020a03600435166116f0565b005b34156107b757600080fd5b61022b611774565b60405190815260200160405180910390f35b34156107dc57600080fd5b61022b611785565b60405190815260200160405180910390f35b341561080157600080fd5b61029661178a565b604051600160a060020a03909116815260200160405180910390f35b341561083057600080fd5b610296611799565b604051600160a060020a03909116815260200160405180910390f35b6000670de0b6b3a764000064774135531f0260075410158061087857506006544210155b90505b90565b600080600080600080600080610892610854565b1580156108a157506005544210155b15156108ac57600080fd5b600160a060020a03891615156108c157600080fd5b600160a060020a033316600090815260086020908152604080832054600990925290912054600a549199506108f5916117b1565b96506109103461090b898b63ffffffff6117cb16565b6117b1565b95506000861161091f57600080fd5b610975610121670de0b6b3a76400005b046901723369b6684694000081151561094457fe5b04610969600754670de0b6b3a764000064774135531f026117cb90919063ffffffff16565b9063ffffffff6117e216565b945061098186866117b1565b9350610993888563ffffffff6117fe16565b600160a060020a033381166000908152600860205260409081902092909255600454169085156108fc0290869051600060405180830381858888f1935050505015156109de57600080fd5b6007546109ff906c0676fddfedc9a06abab11c00009063ffffffff6117cb16565b9250610a35610121670de0b6b3a76400005b046901723369b66846940000811515610a2657fe5b8691900463ffffffff61181816565b9150610121670de0b6b3a76400005b046901723369b66846940000811515610a5957fe5b04610a6a848463ffffffff6117cb16565b1015610a74578291505b600754610a87908363ffffffff6117fe16565b600755610a948983611847565b610aa4348563ffffffff6117cb16565b90506000811115610ae057600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610ae057600080fd5b5b5b5b505050505050505050565b600d5481565b60005433600160a060020a03908116911614610b0f57600080fd5b600160a060020a0381161515610b2457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b6c0676fddfedc9a06abab11c000081565b600454600160a060020a031681565b60001981565b60065481565b610121670de0b6b3a76400005b0481565b60005433600160a060020a03908116911614610be157600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b6000806000610c45611961565b6000806000610c52610854565b1515610c5d57600080fd5b60005433600160a060020a03908116911614610c7857600080fd5b600b54600d54610c8b9190600a016117b1565b9650600d5495505b86861015610eb657600b805487908110610ca957fe5b906000526020600020900160005b9054600160a060020a036101009290920a9004166000818152600c60205260409081902091965060c0905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff1660a0820152600754909450610d5a906c0676fddfedc9a06abab11c0000906109699087519063ffffffff61181816565b9063ffffffff6117e216565b9250610d8560646109698660a00151869060ff1663ffffffff61181816565b9063ffffffff6117e216565b9150610d97838363ffffffff6117cb16565b90506000811115610dac57610dac8582611847565b5b6000821115610ea157600354610dcc90600160a060020a031683611847565b600354600160a060020a031663957924308684610df46020890151429063ffffffff6117fe16565b610e098960400151429063ffffffff6117fe16565b610e1e8a60600151429063ffffffff6117fe16565b8a60800151600160405160e060020a63ffffffff8a16028152600160a060020a039097166004880152602487019590955260448601939093526064850191909152608484015260a4830152151560c482015260e401600060405180830381600087803b1515610e8c57600080fd5b6102c65a03f11515610e9d57600080fd5b5050505b600d805460010190555b600190950194610c93565b5b5b5b50505050505050565b60005433600160a060020a03908116911614610edd57600080fd5b610f178282808060200260200160405190810160405280939291908181526020018383602002808284375060001994506118f39350505050565b5b5b5050565b6000805433600160a060020a03908116911614610f3957600080fd5b600160a060020a0382161515610f4e57600080fd5b5060005b600b54811015610fe25781600160a060020a0316600b82815481101515610f7557fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610fd957600b805482908110610fb257fe5b906000526020600020900160005b6101000a815490600160a060020a030219169055610fe2565b5b600101610f52565b600160a060020a0382166000908152600c602052604081208181556001810182905560028101829055600381018290556004810191909155600501805460ff191690555b5b5050565b60086020526000908152604090205481565b611045610854565b151561105057600080fd5b60005433600160a060020a0390811691161461106b57600080fd5b600254600160a060020a0316632a8092df6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110b357600080fd5b6102c65a03f115156110c457600080fd5b5050506040518051905015156110d957600080fd5b600b54600d54146110e957600080fd5b600254600160a060020a031663ef70aebf6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b5b565b610121670de0b6b3a76400005b046901723369b66846940000811515610bc257fe5b0481565b60075481565b60005433600160a060020a0390811691161461118857600080fd5b6000811161119557600080fd5b600a8190555b5b50565b600a5481565b6212750081565b60096020526000908152604090205481565b60055481565b60015460009033600160a060020a039081169116146111e257600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b610121670de0b6b3a76400005b04620186a00281565b600054600160a060020a031681565b606481565b600254600160a060020a031681565b60005433600160a060020a039081169116146112a757600080fd5b610f17828280806020026020016040519081016040528093929190818152602001838360200280828437506101219450670de0b6b3a764000093506112eb92505050565b04620186a0026118f3565b5b5b5050565b670de0b6b3a764000081565b600c60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6000805433600160a060020a0390811691161461135c57600080fd5b600160a060020a038316151561137157600080fd5b6000821161137e57600080fd5b600b5460646001909101111561139357600080fd5b600160a060020a0383166000908152600c6020526040902054156113b657600080fd5b5060005b600b548110156114135782600160a060020a0316600b828154811015156113dd57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416141561140a57600080fd5b5b6001016113ba565b600b805460018101611425838261199b565b916000526020600020900160005b8154600160a060020a038088166101009390930a928302920219161790555060c06040519081016040908152838252600060208084018290526301e133808385018190526060850152620151806080850152603260a0850152600160a060020a0387168252600c905220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b505050565b60005433600160a060020a0390811691161461150857600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b60005433600160a060020a0390811691161461158c57600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b600154600160a060020a031681565b600b80548290811061160057fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805433600160a060020a0390811691161461164057600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156116a657600080fd5b6102c65a03f115156116b757600080fd5b50505060405180519150505b5b92915050565b6901723369b6684694000081565b733bf4bbe253153678e9e8e540395c22bff7fca87d81565b60005433600160a060020a0390811691161461170b57600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b6c7e37be2022c0914b268000000081565b600a81565b600354600160a060020a031681565b7356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a081565b60008183106117c057816117c2565b825b90505b92915050565b6000828211156117d757fe5b508082035b92915050565b60008082848115156117f057fe5b0490508091505b5092915050565b60008282018381101561180d57fe5b8091505b5092915050565b6000828202831580611834575082848281151561183157fe5b04145b151561180d57fe5b8091505b5092915050565b600254600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561189d57600080fd5b6102c65a03f115156118ae57600080fd5b50505081600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08260405190815260200160405180910390a25b5050565b6000805433600160a060020a0390811691161461190f57600080fd5b5060005b8251811015610c3157816009600085848151811061192d57fe5b90602001906020020151600160a060020a031681526020810191909152604001600020555b600101611913565b5b5b505050565b60c0604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681525090565b815481835581811511610c3157600083815260209020610c319181019083016119c5565b5b505050565b61087b91905b808211156119df57600081556001016119cb565b5090565b90565b60005433600160a060020a03908116911614611a0157600080fd5b600b805460018101611a13838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09091021790555060c060405190810160405280611a8e60646109696c7e37be2022c0914b2680000000603c63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526305a39a80606084015262015180608084015260a09092018190527356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09052600c90527fd06905af1297742ddb9ac089725ec482c86000f9368110004c772fb62e96d44c815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101611b53838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a9182021916733bf4bbe253153678e9e8e540395c22bff7fca87d9091021790555060c060405190810160405280611bce60646109696c7e37be2022c0914b2680000000601e63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526304536c006060840152626ebe006080840152606460a090930192909252733bf4bbe253153678e9e8e540395c22bff7fca87d9052600c90527f4045339027fddef4527290ad0313e692803d46494547232e9766f18e24607f88815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b5600a165627a7a72305820b2f21fbb30c08fd1433c3249459f404691a8b60ba11a2f7131f4be07163a715b002960606040526006805460ff191660011790555b60018054600160a060020a03191633600160a060020a03161790555b5b610bd88061003e6000396000f300606060405236156100ee5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100f35780630952c5041461017e578063095ea7b31461019f57806318160ddd146101d557806323b872dd146101fa5780632a8092df14610236578063313ce5671461025d57806340c10f191461028657806370a08231146102aa57806379ba5097146102db5780638da5cb5b146102f057806395d89b411461031f578063a9059cbb146103aa578063d091b550146103e0578063dc39d06d1461040f578063dd62ed3e14610445578063ef70aebf1461047c575b600080fd5b34156100fe57600080fd5b610106610491565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561018957600080fd5b61019d600160a060020a03600435166104c8565b005b34156101aa57600080fd5b6101c1600160a060020a036004351660243561055d565b604051901515815260200160405180910390f35b34156101e057600080fd5b6101e8610584565b60405190815260200160405180910390f35b341561020557600080fd5b6101c1600160a060020a036004358116906024351660443561058a565b604051901515815260200160405180910390f35b341561024157600080fd5b6101c16105b3565b604051901515815260200160405180910390f35b341561026857600080fd5b6102706105bc565b60405160ff909116815260200160405180910390f35b341561029157600080fd5b61019d600160a060020a03600435166024356105c1565b005b34156102b557600080fd5b6101e8600160a060020a0360043516610685565b60405190815260200160405180910390f35b34156102e657600080fd5b61019d6106a4565b005b34156102fb57600080fd5b610303610733565b604051600160a060020a03909116815260200160405180910390f35b341561032a57600080fd5b610106610742565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103b557600080fd5b6101c1600160a060020a0360043516602435610779565b604051901515815260200160405180910390f35b34156103eb57600080fd5b6103036107a0565b604051600160a060020a03909116815260200160405180910390f35b341561041a57600080fd5b6101c1600160a060020a03600435166024356107af565b604051901515815260200160405180910390f35b341561045057600080fd5b6101e8600160a060020a036004358116906024351661086d565b60405190815260200160405180910390f35b341561048757600080fd5b61019d61089a565b005b60408051908101604052600381527f4b696e0000000000000000000000000000000000000000000000000000000000602082015281565b60015433600160a060020a039081169116146104e357600080fd5b600160a060020a03811615156104f857600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b60065460009060ff161561057057600080fd5b61057a8383610900565b90505b5b92915050565b60035481565b60065460009060ff161561059d57600080fd5b6105a88484846109a9565b90505b5b9392505050565b60065460ff1681565b601281565b60015433600160a060020a039081169116146105dc57600080fd5b60065460ff1615156105ed57600080fd5b600354610600908263ffffffff610abb16565b600355600160a060020a03821660009081526005602052604090205461062c908263ffffffff610abb16565b600160a060020a0383166000818152600560205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9084905190815260200160405180910390a35b5b5b5050565b600160a060020a0381166000908152600560205260409020545b919050565b60025460009033600160a060020a039081169116146106c257600080fd5b50600180546002805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b600154600160a060020a031681565b60408051908101604052600381527f4b494e0000000000000000000000000000000000000000000000000000000000602082015281565b60065460009060ff161561078c57600080fd5b61057a8383610ad5565b90505b5b92915050565b600254600160a060020a031681565b60015460009033600160a060020a039081169116146107cd57600080fd5b600154600160a060020a038085169163a9059cbb9116846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561084957600080fd5b6102c65a03f1151561085a57600080fd5b50505060405180519150505b5b92915050565b600160a060020a038083166000908152600460209081526040808320938516835292905220545b92915050565b60015433600160a060020a039081169116146108b557600080fd5b60065460ff1615156108c6576108fd565b6006805460ff191690557ff48339e4a272bd7aee715c343ca34ad137607f1df78cf8d7ba137228954d2d8560405160405180910390a15b5b565b600081158015906109355750600160a060020a0333811660009081526004602090815260408083209387168352929052205415155b1561093f57600080fd5b600160a060020a03338116600081815260046020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b600160a060020a0380841660008181526004602090815260408083203390951683529381528382205492825260059052918220546109ed908463ffffffff610b9516565b600160a060020a038087166000908152600560205260408082209390935590861681522054610a22908463ffffffff610abb16565b600160a060020a038516600090815260056020526040902055610a4b818463ffffffff610b9516565b600160a060020a03808716600081815260046020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b509392505050565b600082820183811015610aca57fe5b8091505b5092915050565b600160a060020a033316600090815260056020526040812054610afe908363ffffffff610b9516565b600160a060020a033381166000908152600560205260408082209390935590851681522054610b33908363ffffffff610abb16565b600160a060020a0380851660008181526005602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b92915050565b600082821115610ba157fe5b508082035b929150505600a165627a7a723058203b88537fce9422de85446a6e402b3642009e6557f14364ffb0a9244cd944063400296060604052341561000f57600080fd5b604051602080610ca5833981016040528080519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a038116151561005857600080fd5b60028054600160a060020a031916600160a060020a0383161790555b505b610c20806100856000396000f300606060405236156100935763ffffffff60e060020a6000350416630952c50481146100985780631a64adae146100b957806374a8f103146100ed57806379ba50971461010e5780637c17357d1461012357806383fcf973146101485780638da5cb5b1461015d578063957924301461018c5780639743efe5146101c1578063b869cea3146101f0578063d091b5501461024d575b600080fd5b34156100a357600080fd5b6100b7600160a060020a036004351661027c565b005b34156100c457600080fd5b6100db600160a060020a0360043516602435610311565b60405190815260200160405180910390f35b34156100f857600080fd5b6100b7600160a060020a03600435166103ae565b005b341561011957600080fd5b6100b7610586565b005b341561012e57600080fd5b6100db610615565b60405190815260200160405180910390f35b341561015357600080fd5b6100b761061b565b005b341561016857600080fd5b6101706107c0565b604051600160a060020a03909116815260200160405180910390f35b341561019757600080fd5b6100b7600160a060020a036004351660243560443560643560843560a43560c43515156107cf565b005b34156101cc57600080fd5b610170610a24565b604051600160a060020a03909116815260200160405180910390f35b34156101fb57600080fd5b61020f600160a060020a0360043516610a33565b60405196875260208701959095526040808701949094526060860192909252608085015260a084015290151560c083015260e0909101905180910390f35b341561025857600080fd5b610170610a74565b604051600160a060020a03909116815260200160405180910390f35b60005433600160a060020a0390811691161461029757600080fd5b600160a060020a03811615156102ac57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b600061031b610bb4565b600160a060020a038416600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015290508051151561039a57600091506103a7565b6103a48184610a83565b91505b5092915050565b6103b6610bb4565b6000805433600160a060020a039081169116146103d257600080fd5b600160a060020a038316600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c0820190815290925051151561044f57600080fd5b6104658260a0015183519063ffffffff610b3816565b600160a060020a03841660009081526003602081905260408220828155600181018390556002810183905590810182905560048082018390556005820192909255600601805460ff19169055549091506104c5908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561052757600080fd5b6102c65a03f1151561053857600080fd5b50505060405180515050600160a060020a0383167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f8260405190815260200160405180910390a25b5b505050565b60015460009033600160a060020a039081169116146105a457600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b60045481565b600160a060020a033316600090815260036020526040812080549091908190151561064557600080fd5b6106a18360e0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015242610a83565b91508115156106af57610580565b60058301546106c590839063ffffffff610b3816565b90508015156106d357610580565b60058301546106e8908263ffffffff610b4f16565b6005840155600454610700908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561076257600080fd5b6102c65a03f1151561077357600080fd5b50505060405180515050600160a060020a0333167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888260405190815260200160405180910390a25b505050565b600054600160a060020a031681565b60005433600160a060020a039081169116146107ea57600080fd5b600160a060020a03871615156107ff57600080fd5b30600160a060020a031687600160a060020a03161415151561082057600080fd5b6000861161082d57600080fd5b600160a060020a0387166000908152600360205260409020541561085057600080fd5b8385111580156108605750828411155b151561086b57600080fd5b60008211801561088a5750610886838663ffffffff610b3816565b8211155b151561089557600080fd5b600254600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156108ee57600080fd5b6102c65a03f115156108ff57600080fd5b505050604051805160045490915061091d908863ffffffff610b4f16565b111561092857600080fd5b60e0604051908101604090815287825260208083018890528183018790526060830186905260808301859052600060a0840181905284151560c0850152600160a060020a038b168152600390915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff1916911515919091179055506004546109d59087610b4f565b600455600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458860405190815260200160405180910390a35b5b50505050505050565b600254600160a060020a031681565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006909501549395929492939192909160ff1687565b600154600160a060020a031681565b60008060008460400151841015610a9d5760009250610b30565b84606001518410610ab15784519250610b30565b610ada8560800151610ace8760200151879063ffffffff610b3816565b9063ffffffff610b6916565b9150610af5856020015186606001519063ffffffff610b3816565b9050610b2d81610ace610b138860800151869063ffffffff610b8516565b88519063ffffffff610b8516565b9063ffffffff610b6916565b92505b505092915050565b600082821115610b4457fe5b508082035b92915050565b600082820183811015610b5e57fe5b8091505b5092915050565b6000808284811515610b7757fe5b0490508091505b5092915050565b6000828202831580610ba15750828482811515610b9e57fe5b04145b1515610b5e57fe5b8091505b5092915050565b60e06040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815250905600a165627a7a72305820708f9ef9bc918f9f6b04a96203db265d6bebb7e7894a325391b1ea397d60cdfa00290000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b70060000000000000000000000000000000000000000000000000000000059b7da50

Deployed Bytecode

0x606060405236156101e85763ffffffff60e060020a6000350416630423974381146102185780630952c5041461023d57806317f5de951461025e5780631bb534ba14610283578063301dd027146102b25780633197cbb6146102d757806332bbc1c8146102fc578063333abd901461032157806334fa37da1461033657806335400daf1461034b5780633b8253021461036b578063494329231461038c5780634bb278f3146103bd5780634bc4d2ba146103d2578063518ab2a8146103f7578063643294001461041c57806365b9e37d146104345780636d79207c1461045957806376e532211461047e57806378e97925146104af57806379ba5097146104d4578063830ced52146104e95780638da5cb5b1461050e57806391f5f3c91461053d5780639743efe5146105625780639ed9331814610591578063a3ea478f146105a7578063a5c9cd82146105c7578063b81a4d8f146105ec578063b8ad2abe14610646578063c28f9df11461066a578063cfabe67b1461068b578063d091b550146106a0578063dbeea819146106cf578063dc39d06d14610701578063e264a2f414610737578063e4b1443b1461075c578063e5e534931461078b578063f47c84c5146107ac578063fa73af0b146107d1578063fdf97cb2146107f6578063ff25f85914610825575b5b6101f1610854565b15801561020057506005544210155b151561020b57600080fd5b6102143361087e565b5b5b005b341561022357600080fd5b61022b610aee565b60405190815260200160405180910390f35b341561024857600080fd5b610214600160a060020a0360043516610af4565b005b341561026957600080fd5b61022b610b89565b60405190815260200160405180910390f35b341561028e57600080fd5b610296610b9a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b61022b610ba9565b60405190815260200160405180910390f35b34156102e257600080fd5b61022b610baf565b60405190815260200160405180910390f35b341561030757600080fd5b61022b610bb5565b60405190815260200160405180910390f35b341561032c57600080fd5b610214610bc6565b005b341561034157600080fd5b610214610c38565b005b341561035657600080fd5b6102146004803560248101910135610ec2565b005b341561037657600080fd5b610214600160a060020a0360043516610f1d565b005b341561039757600080fd5b61022b600160a060020a036004351661102b565b60405190815260200160405180910390f35b34156103c857600080fd5b61021461103d565b005b34156103dd57600080fd5b61022b611141565b60405190815260200160405180910390f35b341561040257600080fd5b61022b611167565b60405190815260200160405180910390f35b341561042757600080fd5b61021460043561116d565b005b341561043f57600080fd5b61022b61119f565b60405190815260200160405180910390f35b341561046457600080fd5b61022b6111a5565b60405190815260200160405180910390f35b341561048957600080fd5b61022b600160a060020a03600435166111ac565b60405190815260200160405180910390f35b34156104ba57600080fd5b61022b6111be565b60405190815260200160405180910390f35b34156104df57600080fd5b6102146111c4565b005b34156104f457600080fd5b61022b611253565b60405190815260200160405180910390f35b341561051957600080fd5b610296611269565b604051600160a060020a03909116815260200160405180910390f35b341561054857600080fd5b61022b611278565b60405190815260200160405180910390f35b341561056d57600080fd5b61029661127d565b604051600160a060020a03909116815260200160405180910390f35b610214600160a060020a036004351661087e565b005b34156105b257600080fd5b610214600480356024810191013561128c565b005b34156105d257600080fd5b61022b6112fc565b60405190815260200160405180910390f35b34156105f757600080fd5b61060b600160a060020a0360043516611308565b60405195865260208601949094526040808601939093526060850191909152608084015260ff90911660a083015260c0909101905180910390f35b341561065157600080fd5b610214600160a060020a0360043516602435611340565b005b341561067557600080fd5b610214600160a060020a03600435166114ed565b005b341561069657600080fd5b610214611571565b005b34156106ab57600080fd5b6102966115e3565b604051600160a060020a03909116815260200160405180910390f35b34156106da57600080fd5b6102966004356115f2565b604051600160a060020a03909116815260200160405180910390f35b341561070c57600080fd5b610723600160a060020a0360043516602435611624565b604051901515815260200160405180910390f35b341561074257600080fd5b61022b6116ca565b60405190815260200160405180910390f35b341561076757600080fd5b6102966116d8565b604051600160a060020a03909116815260200160405180910390f35b341561079657600080fd5b610214600160a060020a03600435166116f0565b005b34156107b757600080fd5b61022b611774565b60405190815260200160405180910390f35b34156107dc57600080fd5b61022b611785565b60405190815260200160405180910390f35b341561080157600080fd5b61029661178a565b604051600160a060020a03909116815260200160405180910390f35b341561083057600080fd5b610296611799565b604051600160a060020a03909116815260200160405180910390f35b6000670de0b6b3a764000064774135531f0260075410158061087857506006544210155b90505b90565b600080600080600080600080610892610854565b1580156108a157506005544210155b15156108ac57600080fd5b600160a060020a03891615156108c157600080fd5b600160a060020a033316600090815260086020908152604080832054600990925290912054600a549199506108f5916117b1565b96506109103461090b898b63ffffffff6117cb16565b6117b1565b95506000861161091f57600080fd5b610975610121670de0b6b3a76400005b046901723369b6684694000081151561094457fe5b04610969600754670de0b6b3a764000064774135531f026117cb90919063ffffffff16565b9063ffffffff6117e216565b945061098186866117b1565b9350610993888563ffffffff6117fe16565b600160a060020a033381166000908152600860205260409081902092909255600454169085156108fc0290869051600060405180830381858888f1935050505015156109de57600080fd5b6007546109ff906c0676fddfedc9a06abab11c00009063ffffffff6117cb16565b9250610a35610121670de0b6b3a76400005b046901723369b66846940000811515610a2657fe5b8691900463ffffffff61181816565b9150610121670de0b6b3a76400005b046901723369b66846940000811515610a5957fe5b04610a6a848463ffffffff6117cb16565b1015610a74578291505b600754610a87908363ffffffff6117fe16565b600755610a948983611847565b610aa4348563ffffffff6117cb16565b90506000811115610ae057600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610ae057600080fd5b5b5b5b505050505050505050565b600d5481565b60005433600160a060020a03908116911614610b0f57600080fd5b600160a060020a0381161515610b2457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b6c0676fddfedc9a06abab11c000081565b600454600160a060020a031681565b60001981565b60065481565b610121670de0b6b3a76400005b0481565b60005433600160a060020a03908116911614610be157600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b6000806000610c45611961565b6000806000610c52610854565b1515610c5d57600080fd5b60005433600160a060020a03908116911614610c7857600080fd5b600b54600d54610c8b9190600a016117b1565b9650600d5495505b86861015610eb657600b805487908110610ca957fe5b906000526020600020900160005b9054600160a060020a036101009290920a9004166000818152600c60205260409081902091965060c0905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff1660a0820152600754909450610d5a906c0676fddfedc9a06abab11c0000906109699087519063ffffffff61181816565b9063ffffffff6117e216565b9250610d8560646109698660a00151869060ff1663ffffffff61181816565b9063ffffffff6117e216565b9150610d97838363ffffffff6117cb16565b90506000811115610dac57610dac8582611847565b5b6000821115610ea157600354610dcc90600160a060020a031683611847565b600354600160a060020a031663957924308684610df46020890151429063ffffffff6117fe16565b610e098960400151429063ffffffff6117fe16565b610e1e8a60600151429063ffffffff6117fe16565b8a60800151600160405160e060020a63ffffffff8a16028152600160a060020a039097166004880152602487019590955260448601939093526064850191909152608484015260a4830152151560c482015260e401600060405180830381600087803b1515610e8c57600080fd5b6102c65a03f11515610e9d57600080fd5b5050505b600d805460010190555b600190950194610c93565b5b5b5b50505050505050565b60005433600160a060020a03908116911614610edd57600080fd5b610f178282808060200260200160405190810160405280939291908181526020018383602002808284375060001994506118f39350505050565b5b5b5050565b6000805433600160a060020a03908116911614610f3957600080fd5b600160a060020a0382161515610f4e57600080fd5b5060005b600b54811015610fe25781600160a060020a0316600b82815481101515610f7557fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610fd957600b805482908110610fb257fe5b906000526020600020900160005b6101000a815490600160a060020a030219169055610fe2565b5b600101610f52565b600160a060020a0382166000908152600c602052604081208181556001810182905560028101829055600381018290556004810191909155600501805460ff191690555b5b5050565b60086020526000908152604090205481565b611045610854565b151561105057600080fd5b60005433600160a060020a0390811691161461106b57600080fd5b600254600160a060020a0316632a8092df6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110b357600080fd5b6102c65a03f115156110c457600080fd5b5050506040518051905015156110d957600080fd5b600b54600d54146110e957600080fd5b600254600160a060020a031663ef70aebf6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b5b565b610121670de0b6b3a76400005b046901723369b66846940000811515610bc257fe5b0481565b60075481565b60005433600160a060020a0390811691161461118857600080fd5b6000811161119557600080fd5b600a8190555b5b50565b600a5481565b6212750081565b60096020526000908152604090205481565b60055481565b60015460009033600160a060020a039081169116146111e257600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b610121670de0b6b3a76400005b04620186a00281565b600054600160a060020a031681565b606481565b600254600160a060020a031681565b60005433600160a060020a039081169116146112a757600080fd5b610f17828280806020026020016040519081016040528093929190818152602001838360200280828437506101219450670de0b6b3a764000093506112eb92505050565b04620186a0026118f3565b5b5b5050565b670de0b6b3a764000081565b600c60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6000805433600160a060020a0390811691161461135c57600080fd5b600160a060020a038316151561137157600080fd5b6000821161137e57600080fd5b600b5460646001909101111561139357600080fd5b600160a060020a0383166000908152600c6020526040902054156113b657600080fd5b5060005b600b548110156114135782600160a060020a0316600b828154811015156113dd57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416141561140a57600080fd5b5b6001016113ba565b600b805460018101611425838261199b565b916000526020600020900160005b8154600160a060020a038088166101009390930a928302920219161790555060c06040519081016040908152838252600060208084018290526301e133808385018190526060850152620151806080850152603260a0850152600160a060020a0387168252600c905220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b505050565b60005433600160a060020a0390811691161461150857600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b60005433600160a060020a0390811691161461158c57600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b600154600160a060020a031681565b600b80548290811061160057fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805433600160a060020a0390811691161461164057600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156116a657600080fd5b6102c65a03f115156116b757600080fd5b50505060405180519150505b5b92915050565b6901723369b6684694000081565b733bf4bbe253153678e9e8e540395c22bff7fca87d81565b60005433600160a060020a0390811691161461170b57600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b6c7e37be2022c0914b268000000081565b600a81565b600354600160a060020a031681565b7356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a081565b60008183106117c057816117c2565b825b90505b92915050565b6000828211156117d757fe5b508082035b92915050565b60008082848115156117f057fe5b0490508091505b5092915050565b60008282018381101561180d57fe5b8091505b5092915050565b6000828202831580611834575082848281151561183157fe5b04145b151561180d57fe5b8091505b5092915050565b600254600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561189d57600080fd5b6102c65a03f115156118ae57600080fd5b50505081600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08260405190815260200160405180910390a25b5050565b6000805433600160a060020a0390811691161461190f57600080fd5b5060005b8251811015610c3157816009600085848151811061192d57fe5b90602001906020020151600160a060020a031681526020810191909152604001600020555b600101611913565b5b5b505050565b60c0604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681525090565b815481835581811511610c3157600083815260209020610c319181019083016119c5565b5b505050565b61087b91905b808211156119df57600081556001016119cb565b5090565b90565b60005433600160a060020a03908116911614611a0157600080fd5b600b805460018101611a13838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09091021790555060c060405190810160405280611a8e60646109696c7e37be2022c0914b2680000000603c63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526305a39a80606084015262015180608084015260a09092018190527356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09052600c90527fd06905af1297742ddb9ac089725ec482c86000f9368110004c772fb62e96d44c815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101611b53838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a9182021916733bf4bbe253153678e9e8e540395c22bff7fca87d9091021790555060c060405190810160405280611bce60646109696c7e37be2022c0914b2680000000601e63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526304536c006060840152626ebe006080840152606460a090930192909252733bf4bbe253153678e9e8e540395c22bff7fca87d9052600c90527f4045339027fddef4527290ad0313e692803d46494547232e9766f18e24607f88815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b5600a165627a7a72305820b2f21fbb30c08fd1433c3249459f404691a8b60ba11a2f7131f4be07163a715b0029

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

0000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b70060000000000000000000000000000000000000000000000000000000059b7da50

-----Decoded View---------------
Arg [0] : _fundingRecipient (address): 0x9Ea7BA960A2668Df52eE0389C4617D48853b7006
Arg [1] : _startTime (uint256): 1505221200

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b7006
Arg [1] : 0000000000000000000000000000000000000000000000000000000059b7da50


Swarm Source

bzzr://708f9ef9bc918f9f6b04a96203db265d6bebb7e7894a325391b1ea397d60cdfa

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.