Sponsored Link:   ARNA Genomics - FIRST BLOCKCHAIN BIOTECH ECOSYSTEM. Join ICO Now!
  Latest 25 txns from a total Of 19271 transactions View All

TxHash Age From To Value [TxFee]
0xc84f045a09dd0553e479f3bc42a43cc8d9abfd57e25df07aad140c4775b0b9a42 days 20 hrs ago0xe4763999b181fa397561be6aebc00f3505922871  IN   KinTokenSale0.12 Ether0.000448539
0xcd5cdd9196f1f4914d4ccef7163106cc3d8920cd37db1482ec37503e8b4129745 days 13 hrs ago0xd039ed9cb78d10d30899fff3934b81d5cf89b730  IN   KinTokenSale0.0001 Ether0.000106795
0xe839be4d459cad020314499d67fa424c499e6a52744439d3ec1f7c5585a0145250 days 21 hrs ago0x2bc9cb911fdc5a056b08c624563610ef177d1f6f  IN   KinTokenSale0.08 Ether0.0042
0xe72eec159eae9a1ca3e38e96caeea9200f4c35f078a14877c96839e478788fde55 days 19 hrs ago0xce16c709448d47d8ecfabaf625ce4f01ea2714b0  IN   KinTokenSale4 Ether0.0176
0x92740b4b0ae188e3424e10199160c429a4530e478672b10c00c57928c8e399ab57 days 5 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.001016904
0xe07d8a3049a51bea31437826011453f640871f61640cae4ff71a7dafb5ffbc5457 days 5 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.000950082
0x2232b6eae86fcbd7bc9ff722195b88b11d88b7fe40f1b0784dddb3ecf0e2772757 days 5 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.001019277
0xf47103d3f19529eeb542d22f94012fa0e27e819fde7a91053035ae77cb2083a059 days 11 hrs ago0x2d3b8bc03910e717dc54b03ea0b3aa7d8146482d  IN   KinTokenSale0.015 Ether0.0042
0xa42947d9830ad717c2a0cd14de7dcf033d2ee2b06b726d4cff77a8b2faf3264659 days 15 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.000470048062
0x8795a07becd3f6925e57230a1c0676c63cb9178f5891dc624feae4854b881f1c59 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.014350725665
0x7131c209b14e46b419d4606be1300ab00ee31e9d7ef06366f4a1db2c1812d76c59 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.013005921404
0xb1ab41c6c4bab5c293f300c43270e4b6613a99f4a7a93eebd33bdddd92748e1d59 days 16 hrs ago0x0fe5cda81154afb2eadaafae3e320127f88f171e  IN   KinTokenSale11 Ether0.599416568
0xc3ea2b0ad18e26f356c6f610aafc7bb691ddf51020ea052f14860deee3c4dbbe59 days 16 hrs ago0x0fe5cda81154afb2eadaafae3e320127f88f171e  IN   KinTokenSale11 Ether0.222753885794
0xedbc99a475106cdded600eb59dd3c755a75da1cb26cabe6decca8630b961b81859 days 16 hrs ago0x0fe5cda81154afb2eadaafae3e320127f88f171e  IN   KinTokenSale12.1 Ether0.133912212
0xef2c9a609739367051f818debd823cbd8807dbb8904f8387ca0da2f682fcbe9e59 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.091421171491
0xcc96bca2092f674093b5ad4bb93bd852df160f24313eff54eb620a43316bafe459 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.129957206053
0x0ee1547a96e48e87ba260cb67defcfdaea1ef6414fa250f852fe381ba7f1f9d359 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.128983227785
0x37ab4e615e962696a5c08d4b599a8b5f5589e30a2fc509f2f646eb29e69137a959 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.129957206053
0xdea83bf7fa179a941d8f4bbc72aa8eecdb43ea5db90171e100801fbf9db06b0959 days 16 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.120568834732
0x8ff2197acaefdbccbdcb21936188655521ee482f138fb844aed5ecb1a9366e3859 days 16 hrs ago0x154237c0c8d8fabd2ca704218080576dc4a956fb  IN   KinTokenSale0.5 Ether0.004986376907
0xf7db3e23b14765c9bfdeb09f92b6761b0cd161ef6cf79354d55435937c047d1059 days 17 hrs ago0x20d63fae007b5eaebff7909ebba2d45bb5bde812  IN   KinTokenSale0 Ether0.00272432178
0xa1f9da32178d3a93d1a85f931bae645fd7505deb144f9b96df7abc3973b3e1f059 days 17 hrs ago0xbcf267001192432371f6b37059ebbcf4241cc851  IN   KinTokenSale0.89 Ether0.0042
0xca2be58304a0ab36f7bae2a2705af303bd1d7d12f8094baefa9ee4a3f0a5287e59 days 17 hrs ago0x76de4303440382991458c97f8e8a2e553a5481b3  IN   KinTokenSale0.045193995358765 Ether0.0015517
0x0a306d16f9609f1e9ea3d8a0eebedef38f29f1a70fa01567e2810e29c4b443f759 days 17 hrs ago0xd5adb913af5991eecd48ce4180c186363773d846  IN   KinTokenSale19 Ether0.00372408
0xf04e678df6fa3db1736ad40f014a771089bf16f1d1314fd65d1d6e2c52db451659 days 17 hrs ago0xd12c5a132036d4076417ccd0f690f86c184677d4  IN   KinTokenSale6 Ether0.001303218
[ 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
0x32b16bcc2e99d9f2cf76802c9e59c10d4766feb8f0d56699a340daf074153765431240759 days 16 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70069,206.111029919659922194 Ether
0x32b16bcc2e99d9f2cf76802c9e59c10d4766feb8f0d56699a340daf074153765431240759 days 16 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700690,793.888970080340077806 Ether
0x32b16bcc2e99d9f2cf76802c9e59c10d4766feb8f0d56699a340daf074153765431240759 days 16 hrs ago0x9ea7ba960a2668df52ee0389c4617d48853b70060x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb100,000 Ether
0x893f388fd66f5e2c83a849c5b1fd48fc9c7458ed4760db7d5c0e1bd5da5798f2431237259 days 17 hrs ago0x9ea7ba960a2668df52ee0389c4617d48853b70060x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb100,000 Ether
0xca2be58304a0ab36f7bae2a2705af303bd1d7d12f8094baefa9ee4a3f0a5287e431236759 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.04519399535876579 Ether
0x0a306d16f9609f1e9ea3d8a0eebedef38f29f1a70fa01567e2810e29c4b443f7431236559 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700619 Ether
0xf04e678df6fa3db1736ad40f014a771089bf16f1d1314fd65d1d6e2c52db4516431236359 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70066 Ether
0x5e1b359c8e26e6aa568ad3351c5d1934304e1e89cced276a3c7986c3fa039003431236359 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70065 Ether
0x9d8f649dd784c1a051d8182180ea2c6950be008bab0353cfe69066781b522566431236259 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700630 Ether
0x8d7fcec70d1f3d4558cf5d6d0ba1e224c49d0606b6abdb684227838ef2cefcb2431236159 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.1 Ether
0xfcafa4db7dce03f0f9f3e4b18489c8170c40151cfb93850a96f9107edc8110de431235759 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.08 Ether
0xe36d88b5f329e625b75d7a6449bf811b4a1e6593780ae86c977151a3f58f5601431235759 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0xa4437bc57a4d49af70052c36cd22cb32b44aa4553.9792387543253 Ether
0xe36d88b5f329e625b75d7a6449bf811b4a1e6593780ae86c977151a3f58f5601431235759 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70063.9207612456747 Ether
0xe2409c2562818d6b7e3f8b7559567141dbd407e924da0a9eca2c0d50bf415102431235659 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70066 Ether
0x790d08cc0670d6bd1bb2e33041fed6cbdcffbecf04aea246965bedc1c9f8e5fa431235459 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70066.530500622 Ether
0xb2f8f1b9b7a29107aa28bdd4ac9f6c5ee970f6c7eb466c1b95c2ba8883ec6e27431235059 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700678 Ether
0x95042130d6afb1db2aca3c371512f0f3c61b0d15068f5cef0036d3cfb43fe41b431234959 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700613 Ether
0x469368e8a060a157e27c2eb78e86cabc546b2bcaa4596d51671891280e3a68dc431234559 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.002096782 Ether
0x854f2ea1c0e81cd65ec5960ddc85869a4542dad6e0ea6985b62ef935724aae4d431234559 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70065 Ether
0x9b463acb8d2eb0ec40b61e85339a7e1f2aeb48c72b903827d12e962bedb57030431234459 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70069.5 Ether
0x8d817c98da021e478ecbc8ddbb32018e352ac24de9f2fbf7b168160af68698cb431234159 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70062.4 Ether
0xca3b7a5218b2fcfb091ef0bc4046afeef82984f7d39aa5e70194059e734439ce431233659 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b7006285.8670456 Ether
0x7cc77f31bcd99e8b1136137fb02042cde38968c02462e2784b36051c26c46092431233359 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70061 Ether
0x0f192563c1fbfa429c4985b523d63d414a24132e8f8559de6fbb214616458dc5431233359 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b70060.005482472 Ether
0x7ad977ce137a69694e5b6b04d45b47be5bfab25f07a9db57568ebfdc8c6993c7431233359 days 17 hrs ago0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb0x9ea7ba960a2668df52ee0389c4617d48853b700624 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity) Solidity compiler bugs.

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 is the last bytes of the Contract Creation Code 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.