Sponsored Link:  Download the Monaco app for Android and iOS on Aug 31 - www.mona.co
Contract Overview | KinTokenSale
ETH Balance: 0 Ether
ETH USD Value: $0
No Of Transactions: 18491 txns
Token Tracker 0x818Fc6C2Ec5986bc6E2CBf00939d90556aB12ce5
  Latest 25 txns from a total Of 18491 transactions (+1 PendingTxn) View All

TxHash Age From To Value [TxFee]
0x9c2180dd8b0e2af3791a86f018d020a2a1132405444302f280cd5b2a95781630(pending)2 mins ago0x9913f109d5a581833fae99278cd0994e4cddd87c  IN  0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb5.99 Ether(pending)
0xc023fffe4b69969a7189884fa235d71fe447414414123de4800c4e71cd6994916 mins ago0xc6709731475909c5f9dfe029814963f8285811bb  IN   KinTokenSale43.318 Ether0.001303428
0xabfe5d0752b366580bd117c6bb0ff5ce80ab721519a76ae0fc23e172a7fb675f11 mins ago0x91171480b09dad8b30e0f5be8854599ae73d6ea3  IN   KinTokenSale0.2 Ether0.0042
0x5594743cf313edd60e0fa537d3338aeda7de2daf6f0ce57668fc8108238f903a12 mins ago0x0e1adbd3fb37c3e8a8f57aa6157879132ec0eb52  IN   KinTokenSale7 Ether0.001303218
0x73774cf2575da405f97956f4278d36d7e235969157e335947f93d8856e37105212 mins ago0x5ffcf1f0f84cfc6fd881348ac8e74ec5856beefe  IN   KinTokenSale0.465 Ether0.00186204
0x0a980724188acbb286e5b053fc64439c9f18c7dae27b2c0df3db733934d4125639 mins ago0x00e88e7bc8575b7811a2ede1681ceaddad58d6d3  IN   KinTokenSale86 Ether0.0034814
0xf4a15e94aa570f3b1e88b99589b66fc5c7705aef778603969d0d18bb6b2fa7ee45 mins ago0x0e1adbd3fb37c3e8a8f57aa6157879132ec0eb52  IN   KinTokenSale0.5 Ether0.001303218
0x15a723befa16138d6168230798eba83ca72b96f7eb5a3ec470706702510f80c749 mins ago0x97ce4bbad87c68d18f9cf6b4b43099c8f7516b8b  IN   KinTokenSale0.2 Ether0.006
0x3da0930b607a90af540dd0254ede945d7223d757cd06ee99bc46285a9c352f1b1 hr 15 mins ago0x9be281cdcf34b3a01468ad1008139410ba5bb2fb  IN   KinTokenSale7.3089977 Ether0.001303428
0x3ac0bbbf794142fd2277b87f8d80a7edcafafbeece49f70177fc34fd805851d21 hr 42 mins ago0xeec36ff4f0b0faefe74a2d18fecf6c07184dfcb9  IN   KinTokenSale0.00079590023465 Ether0.001303428
0xe1fd8989b6220a2944e8d206a67a40c8db31ab1f30602a9fcd6a04384079b7c01 hr 50 mins ago0x7a8e1719241e5117ab49d70b5f43ce3525e31ea8  IN   KinTokenSale2 Ether0.001303428
0x0387cd8f378c083b484b2cc077a80de20229dc232daaf56d657ba457df8b7bbd1 hr 54 mins ago0x5ffcf1f0f84cfc6fd881348ac8e74ec5856beefe  IN   KinTokenSale1 Ether0.00175521341
0xe844764a3e0787da03263a6f39dfa9a1d52bef0fdbdc33eab66f17c62390ccca2 hrs 8 mins ago0x5ffcf1f0f84cfc6fd881348ac8e74ec5856beefe  IN   KinTokenSale1.003 Ether0.001365496
0x3254a6f01e75faae43ecef54f4ed25ec54fd36dffcc074702fa8be13488c944d2 hrs 9 mins ago0x5ffcf1f0f84cfc6fd881348ac8e74ec5856beefe  IN   KinTokenSale12.87 Ether0.001365496
0x4715dc7466833ee0f1962abd4c7620b93f54c7d28157b901917c04f01d97fac82 hrs 51 mins ago0xcbb13315d603cb0a311fd252e7ab0bfba96dfb22  IN   KinTokenSale0.5 Ether0.0042
0x8448cc82827e7b9739179592b5133967abfbadf147f7aa9a84f43e06e9bd791e2 hrs 57 mins ago0x6e01231d161d728cf5e520f7c21103660f46de3a  IN   KinTokenSale4 Ether0.0031034
0x03301cc23e183df82c1bdd43a37603b19a6178014d9cfcbdd69fd9bdf0acad493 hrs 14 mins ago0xad4500f9348e108a2f6b0e7e8b2faca31fd16b45  IN   KinTokenSale1 Ether0.001303428
0x72ef2f9186edb20c40f55d05f990508d841eed514e45f5ae61f08959f79de1d23 hrs 23 mins ago0x3ecdcea0f7b9f1b21180c4de45fc0546a94e3846  IN   KinTokenSale1.68 Ether0.00372348
0x3dd5d192331941979cbd716aab70445398b0c78934db96bb44da1732afa7663a3 hrs 50 mins ago0xbbd2e65afd28e73cab552ad55b972a016f98dfa4  IN   KinTokenSale3.83 Ether0.001303428
0xccf84320e5e838a89bcf1b4d87b5499ddd3cff0e2d5b4637db231232944c7f875 hrs 1 min ago0xb002c989a1a6cc4d92a8c472619a7803ab7850c0  IN   KinTokenSale7.05 Ether0.001764987979
0x2643b0a756d420d3230cd020dfa1fd85f783067f532ef8932b909d775d4085e25 hrs 13 mins ago0xb002c989a1a6cc4d92a8c472619a7803ab7850c0  IN   KinTokenSale11.25 Ether0.001764987979
0xad2fc7073118b48814bc7ed9d32fdc094e0dfe1673749c268260fcae4e7cd3556 hrs 6 mins ago0xf309601c5e8eb9bb663ecb2b50b5184712609ac9  IN   KinTokenSale0.5 Ether0.0042
0xb2648166b4b253103b019dde37b66320fe7140d70c7a905d78850e4beec167017 hrs 57 mins ago0xe447a2b7c1b7740b58f4775bfb67df12d6b6e786  IN   KinTokenSale0.698101726 Ether0.00186174
0xb8afb3fe9dc2e0494dc54cf0aade8bb125c6d3b442f042ba107e9dc474dcdb868 hrs 6 mins ago0xaa7ea2947670aa768bed3ca2b2efda7459edc466  IN   KinTokenSale0.4533753 Ether0.0031029
0x29f87c6b4f482dd08b67d899ab0358319713eb1ec38adad88f649a32c0ec23a68 hrs 16 mins ago0x37a4b95b001bcbc81604a3e6b5eb7be3714642a1  IN   KinTokenSale0.1 Ether0.0042
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
  Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0xc023fffe4b69969a7189884fa235d71fe447414414123de4800c4e71cd69949143072236 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700643.318 Ether
0x5594743cf313edd60e0fa537d3338aeda7de2daf6f0ce57668fc8108238f903a430720912 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70067 Ether
0x73774cf2575da405f97956f4278d36d7e235969157e335947f93d8856e371052430720812 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.465 Ether
0x0a980724188acbb286e5b053fc64439c9f18c7dae27b2c0df3db733934d41256430716939 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x00e88e7bc8575b7811a2ede1681ceaddad58d6d34.179930795847789571 Ether
0x0a980724188acbb286e5b053fc64439c9f18c7dae27b2c0df3db733934d41256430716939 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700681.820069204152210429 Ether
0xf4a15e94aa570f3b1e88b99589b66fc5c7705aef778603969d0d18bb6b2fa7ee430715945 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.5 Ether
0x3da0930b607a90af540dd0254ede945d7223d757cd06ee99bc46285a9c352f1b43070971 hr 15 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70067.3089977 Ether
0x3ac0bbbf794142fd2277b87f8d80a7edcafafbeece49f70177fc34fd805851d243070351 hr 42 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.00079590023465 Ether
0xe1fd8989b6220a2944e8d206a67a40c8db31ab1f30602a9fcd6a04384079b7c043070151 hr 50 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70062 Ether
0x0387cd8f378c083b484b2cc077a80de20229dc232daaf56d657ba457df8b7bbd43070021 hr 54 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70061 Ether
0xe844764a3e0787da03263a6f39dfa9a1d52bef0fdbdc33eab66f17c62390ccca43069782 hrs 8 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70061.003 Ether
0x3254a6f01e75faae43ecef54f4ed25ec54fd36dffcc074702fa8be13488c944d43069752 hrs 9 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700612.87 Ether
0x8448cc82827e7b9739179592b5133967abfbadf147f7aa9a84f43e06e9bd791e43068772 hrs 57 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70064 Ether
0x03301cc23e183df82c1bdd43a37603b19a6178014d9cfcbdd69fd9bdf0acad4943068323 hrs 14 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70061 Ether
0x72ef2f9186edb20c40f55d05f990508d841eed514e45f5ae61f08959f79de1d243068163 hrs 23 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70061.68 Ether
0x3dd5d192331941979cbd716aab70445398b0c78934db96bb44da1732afa7663a43067583 hrs 50 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70063.83 Ether
0xccf84320e5e838a89bcf1b4d87b5499ddd3cff0e2d5b4637db231232944c7f8743066195 hrs 1 min ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70067.05 Ether
0x2643b0a756d420d3230cd020dfa1fd85f783067f532ef8932b909d775d4085e243066015 hrs 13 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700611.25 Ether
0xb2648166b4b253103b019dde37b66320fe7140d70c7a905d78850e4beec1670143062637 hrs 57 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.698101726 Ether
0xb8afb3fe9dc2e0494dc54cf0aade8bb125c6d3b442f042ba107e9dc474dcdb8643062378 hrs 6 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.4533753 Ether
0x8beca1ebdb652a42bd1f4fbb01c2e5eaa27960d9b073cc789babf6263d4d539b43061968 hrs 29 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70062 Ether
0xa3ad5ef14db3e91a371e4fd1f0b0655f3fcbbcfb0a8af9f7e29e989a252d068843061518 hrs 53 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70063.248783572 Ether
0xb85762c6b554fa3005dc11d1af772f9797ccbe31c6836ea8d4be4e9b2e71eca843061369 hrs 4 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.15 Ether
0xa1be1cf887d33ee885b940bfb0331766bdd22a178a901e2205c2da4e0df40b3543061289 hrs 7 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700612 Ether
0x841bab60de3f28ea39199fcca570820288486446bccc936a8cf4eb980071ae92430585911 hrs 16 mins ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700625 Ether
[ Download CSV Export  ] 
Contract Source Code Verified
Contract Name: KinTokenSale
Compiler Version: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts
pragma solidity ^0.4.15;

/// @title 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 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"}]

  Contract Creation Code Switch To Opcodes View
60606040526000600755610121670de0b6b3a76400005b0461112902600a556000600d5534156200002f57600080fd5b60405160408062003a6d83398101604052808051919060200180519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a03821615156200008157600080fd5b4281116200008e57600080fd5b620000986200047b565b604051809103906000f0801515620000af57600080fd5b60028054600160a060020a031916600160a060020a03928316179081905516620000d86200048c565b600160a060020a039091168152602001604051809103906000f0801515620000ff57600080fd5b60038054600160a060020a0319908116600160a060020a0393841617909155600480549091169184169190911790556005819055621275008101600655620001546401000000006200015d8102620019e61704565b5b5050620004ee565b60005433600160a060020a039081169116146200017957600080fd5b600b8054600181016200018d83826200049d565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09091021790555060c0604051908101604052806200021c6064620002076c7e37be2022c0914b2680000000603c640100000000620018186200042c82021704565b90640100000000620017e26200045e82021704565b815260006020808301829052604083018290526305a39a80606084015262015180608084015260a09092018190527356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09052600c90527fd06905af1297742ddb9ac089725ec482c86000f9368110004c772fb62e96d44c815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101620002e383826200049d565b916000526020600020900160005b8154600160a060020a036101009290920a9182021916733bf4bbe253153678e9e8e540395c22bff7fca87d9091021790555060c060405190810160405280620003726064620002076c7e37be2022c0914b2680000000601e640100000000620018186200042c82021704565b90640100000000620017e26200045e82021704565b815260006020808301829052604083018290526304536c006060840152626ebe006080840152606460a090930192909252733bf4bbe253153678e9e8e540395c22bff7fca87d9052600c90527f4045339027fddef4527290ad0313e692803d46494547232e9766f18e24607f88815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b565b60008282028315806200044a57508284828115156200044757fe5b04145b15156200045357fe5b8091505b5092915050565b60008082848115156200046d57fe5b0490508091505b5092915050565b604051610c1680620021b283390190565b604051610ca58062002dc883390190565b815481835581811511620004c457600083815260209020620004c4918101908301620004ca565b5b505050565b620004eb91905b80821115620004e75760008155600101620004d1565b5090565b90565b611cb480620004fe6000396000f300606060405236156101e85763ffffffff60e060020a6000350416630423974381146102185780630952c5041461023d57806317f5de951461025e5780631bb534ba14610283578063301dd027146102b25780633197cbb6146102d757806332bbc1c8146102fc578063333abd901461032157806334fa37da1461033657806335400daf1461034b5780633b8253021461036b578063494329231461038c5780634bb278f3146103bd5780634bc4d2ba146103d2578063518ab2a8146103f7578063643294001461041c57806365b9e37d146104345780636d79207c1461045957806376e532211461047e57806378e97925146104af57806379ba5097146104d4578063830ced52146104e95780638da5cb5b1461050e57806391f5f3c91461053d5780639743efe5146105625780639ed9331814610591578063a3ea478f146105a7578063a5c9cd82146105c7578063b81a4d8f146105ec578063b8ad2abe14610646578063c28f9df11461066a578063cfabe67b1461068b578063d091b550146106a0578063dbeea819146106cf578063dc39d06d14610701578063e264a2f414610737578063e4b1443b1461075c578063e5e534931461078b578063f47c84c5146107ac578063fa73af0b146107d1578063fdf97cb2146107f6578063ff25f85914610825575b5b6101f1610854565b15801561020057506005544210155b151561020b57600080fd5b6102143361087e565b5b5b005b341561022357600080fd5b61022b610aee565b60405190815260200160405180910390f35b341561024857600080fd5b610214600160a060020a0360043516610af4565b005b341561026957600080fd5b61022b610b89565b60405190815260200160405180910390f35b341561028e57600080fd5b610296610b9a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b61022b610ba9565b60405190815260200160405180910390f35b34156102e257600080fd5b61022b610baf565b60405190815260200160405180910390f35b341561030757600080fd5b61022b610bb5565b60405190815260200160405180910390f35b341561032c57600080fd5b610214610bc6565b005b341561034157600080fd5b610214610c38565b005b341561035657600080fd5b6102146004803560248101910135610ec2565b005b341561037657600080fd5b610214600160a060020a0360043516610f1d565b005b341561039757600080fd5b61022b600160a060020a036004351661102b565b60405190815260200160405180910390f35b34156103c857600080fd5b61021461103d565b005b34156103dd57600080fd5b61022b611141565b60405190815260200160405180910390f35b341561040257600080fd5b61022b611167565b60405190815260200160405180910390f35b341561042757600080fd5b61021460043561116d565b005b341561043f57600080fd5b61022b61119f565b60405190815260200160405180910390f35b341561046457600080fd5b61022b6111a5565b60405190815260200160405180910390f35b341561048957600080fd5b61022b600160a060020a03600435166111ac565b60405190815260200160405180910390f35b34156104ba57600080fd5b61022b6111be565b60405190815260200160405180910390f35b34156104df57600080fd5b6102146111c4565b005b34156104f457600080fd5b61022b611253565b60405190815260200160405180910390f35b341561051957600080fd5b610296611269565b604051600160a060020a03909116815260200160405180910390f35b341561054857600080fd5b61022b611278565b60405190815260200160405180910390f35b341561056d57600080fd5b61029661127d565b604051600160a060020a03909116815260200160405180910390f35b610214600160a060020a036004351661087e565b005b34156105b257600080fd5b610214600480356024810191013561128c565b005b34156105d257600080fd5b61022b6112fc565b60405190815260200160405180910390f35b34156105f757600080fd5b61060b600160a060020a0360043516611308565b60405195865260208601949094526040808601939093526060850191909152608084015260ff90911660a083015260c0909101905180910390f35b341561065157600080fd5b610214600160a060020a0360043516602435611340565b005b341561067557600080fd5b610214600160a060020a03600435166114ed565b005b341561069657600080fd5b610214611571565b005b34156106ab57600080fd5b6102966115e3565b604051600160a060020a03909116815260200160405180910390f35b34156106da57600080fd5b6102966004356115f2565b604051600160a060020a03909116815260200160405180910390f35b341561070c57600080fd5b610723600160a060020a0360043516602435611624565b604051901515815260200160405180910390f35b341561074257600080fd5b61022b6116ca565b60405190815260200160405180910390f35b341561076757600080fd5b6102966116d8565b604051600160a060020a03909116815260200160405180910390f35b341561079657600080fd5b610214600160a060020a03600435166116f0565b005b34156107b757600080fd5b61022b611774565b60405190815260200160405180910390f35b34156107dc57600080fd5b61022b611785565b60405190815260200160405180910390f35b341561080157600080fd5b61029661178a565b604051600160a060020a03909116815260200160405180910390f35b341561083057600080fd5b610296611799565b604051600160a060020a03909116815260200160405180910390f35b6000670de0b6b3a764000064774135531f0260075410158061087857506006544210155b90505b90565b600080600080600080600080610892610854565b1580156108a157506005544210155b15156108ac57600080fd5b600160a060020a03891615156108c157600080fd5b600160a060020a033316600090815260086020908152604080832054600990925290912054600a549199506108f5916117b1565b96506109103461090b898b63ffffffff6117cb16565b6117b1565b95506000861161091f57600080fd5b610975610121670de0b6b3a76400005b046901723369b6684694000081151561094457fe5b04610969600754670de0b6b3a764000064774135531f026117cb90919063ffffffff16565b9063ffffffff6117e216565b945061098186866117b1565b9350610993888563ffffffff6117fe16565b600160a060020a033381166000908152600860205260409081902092909255600454169085156108fc0290869051600060405180830381858888f1935050505015156109de57600080fd5b6007546109ff906c0676fddfedc9a06abab11c00009063ffffffff6117cb16565b9250610a35610121670de0b6b3a76400005b046901723369b66846940000811515610a2657fe5b8691900463ffffffff61181816565b9150610121670de0b6b3a76400005b046901723369b66846940000811515610a5957fe5b04610a6a848463ffffffff6117cb16565b1015610a74578291505b600754610a87908363ffffffff6117fe16565b600755610a948983611847565b610aa4348563ffffffff6117cb16565b90506000811115610ae057600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610ae057600080fd5b5b5b5b505050505050505050565b600d5481565b60005433600160a060020a03908116911614610b0f57600080fd5b600160a060020a0381161515610b2457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b6c0676fddfedc9a06abab11c000081565b600454600160a060020a031681565b60001981565b60065481565b610121670de0b6b3a76400005b0481565b60005433600160a060020a03908116911614610be157600080fd5b600254600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b6000806000610c45611961565b6000806000610c52610854565b1515610c5d57600080fd5b60005433600160a060020a03908116911614610c7857600080fd5b600b54600d54610c8b9190600a016117b1565b9650600d5495505b86861015610eb657600b805487908110610ca957fe5b906000526020600020900160005b9054600160a060020a036101009290920a9004166000818152600c60205260409081902091965060c0905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff1660a0820152600754909450610d5a906c0676fddfedc9a06abab11c0000906109699087519063ffffffff61181816565b9063ffffffff6117e216565b9250610d8560646109698660a00151869060ff1663ffffffff61181816565b9063ffffffff6117e216565b9150610d97838363ffffffff6117cb16565b90506000811115610dac57610dac8582611847565b5b6000821115610ea157600354610dcc90600160a060020a031683611847565b600354600160a060020a031663957924308684610df46020890151429063ffffffff6117fe16565b610e098960400151429063ffffffff6117fe16565b610e1e8a60600151429063ffffffff6117fe16565b8a60800151600160405160e060020a63ffffffff8a16028152600160a060020a039097166004880152602487019590955260448601939093526064850191909152608484015260a4830152151560c482015260e401600060405180830381600087803b1515610e8c57600080fd5b6102c65a03f11515610e9d57600080fd5b5050505b600d805460010190555b600190950194610c93565b5b5b5b50505050505050565b60005433600160a060020a03908116911614610edd57600080fd5b610f178282808060200260200160405190810160405280939291908181526020018383602002808284375060001994506118f39350505050565b5b5b5050565b6000805433600160a060020a03908116911614610f3957600080fd5b600160a060020a0382161515610f4e57600080fd5b5060005b600b54811015610fe25781600160a060020a0316600b82815481101515610f7557fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610fd957600b805482908110610fb257fe5b906000526020600020900160005b6101000a815490600160a060020a030219169055610fe2565b5b600101610f52565b600160a060020a0382166000908152600c602052604081208181556001810182905560028101829055600381018290556004810191909155600501805460ff191690555b5b5050565b60086020526000908152604090205481565b611045610854565b151561105057600080fd5b60005433600160a060020a0390811691161461106b57600080fd5b600254600160a060020a0316632a8092df6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156110b357600080fd5b6102c65a03f115156110c457600080fd5b5050506040518051905015156110d957600080fd5b600b54600d54146110e957600080fd5b600254600160a060020a031663ef70aebf6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b5b565b610121670de0b6b3a76400005b046901723369b66846940000811515610bc257fe5b0481565b60075481565b60005433600160a060020a0390811691161461118857600080fd5b6000811161119557600080fd5b600a8190555b5b50565b600a5481565b6212750081565b60096020526000908152604090205481565b60055481565b60015460009033600160a060020a039081169116146111e257600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b610121670de0b6b3a76400005b04620186a00281565b600054600160a060020a031681565b606481565b600254600160a060020a031681565b60005433600160a060020a039081169116146112a757600080fd5b610f17828280806020026020016040519081016040528093929190818152602001838360200280828437506101219450670de0b6b3a764000093506112eb92505050565b04620186a0026118f3565b5b5b5050565b670de0b6b3a764000081565b600c60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff1686565b6000805433600160a060020a0390811691161461135c57600080fd5b600160a060020a038316151561137157600080fd5b6000821161137e57600080fd5b600b5460646001909101111561139357600080fd5b600160a060020a0383166000908152600c6020526040902054156113b657600080fd5b5060005b600b548110156114135782600160a060020a0316600b828154811015156113dd57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416141561140a57600080fd5b5b6001016113ba565b600b805460018101611425838261199b565b916000526020600020900160005b8154600160a060020a038088166101009390930a928302920219161790555060c06040519081016040908152838252600060208084018290526301e133808385018190526060850152620151806080850152603260a0850152600160a060020a0387168252600c905220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b505050565b60005433600160a060020a0390811691161461150857600080fd5b600354600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b60005433600160a060020a0390811691161461158c57600080fd5b600354600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c2057600080fd5b6102c65a03f11515610c3157600080fd5b5050505b5b565b600154600160a060020a031681565b600b80548290811061160057fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805433600160a060020a0390811691161461164057600080fd5b60008054600160a060020a038086169263a9059cbb929091169085906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156116a657600080fd5b6102c65a03f115156116b757600080fd5b50505060405180519150505b5b92915050565b6901723369b6684694000081565b733bf4bbe253153678e9e8e540395c22bff7fca87d81565b60005433600160a060020a0390811691161461170b57600080fd5b600254600160a060020a0316630952c5048260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561155857600080fd5b6102c65a03f1151561156957600080fd5b5050505b5b50565b6c7e37be2022c0914b268000000081565b600a81565b600354600160a060020a031681565b7356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a081565b60008183106117c057816117c2565b825b90505b92915050565b6000828211156117d757fe5b508082035b92915050565b60008082848115156117f057fe5b0490508091505b5092915050565b60008282018381101561180d57fe5b8091505b5092915050565b6000828202831580611834575082848281151561183157fe5b04145b151561180d57fe5b8091505b5092915050565b600254600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561189d57600080fd5b6102c65a03f115156118ae57600080fd5b50505081600160a060020a03167f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe08260405190815260200160405180910390a25b5050565b6000805433600160a060020a0390811691161461190f57600080fd5b5060005b8251811015610c3157816009600085848151811061192d57fe5b90602001906020020151600160a060020a031681526020810191909152604001600020555b600101611913565b5b5b505050565b60c0604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681525090565b815481835581811511610c3157600083815260209020610c319181019083016119c5565b5b505050565b61087b91905b808211156119df57600081556001016119cb565b5090565b90565b60005433600160a060020a03908116911614611a0157600080fd5b600b805460018101611a13838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a91820219167356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09091021790555060c060405190810160405280611a8e60646109696c7e37be2022c0914b2680000000603c63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526305a39a80606084015262015180608084015260a09092018190527356ae76573ec54754bc5b6a8cbf04bbd7dc86b0a09052600c90527fd06905af1297742ddb9ac089725ec482c86000f9368110004c772fb62e96d44c815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff90921691909117905550600b805460018101611b53838261199b565b916000526020600020900160005b8154600160a060020a036101009290920a9182021916733bf4bbe253153678e9e8e540395c22bff7fca87d9091021790555060c060405190810160405280611bce60646109696c7e37be2022c0914b2680000000601e63ffffffff61181816565b9063ffffffff6117e216565b815260006020808301829052604083018290526304536c006060840152626ebe006080840152606460a090930192909252733bf4bbe253153678e9e8e540395c22bff7fca87d9052600c90527f4045339027fddef4527290ad0313e692803d46494547232e9766f18e24607f88815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151600591909101805460ff191660ff909216919091179055505b5b5600a165627a7a72305820b2f21fbb30c08fd1433c3249459f404691a8b60ba11a2f7131f4be07163a715b002960606040526006805460ff191660011790555b60018054600160a060020a03191633600160a060020a03161790555b5b610bd88061003e6000396000f300606060405236156100ee5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100f35780630952c5041461017e578063095ea7b31461019f57806318160ddd146101d557806323b872dd146101fa5780632a8092df14610236578063313ce5671461025d57806340c10f191461028657806370a08231146102aa57806379ba5097146102db5780638da5cb5b146102f057806395d89b411461031f578063a9059cbb146103aa578063d091b550146103e0578063dc39d06d1461040f578063dd62ed3e14610445578063ef70aebf1461047c575b600080fd5b34156100fe57600080fd5b610106610491565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561018957600080fd5b61019d600160a060020a03600435166104c8565b005b34156101aa57600080fd5b6101c1600160a060020a036004351660243561055d565b604051901515815260200160405180910390f35b34156101e057600080fd5b6101e8610584565b60405190815260200160405180910390f35b341561020557600080fd5b6101c1600160a060020a036004358116906024351660443561058a565b604051901515815260200160405180910390f35b341561024157600080fd5b6101c16105b3565b604051901515815260200160405180910390f35b341561026857600080fd5b6102706105bc565b60405160ff909116815260200160405180910390f35b341561029157600080fd5b61019d600160a060020a03600435166024356105c1565b005b34156102b557600080fd5b6101e8600160a060020a0360043516610685565b60405190815260200160405180910390f35b34156102e657600080fd5b61019d6106a4565b005b34156102fb57600080fd5b610303610733565b604051600160a060020a03909116815260200160405180910390f35b341561032a57600080fd5b610106610742565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101435780820151818401525b60200161012a565b50505050905090810190601f1680156101705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103b557600080fd5b6101c1600160a060020a0360043516602435610779565b604051901515815260200160405180910390f35b34156103eb57600080fd5b6103036107a0565b604051600160a060020a03909116815260200160405180910390f35b341561041a57600080fd5b6101c1600160a060020a03600435166024356107af565b604051901515815260200160405180910390f35b341561045057600080fd5b6101e8600160a060020a036004358116906024351661086d565b60405190815260200160405180910390f35b341561048757600080fd5b61019d61089a565b005b60408051908101604052600381527f4b696e0000000000000000000000000000000000000000000000000000000000602082015281565b60015433600160a060020a039081169116146104e357600080fd5b600160a060020a03811615156104f857600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b60065460009060ff161561057057600080fd5b61057a8383610900565b90505b5b92915050565b60035481565b60065460009060ff161561059d57600080fd5b6105a88484846109a9565b90505b5b9392505050565b60065460ff1681565b601281565b60015433600160a060020a039081169116146105dc57600080fd5b60065460ff1615156105ed57600080fd5b600354610600908263ffffffff610abb16565b600355600160a060020a03821660009081526005602052604090205461062c908263ffffffff610abb16565b600160a060020a0383166000818152600560205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9084905190815260200160405180910390a35b5b5b5050565b600160a060020a0381166000908152600560205260409020545b919050565b60025460009033600160a060020a039081169116146106c257600080fd5b50600180546002805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b600154600160a060020a031681565b60408051908101604052600381527f4b494e0000000000000000000000000000000000000000000000000000000000602082015281565b60065460009060ff161561078c57600080fd5b61057a8383610ad5565b90505b5b92915050565b600254600160a060020a031681565b60015460009033600160a060020a039081169116146107cd57600080fd5b600154600160a060020a038085169163a9059cbb9116846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561084957600080fd5b6102c65a03f1151561085a57600080fd5b50505060405180519150505b5b92915050565b600160a060020a038083166000908152600460209081526040808320938516835292905220545b92915050565b60015433600160a060020a039081169116146108b557600080fd5b60065460ff1615156108c6576108fd565b6006805460ff191690557ff48339e4a272bd7aee715c343ca34ad137607f1df78cf8d7ba137228954d2d8560405160405180910390a15b5b565b600081158015906109355750600160a060020a0333811660009081526004602090815260408083209387168352929052205415155b1561093f57600080fd5b600160a060020a03338116600081815260046020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b600160a060020a0380841660008181526004602090815260408083203390951683529381528382205492825260059052918220546109ed908463ffffffff610b9516565b600160a060020a038087166000908152600560205260408082209390935590861681522054610a22908463ffffffff610abb16565b600160a060020a038516600090815260056020526040902055610a4b818463ffffffff610b9516565b600160a060020a03808716600081815260046020908152604080832033861684529091529081902093909355908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a3600191505b509392505050565b600082820183811015610aca57fe5b8091505b5092915050565b600160a060020a033316600090815260056020526040812054610afe908363ffffffff610b9516565b600160a060020a033381166000908152600560205260408082209390935590851681522054610b33908363ffffffff610abb16565b600160a060020a0380851660008181526005602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b92915050565b600082821115610ba157fe5b508082035b929150505600a165627a7a723058203b88537fce9422de85446a6e402b3642009e6557f14364ffb0a9244cd944063400296060604052341561000f57600080fd5b604051602080610ca5833981016040528080519150505b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a038116151561005857600080fd5b60028054600160a060020a031916600160a060020a0383161790555b505b610c20806100856000396000f300606060405236156100935763ffffffff60e060020a6000350416630952c50481146100985780631a64adae146100b957806374a8f103146100ed57806379ba50971461010e5780637c17357d1461012357806383fcf973146101485780638da5cb5b1461015d578063957924301461018c5780639743efe5146101c1578063b869cea3146101f0578063d091b5501461024d575b600080fd5b34156100a357600080fd5b6100b7600160a060020a036004351661027c565b005b34156100c457600080fd5b6100db600160a060020a0360043516602435610311565b60405190815260200160405180910390f35b34156100f857600080fd5b6100b7600160a060020a03600435166103ae565b005b341561011957600080fd5b6100b7610586565b005b341561012e57600080fd5b6100db610615565b60405190815260200160405180910390f35b341561015357600080fd5b6100b761061b565b005b341561016857600080fd5b6101706107c0565b604051600160a060020a03909116815260200160405180910390f35b341561019757600080fd5b6100b7600160a060020a036004351660243560443560643560843560a43560c43515156107cf565b005b34156101cc57600080fd5b610170610a24565b604051600160a060020a03909116815260200160405180910390f35b34156101fb57600080fd5b61020f600160a060020a0360043516610a33565b60405196875260208701959095526040808701949094526060860192909252608085015260a084015290151560c083015260e0909101905180910390f35b341561025857600080fd5b610170610a74565b604051600160a060020a03909116815260200160405180910390f35b60005433600160a060020a0390811691161461029757600080fd5b600160a060020a03811615156102ac57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290559081169033167f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec460405160405180910390a35b5b50565b600061031b610bb4565b600160a060020a038416600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015290508051151561039a57600091506103a7565b6103a48184610a83565b91505b5092915050565b6103b6610bb4565b6000805433600160a060020a039081169116146103d257600080fd5b600160a060020a038316600090815260036020526040908190209060e09051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c0820190815290925051151561044f57600080fd5b6104658260a0015183519063ffffffff610b3816565b600160a060020a03841660009081526003602081905260408220828155600181018390556002810183905590810182905560048082018390556005820192909255600601805460ff19169055549091506104c5908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561052757600080fd5b6102c65a03f1151561053857600080fd5b50505060405180515050600160a060020a0383167f740528a7c317c81f0923adc30df75db3f448298c78cdaf548adfcfdb3c84ff6f8260405190815260200160405180910390a25b5b505050565b60015460009033600160a060020a039081169116146105a457600080fd5b50600080546001805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179586905591169091559081169116817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b50565b60045481565b600160a060020a033316600090815260036020526040812080549091908190151561064557600080fd5b6106a18360e0604051908101604090815282548252600183015460208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c082015242610a83565b91508115156106af57610580565b60058301546106c590839063ffffffff610b3816565b90508015156106d357610580565b60058301546106e8908263ffffffff610b4f16565b6005840155600454610700908263ffffffff610b3816565b600455600254600160a060020a031663a9059cbb338360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561076257600080fd5b6102c65a03f1151561077357600080fd5b50505060405180515050600160a060020a0333167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e11958888260405190815260200160405180910390a25b505050565b600054600160a060020a031681565b60005433600160a060020a039081169116146107ea57600080fd5b600160a060020a03871615156107ff57600080fd5b30600160a060020a031687600160a060020a03161415151561082057600080fd5b6000861161082d57600080fd5b600160a060020a0387166000908152600360205260409020541561085057600080fd5b8385111580156108605750828411155b151561086b57600080fd5b60008211801561088a5750610886838663ffffffff610b3816565b8211155b151561089557600080fd5b600254600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156108ee57600080fd5b6102c65a03f115156108ff57600080fd5b505050604051805160045490915061091d908863ffffffff610b4f16565b111561092857600080fd5b60e0604051908101604090815287825260208083018890528183018790526060830186905260808301859052600060a0840181905284151560c0850152600160a060020a038b168152600390915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151600691909101805460ff1916911515919091179055506004546109d59087610b4f565b600455600160a060020a038088169033167ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa458860405190815260200160405180910390a35b5b50505050505050565b600254600160a060020a031681565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006909501549395929492939192909160ff1687565b600154600160a060020a031681565b60008060008460400151841015610a9d5760009250610b30565b84606001518410610ab15784519250610b30565b610ada8560800151610ace8760200151879063ffffffff610b3816565b9063ffffffff610b6916565b9150610af5856020015186606001519063ffffffff610b3816565b9050610b2d81610ace610b138860800151869063ffffffff610b8516565b88519063ffffffff610b8516565b9063ffffffff610b6916565b92505b505092915050565b600082821115610b4457fe5b508082035b92915050565b600082820183811015610b5e57fe5b8091505b5092915050565b6000808284811515610b7757fe5b0490508091505b5092915050565b6000828202831580610ba15750828482811515610b9e57fe5b04145b1515610b5e57fe5b8091505b5092915050565b60e06040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815250905600a165627a7a72305820708f9ef9bc918f9f6b04a96203db265d6bebb7e7894a325391b1ea397d60cdfa00290000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b70060000000000000000000000000000000000000000000000000000000059b7da50

    Constructor Arguments (ABI-encoded and appended to the ByteCode above)
0000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b70060000000000000000000000000000000000000000000000000000000059b7da50

-----Decoded View---------------
Found 2 constructor arguments :
Arg [0] : 0000000000000000000000009ea7ba960a2668df52ee0389c4617d48853b7006
Arg [1] : 0000000000000000000000000000000000000000000000000000000059b7da50


   Swarm Source:
bzzr://708f9ef9bc918f9f6b04a96203db265d6bebb7e7894a325391b1ea397d60cdfa
View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.