ETH Price: $1,866.09 (-4.66%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer42048452017-08-26 5:42:053103 days ago1503726125IN
Stox: Token Sale
0.73 ETH0.00525
Transfer42029222017-08-25 16:29:593104 days ago1503678599IN
Stox: Token Sale
0.01 ETH0.004221
Transfer42028972017-08-25 16:16:263104 days ago1503677786IN
Stox: Token Sale
0.01 ETH0.00044121
Transfer41775452017-08-19 12:46:283110 days ago1503146788IN
Stox: Token Sale
0.2 ETH0.01456
Transfer Ownersh...41693702017-08-17 13:52:533112 days ago1502977973IN
Stox: Token Sale
0 ETH0.0006744722.00000133
Transfer Smart T...41691432017-08-17 12:37:153112 days ago1502973435IN
Stox: Token Sale
0 ETH0.0010791323
Transfer Trustee...41690652017-08-17 12:13:273112 days ago1502972007IN
Stox: Token Sale
0 ETH0.0011020923
Transfer41162142017-08-04 14:20:393125 days ago1501856439IN
Stox: Token Sale
1 ETH0.004221
Transfer41161842017-08-04 14:11:573125 days ago1501855917IN
Stox: Token Sale
1 ETH0.004221
Transfer41144232017-08-04 3:41:533125 days ago1501818113IN
Stox: Token Sale
0.56 ETH0.00420
Transfer41140222017-08-04 1:18:083125 days ago1501809488IN
Stox: Token Sale
2 ETH0.004221
Transfer41140102017-08-04 1:13:473125 days ago1501809227IN
Stox: Token Sale
2 ETH0.004221
Transfer41140092017-08-04 1:10:113125 days ago1501809011IN
Stox: Token Sale
2 ETH0.0015
Transfer41139642017-08-04 0:55:123125 days ago1501808112IN
Stox: Token Sale
7.9 ETH0.003216
Transfer41139642017-08-04 0:55:123125 days ago1501808112IN
Stox: Token Sale
0.309 ETH0.004221
Transfer41139612017-08-04 0:53:493125 days ago1501808029IN
Stox: Token Sale
2 ETH0.0015
Transfer41139612017-08-04 0:53:493125 days ago1501808029IN
Stox: Token Sale
0.309 ETH0.004221
Transfer41139612017-08-04 0:53:493125 days ago1501808029IN
Stox: Token Sale
2.1 ETH0.004221
Finalize41139612017-08-04 0:53:493125 days ago1501808029IN
Stox: Token Sale
0 ETH0.22499656221
Transfer41139582017-08-04 0:52:233125 days ago1501807943IN
Stox: Token Sale
7.99 ETH0.003216
Transfer41139582017-08-04 0:52:233125 days ago1501807943IN
Stox: Token Sale
10 ETH0.004221
Transfer41139572017-08-04 0:51:463125 days ago1501807906IN
Stox: Token Sale
1 ETH0.004221
Transfer41139562017-08-04 0:51:453125 days ago1501807905IN
Stox: Token Sale
10 ETH0.008844
Transfer41139542017-08-04 0:50:233125 days ago1501807823IN
Stox: Token Sale
10.4 ETH0.004221
Transfer41139492017-08-04 0:48:533125 days ago1501807733IN
Stox: Token Sale
4.41610399 ETH0.0016656721
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer41139612017-08-04 0:53:493125 days ago1501808029
Stox: Token Sale
 Contract Creation0 ETH
Transfer41139492017-08-04 0:48:533125 days ago1501807733
Stox: Token Sale
3.93381377 ETH
Transfer41139492017-08-04 0:48:533125 days ago1501807733
Stox: Token Sale
0.48229021 ETH
Transfer41139492017-08-04 0:48:533125 days ago1501807733
Stox: Token Sale
10 ETH
Transfer41139482017-08-04 0:48:353125 days ago1501807715
Stox: Token Sale
1 ETH
Transfer41139462017-08-04 0:48:093125 days ago1501807689
Stox: Token Sale
2 ETH
Transfer41139442017-08-04 0:47:493125 days ago1501807669
Stox: Token Sale
0.164762 ETH
Transfer41139392017-08-04 0:47:143125 days ago1501807634
Stox: Token Sale
5 ETH
Transfer41139392017-08-04 0:47:143125 days ago1501807634
Stox: Token Sale
3.2 ETH
Transfer41139372017-08-04 0:46:073125 days ago1501807567
Stox: Token Sale
0.8 ETH
Transfer41139352017-08-04 0:45:453125 days ago1501807545
Stox: Token Sale
10 ETH
Transfer41139332017-08-04 0:45:243125 days ago1501807524
Stox: Token Sale
1.969 ETH
Transfer41139322017-08-04 0:44:183125 days ago1501807458
Stox: Token Sale
0.1 ETH
Transfer41139322017-08-04 0:44:183125 days ago1501807458
Stox: Token Sale
7 ETH
Transfer41139322017-08-04 0:44:183125 days ago1501807458
Stox: Token Sale
2.4 ETH
Transfer41139312017-08-04 0:43:573125 days ago1501807437
Stox: Token Sale
19 ETH
Transfer41139302017-08-04 0:43:283125 days ago1501807408
Stox: Token Sale
1.5 ETH
Transfer41139252017-08-04 0:41:203125 days ago1501807280
Stox: Token Sale
5 ETH
Transfer41139252017-08-04 0:41:203125 days ago1501807280
Stox: Token Sale
0.469559 ETH
Transfer41139252017-08-04 0:41:203125 days ago1501807280
Stox: Token Sale
3 ETH
Transfer41139252017-08-04 0:41:203125 days ago1501807280
Stox: Token Sale
0.4892 ETH
Transfer41139232017-08-04 0:40:423125 days ago1501807242
Stox: Token Sale
1 ETH
Transfer41139152017-08-04 0:39:273125 days ago1501807167
Stox: Token Sale
1.0908 ETH
Transfer41139152017-08-04 0:39:273125 days ago1501807167
Stox: Token Sale
1 ETH
Transfer41139142017-08-04 0:39:003125 days ago1501807140
Stox: Token Sale
3 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StoxSmartTokenSale

Compiler Version
v0.4.11+commit.68ef5810

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2017-08-01
*/

pragma solidity ^0.4.11;

/*
    Owned contract interface
*/
contract IOwned {
    // this function isn't abstract since the compiler emits automatically generated getter functions as external
    function owner() public constant returns (address owner) { owner; }

    function transferOwnership(address _newOwner) public;
    function acceptOwnership() public;
}

/*
    ERC20 Standard Token interface
*/
contract IERC20Token {
    // these functions aren't abstract since the compiler emits automatically generated getter functions as external
    function name() public constant returns (string name) { name; }
    function symbol() public constant returns (string symbol) { symbol; }
    function decimals() public constant returns (uint8 decimals) { decimals; }
    function totalSupply() public constant returns (uint256 totalSupply) { totalSupply; }
    function balanceOf(address _owner) public constant returns (uint256 balance) { _owner; balance; }
    function allowance(address _owner, address _spender) public constant returns (uint256 remaining) { _owner; _spender; remaining; }

    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
}

/*
    Token Holder interface
*/
contract ITokenHolder is IOwned {
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
}

/*
    Smart Token interface
*/
contract ISmartToken is ITokenHolder, IERC20Token {
    function disableTransfers(bool _disable) public;
    function issue(address _to, uint256 _amount) public;
    function destroy(address _from, uint256 _amount) public;
}

/*
    Overflow protected math functions
*/
contract SafeMath {
    /**
        constructor
    */
    function SafeMath() {
    }

    /**
        @dev returns the sum of _x and _y, asserts if the calculation overflows

        @param _x   value 1
        @param _y   value 2

        @return sum
    */
    function safeAdd(uint256 _x, uint256 _y) internal returns (uint256) {
        uint256 z = _x + _y;
        assert(z >= _x);
        return z;
    }

    /**
        @dev returns the difference of _x minus _y, asserts if the subtraction results in a negative number

        @param _x   minuend
        @param _y   subtrahend

        @return difference
    */
    function safeSub(uint256 _x, uint256 _y) internal returns (uint256) {
        assert(_x >= _y);
        return _x - _y;
    }

    /**
        @dev returns the product of multiplying _x by _y, asserts if the calculation overflows

        @param _x   factor 1
        @param _y   factor 2

        @return product
    */
    function safeMul(uint256 _x, uint256 _y) internal returns (uint256) {
        uint256 z = _x * _y;
        assert(_x == 0 || z / _x == _y);
        return z;
    }
}

/**
    ERC20 Standard Token implementation
*/
contract ERC20Token is IERC20Token, SafeMath {
    string public standard = 'Token 0.1';
    string public name = '';
    string public symbol = '';
    uint8 public decimals = 0;
    uint256 public totalSupply = 0;
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /**
        @dev constructor

        @param _name        token name
        @param _symbol      token symbol
        @param _decimals    decimal points, for display purposes
    */
    function ERC20Token(string _name, string _symbol, uint8 _decimals) {
        require(bytes(_name).length > 0 && bytes(_symbol).length > 0); // validate input

        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        require(_address != 0x0);
        _;
    }

    /**
        @dev send coins
        throws on any error rather then return a false flag to minimize user errors

        @param _to      target address
        @param _value   transfer amount

        @return true if the transfer was successful, false if it wasn't
    */
    function transfer(address _to, uint256 _value)
        public
        validAddress(_to)
        returns (bool success)
    {
        balanceOf[msg.sender] = safeSub(balanceOf[msg.sender], _value);
        balanceOf[_to] = safeAdd(balanceOf[_to], _value);
        Transfer(msg.sender, _to, _value);
        return true;
    }

    /**
        @dev an account/contract attempts to get the coins
        throws on any error rather then return a false flag to minimize user errors

        @param _from    source address
        @param _to      target address
        @param _value   transfer amount

        @return true if the transfer was successful, false if it wasn't
    */
    function transferFrom(address _from, address _to, uint256 _value)
        public
        validAddress(_from)
        validAddress(_to)
        returns (bool success)
    {
        allowance[_from][msg.sender] = safeSub(allowance[_from][msg.sender], _value);
        balanceOf[_from] = safeSub(balanceOf[_from], _value);
        balanceOf[_to] = safeAdd(balanceOf[_to], _value);
        Transfer(_from, _to, _value);
        return true;
    }

    /**
        @dev allow another account/contract to spend some tokens on your behalf
        throws on any error rather then return a false flag to minimize user errors

        also, to minimize the risk of the approve/transferFrom attack vector
        (see https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/), approve has to be called twice
        in 2 separate transactions - once to change the allowance to 0 and secondly to change it to the new allowance value

        @param _spender approved address
        @param _value   allowance amount

        @return true if the approval was successful, false if it wasn't
    */
    function approve(address _spender, uint256 _value)
        public
        validAddress(_spender)
        returns (bool success)
    {
        // if the allowance isn't 0, it can only be updated to 0 to prevent an allowance change immediately after withdrawal
        require(_value == 0 || allowance[msg.sender][_spender] == 0);

        allowance[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }
}

/*
    Provides support and utilities for contract ownership
*/
contract Owned is IOwned {
    address public owner;
    address public newOwner;

    event OwnerUpdate(address _prevOwner, address _newOwner);

    /**
        @dev constructor
    */
    function Owned() {
        owner = msg.sender;
    }

    // allows execution by the owner only
    modifier ownerOnly {
        assert(msg.sender == owner);
        _;
    }

    /**
        @dev allows transferring the contract ownership
        the new owner still need to accept the transfer
        can only be called by the contract owner

        @param _newOwner    new contract owner
    */
    function transferOwnership(address _newOwner) public ownerOnly {
        require(_newOwner != owner);
        newOwner = _newOwner;
    }

    /**
        @dev used by a new owner to accept an ownership transfer
    */
    function acceptOwnership() public {
        require(msg.sender == newOwner);
        OwnerUpdate(owner, newOwner);
        owner = newOwner;
        newOwner = 0x0;
    }
}

/*
    We consider every contract to be a 'token holder' since it's currently not possible
    for a contract to deny receiving tokens.

    The TokenHolder's contract sole purpose is to provide a safety mechanism that allows
    the owner to send tokens that were sent to the contract by mistake back to their sender.
*/
contract TokenHolder is ITokenHolder, Owned {
    /**
        @dev constructor
    */
    function TokenHolder() {
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        require(_address != 0x0);
        _;
    }

    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        require(_address != address(this));
        _;
    }

    /**
        @dev withdraws tokens held by the contract and sends them to an account
        can only be called by the owner

        @param _token   ERC20 token contract address
        @param _to      account to receive the new amount
        @param _amount  amount to withdraw
    */
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount)
        public
        ownerOnly
        validAddress(_token)
        validAddress(_to)
        notThis(_to)
    {
        assert(_token.transfer(_to, _amount));
    }
}

/*
    Smart Token v0.2

    'Owned' is specified here for readability reasons
*/
contract SmartToken is ISmartToken, ERC20Token, Owned, TokenHolder {
    string public version = '0.2';

    bool public transfersEnabled = true;    // true if transfer/transferFrom are enabled, false if not

    // triggered when a smart token is deployed - the _token address is defined for forward compatibility, in case we want to trigger the event from a factory
    event NewSmartToken(address _token);
    // triggered when the total supply is increased
    event Issuance(uint256 _amount);
    // triggered when the total supply is decreased
    event Destruction(uint256 _amount);

    /**
        @dev constructor

        @param _name       token name
        @param _symbol     token short symbol, 1-6 characters
        @param _decimals   for display purposes only
    */
    function SmartToken(string _name, string _symbol, uint8 _decimals)
        ERC20Token(_name, _symbol, _decimals)
    {
        require(bytes(_symbol).length <= 6); // validate input
        NewSmartToken(address(this));
    }

    // allows execution only when transfers aren't disabled
    modifier transfersAllowed {
        assert(transfersEnabled);
        _;
    }

    /**
        @dev disables/enables transfers
        can only be called by the contract owner

        @param _disable    true to disable transfers, false to enable them
    */
    function disableTransfers(bool _disable) public ownerOnly {
        transfersEnabled = !_disable;
    }

    /**
        @dev increases the token supply and sends the new tokens to an account
        can only be called by the contract owner

        @param _to         account to receive the new amount
        @param _amount     amount to increase the supply by
    */
    function issue(address _to, uint256 _amount)
        public
        ownerOnly
        validAddress(_to)
        notThis(_to)
    {
        totalSupply = safeAdd(totalSupply, _amount);
        balanceOf[_to] = safeAdd(balanceOf[_to], _amount);

        Issuance(_amount);
        Transfer(this, _to, _amount);
    }

    /**
        @dev removes tokens from an account and decreases the token supply
        can only be called by the contract owner

        @param _from       account to remove the amount from
        @param _amount     amount to decrease the supply by
    */
    function destroy(address _from, uint256 _amount)
        public
        ownerOnly
    {
        balanceOf[_from] = safeSub(balanceOf[_from], _amount);
        totalSupply = safeSub(totalSupply, _amount);

        Transfer(_from, this, _amount);
        Destruction(_amount);
    }

    // ERC20 standard method overrides with some extra functionality

    /**
        @dev send coins
        throws on any error rather then return a false flag to minimize user errors
        note that when transferring to the smart token's address, the coins are actually destroyed

        @param _to      target address
        @param _value   transfer amount

        @return true if the transfer was successful, false if it wasn't
    */
    function transfer(address _to, uint256 _value) public transfersAllowed returns (bool success) {
        assert(super.transfer(_to, _value));

        // transferring to the contract address destroys tokens
        if (_to == address(this)) {
            balanceOf[_to] -= _value;
            totalSupply -= _value;
            Destruction(_value);
        }

        return true;
    }

    /**
        @dev an account/contract attempts to get the coins
        throws on any error rather then return a false flag to minimize user errors
        note that when transferring to the smart token's address, the coins are actually destroyed

        @param _from    source address
        @param _to      target address
        @param _value   transfer amount

        @return true if the transfer was successful, false if it wasn't
    */
    function transferFrom(address _from, address _to, uint256 _value) public transfersAllowed returns (bool success) {
        assert(super.transferFrom(_from, _to, _value));

        // transferring to the contract address destroys tokens
        if (_to == address(this)) {
            balanceOf[_to] -= _value;
            totalSupply -= _value;
            Destruction(_value);
        }

        return true;
    }
}

/// @title Ownable
/// @dev The Ownable contract has an owner address, and provides basic authorization control functions, this simplifies
/// & 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 Throws if called by any account other than the owner.
    modifier onlyOwner() {
        if (msg.sender != owner) {
            throw;
        }

        _;
    }

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

        newOwnerCandidate = _newOwnerCandidate;

        OwnershipRequested(msg.sender, newOwnerCandidate);
    }

    /// @dev Accept ownership transfer. This method needs to be called by the perviously proposed owner.
    function acceptOwnership() {
        if (msg.sender == newOwnerCandidate) {
            owner = newOwnerCandidate;
            newOwnerCandidate = address(0);

            OwnershipTransferred(owner, newOwnerCandidate);
        }
    }
}

/// @title Math operations with safety checks
library SaferMath {
    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 Stox Smart Token
contract StoxSmartToken is SmartToken {
    function StoxSmartToken() SmartToken('Stox', 'STX', 18) {
        disableTransfers(true);
    }
}


/// @title Vesting trustee
contract Trustee is Ownable {
    using SaferMath for uint256;

    // The address of the STX ERC20 token.
    StoxSmartToken public stox;

    struct Grant {
        uint256 value;
        uint256 start;
        uint256 cliff;
        uint256 end;
        uint256 transferred;
        bool revokable;
    }

    // Grants holder.
    mapping (address => Grant) public grants;

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

    event NewGrant(address indexed _from, address indexed _to, uint256 _value);
    event UnlockGrant(address indexed _holder, uint256 _value);
    event RevokeGrant(address indexed _holder, uint256 _refund);

    /// @dev Constructor that initializes the address of the StoxSmartToken contract.
    /// @param _stox StoxSmartToken The address of the previously deployed StoxSmartToken smart contract.
    function Trustee(StoxSmartToken _stox) {
        require(_stox != address(0));

        stox = _stox;
    }

    /// @dev Grant tokens to a specified address.
    /// @param _to address The address to grant tokens to.
    /// @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.
    /// @param _end uint256 The end of the vesting period.
    /// @param _revokable bool Whether the grant is revokable or not.
    function grant(address _to, uint256 _value, uint256 _start, uint256 _cliff, uint256 _end, bool _revokable)
        public onlyOwner {
        require(_to != address(0));
        require(_value > 0);

        // Make sure that a single address can be granted tokens only once.
        require(grants[_to].value == 0);

        // Check for date inconsistencies that may cause unexpected behavior.
        require(_start <= _cliff && _cliff <= _end);

        // Check that this grant doesn't exceed the total amount of tokens currently available for vesting.
        require(totalVesting.add(_value) <= stox.balanceOf(address(this)));

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

        // Tokens 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 grant = grants[_holder];

        require(grant.revokable);

        // Send the remaining STX back to the owner.
        uint256 refund = grant.value.sub(grant.transferred);

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

        totalVesting = totalVesting.sub(refund);
        stox.transfer(msg.sender, refund);

        RevokeGrant(_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.
    /// @return a uint256 representing a holder's total amount of vested tokens.
    function vestedTokens(address _holder, uint256 _time) public constant returns (uint256) {
        Grant 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.
    ///   |                         _/--------   vestedTokens rect
    ///   |                       _/
    ///   |                     _/
    ///   |                   _/
    ///   |                 _/
    ///   |                /
    ///   |              .|
    ///   |            .  |
    ///   |          .    |
    ///   |        .      |
    ///   |      .        |
    ///   |    .          |
    ///   +===+===========+---------+----------> time
    ///     Start       Cliff      End
    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;
        }

        // Interpolate all vested tokens: vestedTokens = tokens/// (time - start) / (end - start)
         return _grant.value.mul(_time.sub(_grant.start)).div(_grant.end.sub(_grant.start));
    }

    /// @dev Unlock vested tokens and transfer them to their holder.
    /// @return a uint256 representing the amount of vested tokens transferred to their holder.
    function unlockVestedTokens() public {
        Grant grant = grants[msg.sender];
        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;
        }

        grant.transferred = grant.transferred.add(transferable);
        totalVesting = totalVesting.sub(transferable);
        stox.transfer(msg.sender, transferable);

        UnlockGrant(msg.sender, transferable);
    }
}


/// @title Stox Smart Token sale
contract StoxSmartTokenSale is Ownable {
    using SaferMath for uint256;

    uint256 public constant DURATION = 14 days;

    bool public isFinalized = false;
    bool public isDistributed = false;

    // The address of the STX ERC20 token.
    StoxSmartToken public stox;

    // The address of the token allocation trustee;
    Trustee public trustee;

    uint256 public startTime = 0;
    uint256 public endTime = 0;
    address public fundingRecipient;

    uint256 public tokensSold = 0;

    // TODO: update to the correct values.
    uint256 public constant ETH_CAP = 148000;
    uint256 public constant EXCHANGE_RATE = 200; // 200 STX for ETH
    uint256 public constant TOKEN_SALE_CAP = ETH_CAP * EXCHANGE_RATE * 10 ** 18;

    event TokensIssued(address indexed _to, uint256 _tokens);

    /// @dev Throws if called when not during sale.
    modifier onlyDuringSale() {
        if (tokensSold >= TOKEN_SALE_CAP || now < startTime || now >= endTime) {
            throw;
        }

        _;
    }

    /// @dev Throws if called before sale ends.
    modifier onlyAfterSale() {
        if (!(tokensSold >= TOKEN_SALE_CAP || now >= endTime)) {
            throw;
        }

        _;
    }

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

        stox = StoxSmartToken(_stox);

        fundingRecipient = _fundingRecipient;
        startTime = _startTime;
        endTime = startTime + DURATION;
    }

    /// @dev Distributed tokens to the partners who have participated during the pre-sale.
    function distributePartnerTokens() external onlyOwner {
        require(!isDistributed);

        assert(tokensSold == 0);
        assert(stox.totalSupply() == 0);

        // Distribute strategic tokens to partners. Please note, that this address doesn't represent a single entity or
        // person and will be only used to distribute tokens to 30~ partners.
        //
        // Please expect to see token transfers from this address in the first 24 hours after the token sale ends.
        issueTokens(0x9065260ef6830f6372F1Bde408DeC57Fe3150530, 14800000 * 10 ** 18);

        isDistributed = true;
    }

    /// @dev Finalizes the token sale event.
    function finalize() external onlyAfterSale {
        if (isFinalized) {
            throw;
        }

        // Grant vesting grants.
        //
        // TODO: use real addresses.
        trustee = new Trustee(stox);

        // Since only 50% of the tokens will be sold, we will automatically issue the same amount of sold STX to the
        // trustee.
        uint256 unsoldTokens = tokensSold;

        // Issue 55% of the remaining tokens (== 27.5%) go to strategic parternships.
        uint256 strategicPartnershipTokens = unsoldTokens.mul(55).div(100);

        // Note: we will substract the bonus tokens from this grant, since they were already issued for the pre-sale
        // strategic partners and should've been taken from this allocation.
        stox.issue(0xbC14105ccDdeAadB96Ba8dCE18b40C45b6bACf58, strategicPartnershipTokens);

        // Issue the remaining tokens as vesting grants:
        stox.issue(trustee, unsoldTokens.sub(strategicPartnershipTokens));

        // 25% of the remaining tokens (== 12.5%) go to Invest.com, at uniform 12 months vesting schedule.
        trustee.grant(0xb54c6a870d4aD65e23d471Fb7941aD271D323f5E, unsoldTokens.mul(25).div(100), now, now,
            now.add(1 years), true);

        // 20% of the remaining tokens (== 10%) go to Stox team, at uniform 24 months vesting schedule.
        trustee.grant(0x4eB4Cd1D125d9d281709Ff38d65b99a6927b46c1, unsoldTokens.mul(20).div(100), now, now,
            now.add(2 years), true);

        // Re-enable transfers after the token sale.
        stox.disableTransfers(false);

        isFinalized = true;
    }

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

        assert(isDistributed);

        uint256 tokens = SaferMath.min256(msg.value.mul(EXCHANGE_RATE), TOKEN_SALE_CAP.sub(tokensSold));
        uint256 contribution = tokens.div(EXCHANGE_RATE);

        issueTokens(_recipient, tokens);

        // Transfer the funds to the funding recipient.
        fundingRecipient.transfer(contribution);

        // Refund the msg.sender, in the case that not all of its ETH was used. This can happen only when selling the
        // last chunk of STX.
        uint256 refund = msg.value.sub(contribution);
        if (refund > 0) {
            msg.sender.transfer(refund);
        }
    }

    /// @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 {
        // Update total sold tokens.
        tokensSold = tokensSold.add(_tokens);

        stox.issue(_recipient, _tokens);

        TokensIssued(_recipient, _tokens);
    }

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

    /// @dev Proposes to transfer control of the StoxSmartToken contract to a new owner.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    ///
    /// Note that:
    ///   1. The new owner will need to call StoxSmartToken'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 StoxSmartToken contract can issue new tokens.
    function transferSmartTokenOwnership(address _newOwnerCandidate) external onlyOwner {
        stox.transferOwnership(_newOwnerCandidate);
    }

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

    /// @dev Proposes to transfer control of the Trustee contract to a new owner.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    ///
    /// Note that:
    ///   1. The new owner will need to call Trustee's acceptOwnership directly in order to accept the ownership.
    ///   2. Calling this method during the token sale won't be possible, as the Trustee is only created after its
    ///      finalization.
    function transferTrusteeOwnership(address _newOwnerCandidate) external onlyOwner {
        trustee.transferOwnership(_newOwnerCandidate);
    }

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

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"EXCHANGE_RATE","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":"DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stox","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"transferTrusteeOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptTrusteeOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptSmartTokenOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"transferSmartTokenOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"distributePartnerTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"create","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"newOwnerCandidate","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isDistributed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"trustee","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_stox","type":"address"},{"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"}]

60606040526001805460a060020a61ffff0219169055600060048190556005819055600755341561002c57fe5b604051606080611cdb8339810160409081528151602083015191909201515b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a038316151561007e5760006000fd5b600160a060020a03821615156100945760006000fd5b4281116100a15760006000fd5b60028054600160a060020a03808616600160a060020a031992831617909255600680549285169290911691909117905560048190556212750081016005555b5050505b611be8806100f36000396000f300606060405236156101175763ffffffff60e060020a60003504166314a8bd0d81146101605780631bb534ba146101825780631be05289146101ae57806330f7cf80146101d05780633197cbb6146101fc5780633381ffe01461021e5780634bb278f31461023c578063518ab2a81461024e5780636f68d6341461027057806378e979251461028257806379aca4e0146102a457806379ba5097146102b657806379fb18ac146102c85780637e8c3ab6146102e65780638d4e4083146102f85780638da5cb5b1461031c57806390de9ed9146103485780639d837ccd1461036a5780639ed933181461038c578063d091b550146103a2578063f2fde38b146103ce578063f677cf0d146103ec578063fdf97cb214610410575b61015e5b6007546a187c0b371c7ead0400000090101580610139575060045442105b8061014657506005544210155b156101515760006000fd5b61015a3361043c565b5b5b565b005b341561016857fe5b61017061058e565b60408051918252519081900360200190f35b341561018a57fe5b610192610593565b60408051600160a060020a039092168252519081900360200190f35b34156101b657fe5b6101706105a2565b60408051918252519081900360200190f35b34156101d857fe5b6101926105a9565b60408051600160a060020a039092168252519081900360200190f35b341561020457fe5b6101706105b8565b60408051918252519081900360200190f35b341561022657fe5b61015e600160a060020a03600435166105be565b005b341561024457fe5b61015e610653565b005b341561025657fe5b610170610a97565b60408051918252519081900360200190f35b341561027857fe5b61015e610a9d565b005b341561028a57fe5b610170610b29565b60408051918252519081900360200190f35b34156102ac57fe5b61015e610b2f565b005b34156102be57fe5b61015e610bbb565b005b34156102d057fe5b61015e600160a060020a0360043516610c3b565b005b34156102ee57fe5b61015e610cd0565b005b341561030057fe5b610308610de1565b604080519115158252519081900360200190f35b341561032457fe5b610192610e02565b60408051600160a060020a039092168252519081900360200190f35b341561035057fe5b610170610e11565b60408051918252519081900360200190f35b341561037257fe5b610170610e20565b60408051918252519081900360200190f35b61015e600160a060020a036004351661043c565b005b34156103aa57fe5b610192610e27565b60408051600160a060020a039092168252519081900360200190f35b34156103d657fe5b61015e600160a060020a0360043516610e36565b005b34156103f457fe5b610308610ecd565b604080519115158252519081900360200190f35b341561041857fe5b610192610edd565b60408051600160a060020a039092168252519081900360200190f35b60006000600060c86202422002670de0b6b3a764000002600754101580610464575060045442105b8061047157506005544210155b1561047c5760006000fd5b600160a060020a03841615156104925760006000fd5b600034116104a05760006000fd5b60015460a860020a900460ff1615156104b557fe5b6104ed6104c93460c863ffffffff610eec16565b6007546104e8906a187c0b371c7ead040000009063ffffffff610f1b16565b610f32565b92506105008360c863ffffffff610f4c16565b915061050c8484610f69565b600654604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561053d57fe5b61054d348363ffffffff610f1b16565b9050600081111561058557604051600160a060020a0333169082156108fc029083906000818181858888f19350505050151561058557fe5b5b5b5b50505050565b60c881565b600654600160a060020a031681565b6212750081565b600254600160a060020a031681565b60055481565b60005433600160a060020a039081169116146105da5760006000fd5b600354604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b151561063d57fe5b6102c65a03f1151561058557fe5b5050505b5b50565b60075460009081906a187c0b371c7ead040000009010158061067757506005544210155b15156106835760006000fd5b60015474010000000000000000000000000000000000000000900460ff16156106ac5760006000fd5b600254600160a060020a03166106c0611057565b600160a060020a03909116815260405190819003602001906000f08015156106e457fe5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560075491506107326064610726846037610eec565b9063ffffffff610f4c16565b600254604080517f867904b400000000000000000000000000000000000000000000000000000000815273bc14105ccddeaadb96ba8dce18b40c45b6bacf586004820152602481018490529051929350600160a060020a039091169163867904b49160448082019260009290919082900301818387803b15156107b157fe5b6102c65a03f115156107bf57fe5b5050600254600354600160a060020a03918216925063867904b491166107eb858563ffffffff610f1b16565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b151561083957fe5b6102c65a03f1151561084757fe5b5050600354600160a060020a03169050635ee7e96d73b54c6a870d4ad65e23d471fb7941ad271d323f5e610893606461072687601963ffffffff610eec16565b9063ffffffff610f4c16565b42806108a9816301e1338063ffffffff61103d16565b6040805160e060020a63ffffffff8916028152600160a060020a0390961660048701526024860194909452604485019290925260648401526084830152600160a48301525160c480830192600092919082900301818387803b151561090a57fe5b6102c65a03f1151561091857fe5b5050600354600160a060020a03169050635ee7e96d734eb4cd1d125d9d281709ff38d65b99a6927b46c1610964606461072687601463ffffffff610eec16565b9063ffffffff610f4c16565b428061097a816303c2670063ffffffff61103d16565b6040805160e060020a63ffffffff8916028152600160a060020a0390961660048701526024860194909452604485019290925260648401526084830152600160a48301525160c480830192600092919082900301818387803b15156109db57fe5b6102c65a03f115156109e957fe5b5050600254604080517f1608f18f0000000000000000000000000000000000000000000000000000000081526000600482018190529151600160a060020a039093169350631608f18f926024808301939282900301818387803b1515610a4b57fe5b6102c65a03f11515610a5957fe5b50506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055505b5b5050565b60075481565b60005433600160a060020a03908116911614610ab95760006000fd5b600354604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916379ba50979160048082019260009290919082900301818387803b1515610b1457fe5b6102c65a03f11515610b2257fe5b5050505b5b565b60045481565b60005433600160a060020a03908116911614610b4b5760006000fd5b600254604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916379ba50979160048082019260009290919082900301818387803b1515610b1457fe5b6102c65a03f11515610b2257fe5b5050505b5b565b60015433600160a060020a039081169116141561015a576001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617808455919093169093556040519092909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35b5b565b60005433600160a060020a03908116911614610c575760006000fd5b600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b151561063d57fe5b6102c65a03f1151561058557fe5b5050505b5b50565b60005433600160a060020a03908116911614610cec5760006000fd5b60015460a860020a900460ff1615610d045760006000fd5b60075415610d0e57fe5b600254604080516000602091820181905282517f18160ddd0000000000000000000000000000000000000000000000000000000081529251600160a060020a03909416936318160ddd9360048082019493918390030190829087803b1515610d7257fe5b6102c65a03f11515610d8057fe5b505060405151159050610d8f57fe5b610db8739065260ef6830f6372f1bde408dec57fe31505306a0c3e059b8e3f5682000000610f69565b6001805475ff000000000000000000000000000000000000000000191660a860020a1790555b5b565b60015474010000000000000000000000000000000000000000900460ff1681565b600054600160a060020a031681565b6a187c0b371c7ead0400000081565b6202422081565b600154600160a060020a031681565b60005433600160a060020a03908116911614610e525760006000fd5b600160a060020a0381161515610e685760006000fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519181169133909116907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a35b5b50565b60015460a860020a900460ff1681565b600354600160a060020a031681565b6000828202831580610f085750828482811515610f0557fe5b04145b1515610f1057fe5b8091505b5092915050565b600082821115610f2757fe5b508082035b92915050565b6000818310610f415781610f43565b825b90505b92915050565b600060008284811515610f5b57fe5b0490508091505b5092915050565b600754610f7c908263ffffffff61103d16565b600755600254604080517f867904b4000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163867904b491604480830192600092919082900301818387803b1515610fe957fe5b6102c65a03f11515610ff757fe5b5050604080518381529051600160a060020a03851692507f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe09181900360200190a25b5050565b600082820183811015610f1057fe5b8091505b5092915050565b604051610b55806110688339019056006060604052341561000c57fe5b604051602080610b5583398101604052515b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a03811615156100515760006000fd5b60028054600160a060020a031916600160a060020a0383161790555b505b610ad78061007e6000396000f300606060405236156100ac5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631a64adae81146100ae57806330f7cf80146100df5780635ee7e96d1461010b57806374a8f1031461013a57806379ba5097146101585780637c17357d1461016a57806383fcf9731461018c5780638da5cb5b1461019e578063b869cea3146101ca578063d091b5501461021b578063f2fde38b14610247575bfe5b34156100b657fe5b6100cd600160a060020a0360043516602435610265565b60408051918252519081900360200190f35b34156100e757fe5b6100ef6102e9565b60408051600160a060020a039092168252519081900360200190f35b341561011357fe5b610138600160a060020a036004351660243560443560643560843560a43515156102f8565b005b341561014257fe5b610138600160a060020a03600435166104fd565b005b341561016057fe5b610138610689565b005b341561017257fe5b6100cd610709565b60408051918252519081900360200190f35b341561019457fe5b61013861070f565b005b34156101a657fe5b6100ef6108ba565b60408051600160a060020a039092168252519081900360200190f35b34156101d257fe5b6101e6600160a060020a03600435166108c9565b6040805196875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b341561022357fe5b6100ef610904565b60408051600160a060020a039092168252519081900360200190f35b341561024f57fe5b610138600160a060020a0360043516610913565b005b600160a060020a03821660009081526003602052604081208054151561028e57600091506102e2565b6040805160c08101825282548152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460ff16151560a08201526102df90846109aa565b91505b5092915050565b600254600160a060020a031681565b60005433600160a060020a039081169116146103145760006000fd5b600160a060020a038616151561032a5760006000fd5b600085116103385760006000fd5b600160a060020a0386166000908152600360205260409020541561035c5760006000fd5b82841115801561036c5750818311155b15156103785760006000fd5b600254604080516000602091820181905282517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152935193909416936370a08231936024808301949391928390030190829087803b15156103e657fe5b6102c65a03f115156103f457fe5b505060405151600454909150610410908763ffffffff610a2e16565b111561041c5760006000fd5b6040805160c08101825286815260208082018781528284018781526060840187815260006080860181815288151560a08801908152600160a060020a038f1683526003968790529790912095518655925160018601559051600285015551918301919091555160048083019190915591516005909101805460ff1916911515919091179055546104ac9086610a2e565b600455604080518681529051600160a060020a038089169233909116917ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa459181900360200190a35b5b505050505050565b60008054819033600160a060020a0390811691161461051c5760006000fd5b600160a060020a0383166000908152600360205260409020600581015490925060ff16151561054b5760006000fd5b600482015482546105619163ffffffff610a4816565b600160a060020a038416600090815260036020819052604082208281556001810183905560028101839055908101829055600480820192909255600501805460ff19169055549091506105ba908263ffffffff610a4816565b6004908155600254604080516000602091820181905282517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0333811696820196909652602481018790529251949093169363a9059cbb936044808501948390030190829087803b151561063357fe5b6102c65a03f1151561064157fe5b5050604080518381529051600160a060020a03861692507fe25d8515ad21a65f901eaac99e62ae923aa01c8eb5812dce069abd9ea2785b579181900360200190a25b5b505050565b60015433600160a060020a0390811691161415610706576001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617808455919093169093556040519092909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35b5b565b60045481565b600160a060020a033316600090815260036020526040812080549091908190151561073a5760006000fd5b6040805160c08101825284548152600185015460208201526002850154918101919091526003840154606082015260048401546080820152600584015460ff16151560a082015261078b90426109aa565b915081151561079957610683565b60048301546107af90839063ffffffff610a4816565b90508015156107bd57610683565b60048301546107d2908263ffffffff610a2e16565b600480850191909155546107ec908263ffffffff610a4816565b6004908155600254604080516000602091820181905282517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0333811696820196909652602481018790529251949093169363a9059cbb936044808501948390030190829087803b151561086557fe5b6102c65a03f1151561087357fe5b5050604080518381529051600160a060020a03331692507f18a0e773189b1ed3c86000a786f0a897168a9b8b2a805c482c91e69ca25e4b3c9181900360200190a25b505050565b600054600160a060020a031681565b600360208190526000918252604090912080546001820154600283015493830154600484015460059094015492949193919290919060ff1686565b600154600160a060020a031681565b60005433600160a060020a0390811691161461092f5760006000fd5b600160a060020a03811615156109455760006000fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519181169133909116907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a35b5b50565b600082604001518210156109c057506000610a28565b606083015182106109d357508151610a28565b610a256109f184602001518560600151610a4890919063ffffffff16565b610a19610a0b866020015186610a4890919063ffffffff16565b86519063ffffffff610a5f16565b9063ffffffff610a8e16565b90505b92915050565b600082820183811015610a3d57fe5b8091505b5092915050565b600082821115610a5457fe5b508082035b92915050565b6000828202831580610a7b5750828482811515610a7857fe5b04145b1515610a3d57fe5b8091505b5092915050565b600060008284811515610a9d57fe5b0490508091505b50929150505600a165627a7a723058200df6488b6d1243c35b3f8dd4808249b66a0144dcc6cf4f7275556c5d84e8cfd70029a165627a7a723058208a943274414e1ae2a3fbc32c625dddfe2e97a1c3dbf51d669005b498181d6e480029000000000000000000000000006bea43baa3f7a6f765f14f10a1a1b08334ef450000000000000000000000003dd88b391fe62a91436181ed2d43e20b86cde60c000000000000000000000000000000000000000000000000000000005981dae0

Deployed Bytecode

0x606060405236156101175763ffffffff60e060020a60003504166314a8bd0d81146101605780631bb534ba146101825780631be05289146101ae57806330f7cf80146101d05780633197cbb6146101fc5780633381ffe01461021e5780634bb278f31461023c578063518ab2a81461024e5780636f68d6341461027057806378e979251461028257806379aca4e0146102a457806379ba5097146102b657806379fb18ac146102c85780637e8c3ab6146102e65780638d4e4083146102f85780638da5cb5b1461031c57806390de9ed9146103485780639d837ccd1461036a5780639ed933181461038c578063d091b550146103a2578063f2fde38b146103ce578063f677cf0d146103ec578063fdf97cb214610410575b61015e5b6007546a187c0b371c7ead0400000090101580610139575060045442105b8061014657506005544210155b156101515760006000fd5b61015a3361043c565b5b5b565b005b341561016857fe5b61017061058e565b60408051918252519081900360200190f35b341561018a57fe5b610192610593565b60408051600160a060020a039092168252519081900360200190f35b34156101b657fe5b6101706105a2565b60408051918252519081900360200190f35b34156101d857fe5b6101926105a9565b60408051600160a060020a039092168252519081900360200190f35b341561020457fe5b6101706105b8565b60408051918252519081900360200190f35b341561022657fe5b61015e600160a060020a03600435166105be565b005b341561024457fe5b61015e610653565b005b341561025657fe5b610170610a97565b60408051918252519081900360200190f35b341561027857fe5b61015e610a9d565b005b341561028a57fe5b610170610b29565b60408051918252519081900360200190f35b34156102ac57fe5b61015e610b2f565b005b34156102be57fe5b61015e610bbb565b005b34156102d057fe5b61015e600160a060020a0360043516610c3b565b005b34156102ee57fe5b61015e610cd0565b005b341561030057fe5b610308610de1565b604080519115158252519081900360200190f35b341561032457fe5b610192610e02565b60408051600160a060020a039092168252519081900360200190f35b341561035057fe5b610170610e11565b60408051918252519081900360200190f35b341561037257fe5b610170610e20565b60408051918252519081900360200190f35b61015e600160a060020a036004351661043c565b005b34156103aa57fe5b610192610e27565b60408051600160a060020a039092168252519081900360200190f35b34156103d657fe5b61015e600160a060020a0360043516610e36565b005b34156103f457fe5b610308610ecd565b604080519115158252519081900360200190f35b341561041857fe5b610192610edd565b60408051600160a060020a039092168252519081900360200190f35b60006000600060c86202422002670de0b6b3a764000002600754101580610464575060045442105b8061047157506005544210155b1561047c5760006000fd5b600160a060020a03841615156104925760006000fd5b600034116104a05760006000fd5b60015460a860020a900460ff1615156104b557fe5b6104ed6104c93460c863ffffffff610eec16565b6007546104e8906a187c0b371c7ead040000009063ffffffff610f1b16565b610f32565b92506105008360c863ffffffff610f4c16565b915061050c8484610f69565b600654604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561053d57fe5b61054d348363ffffffff610f1b16565b9050600081111561058557604051600160a060020a0333169082156108fc029083906000818181858888f19350505050151561058557fe5b5b5b5b50505050565b60c881565b600654600160a060020a031681565b6212750081565b600254600160a060020a031681565b60055481565b60005433600160a060020a039081169116146105da5760006000fd5b600354604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b151561063d57fe5b6102c65a03f1151561058557fe5b5050505b5b50565b60075460009081906a187c0b371c7ead040000009010158061067757506005544210155b15156106835760006000fd5b60015474010000000000000000000000000000000000000000900460ff16156106ac5760006000fd5b600254600160a060020a03166106c0611057565b600160a060020a03909116815260405190819003602001906000f08015156106e457fe5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560075491506107326064610726846037610eec565b9063ffffffff610f4c16565b600254604080517f867904b400000000000000000000000000000000000000000000000000000000815273bc14105ccddeaadb96ba8dce18b40c45b6bacf586004820152602481018490529051929350600160a060020a039091169163867904b49160448082019260009290919082900301818387803b15156107b157fe5b6102c65a03f115156107bf57fe5b5050600254600354600160a060020a03918216925063867904b491166107eb858563ffffffff610f1b16565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b151561083957fe5b6102c65a03f1151561084757fe5b5050600354600160a060020a03169050635ee7e96d73b54c6a870d4ad65e23d471fb7941ad271d323f5e610893606461072687601963ffffffff610eec16565b9063ffffffff610f4c16565b42806108a9816301e1338063ffffffff61103d16565b6040805160e060020a63ffffffff8916028152600160a060020a0390961660048701526024860194909452604485019290925260648401526084830152600160a48301525160c480830192600092919082900301818387803b151561090a57fe5b6102c65a03f1151561091857fe5b5050600354600160a060020a03169050635ee7e96d734eb4cd1d125d9d281709ff38d65b99a6927b46c1610964606461072687601463ffffffff610eec16565b9063ffffffff610f4c16565b428061097a816303c2670063ffffffff61103d16565b6040805160e060020a63ffffffff8916028152600160a060020a0390961660048701526024860194909452604485019290925260648401526084830152600160a48301525160c480830192600092919082900301818387803b15156109db57fe5b6102c65a03f115156109e957fe5b5050600254604080517f1608f18f0000000000000000000000000000000000000000000000000000000081526000600482018190529151600160a060020a039093169350631608f18f926024808301939282900301818387803b1515610a4b57fe5b6102c65a03f11515610a5957fe5b50506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055505b5b5050565b60075481565b60005433600160a060020a03908116911614610ab95760006000fd5b600354604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916379ba50979160048082019260009290919082900301818387803b1515610b1457fe5b6102c65a03f11515610b2257fe5b5050505b5b565b60045481565b60005433600160a060020a03908116911614610b4b5760006000fd5b600254604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916379ba50979160048082019260009290919082900301818387803b1515610b1457fe5b6102c65a03f11515610b2257fe5b5050505b5b565b60015433600160a060020a039081169116141561015a576001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617808455919093169093556040519092909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35b5b565b60005433600160a060020a03908116911614610c575760006000fd5b600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b151561063d57fe5b6102c65a03f1151561058557fe5b5050505b5b50565b60005433600160a060020a03908116911614610cec5760006000fd5b60015460a860020a900460ff1615610d045760006000fd5b60075415610d0e57fe5b600254604080516000602091820181905282517f18160ddd0000000000000000000000000000000000000000000000000000000081529251600160a060020a03909416936318160ddd9360048082019493918390030190829087803b1515610d7257fe5b6102c65a03f11515610d8057fe5b505060405151159050610d8f57fe5b610db8739065260ef6830f6372f1bde408dec57fe31505306a0c3e059b8e3f5682000000610f69565b6001805475ff000000000000000000000000000000000000000000191660a860020a1790555b5b565b60015474010000000000000000000000000000000000000000900460ff1681565b600054600160a060020a031681565b6a187c0b371c7ead0400000081565b6202422081565b600154600160a060020a031681565b60005433600160a060020a03908116911614610e525760006000fd5b600160a060020a0381161515610e685760006000fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519181169133909116907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a35b5b50565b60015460a860020a900460ff1681565b600354600160a060020a031681565b6000828202831580610f085750828482811515610f0557fe5b04145b1515610f1057fe5b8091505b5092915050565b600082821115610f2757fe5b508082035b92915050565b6000818310610f415781610f43565b825b90505b92915050565b600060008284811515610f5b57fe5b0490508091505b5092915050565b600754610f7c908263ffffffff61103d16565b600755600254604080517f867904b4000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163867904b491604480830192600092919082900301818387803b1515610fe957fe5b6102c65a03f11515610ff757fe5b5050604080518381529051600160a060020a03851692507f21d739f160a7464fddaac4a1d1517d84e76b75618a053943b345c408c4160fe09181900360200190a25b5050565b600082820183811015610f1057fe5b8091505b5092915050565b604051610b55806110688339019056006060604052341561000c57fe5b604051602080610b5583398101604052515b5b60008054600160a060020a03191633600160a060020a03161790555b600160a060020a03811615156100515760006000fd5b60028054600160a060020a031916600160a060020a0383161790555b505b610ad78061007e6000396000f300606060405236156100ac5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631a64adae81146100ae57806330f7cf80146100df5780635ee7e96d1461010b57806374a8f1031461013a57806379ba5097146101585780637c17357d1461016a57806383fcf9731461018c5780638da5cb5b1461019e578063b869cea3146101ca578063d091b5501461021b578063f2fde38b14610247575bfe5b34156100b657fe5b6100cd600160a060020a0360043516602435610265565b60408051918252519081900360200190f35b34156100e757fe5b6100ef6102e9565b60408051600160a060020a039092168252519081900360200190f35b341561011357fe5b610138600160a060020a036004351660243560443560643560843560a43515156102f8565b005b341561014257fe5b610138600160a060020a03600435166104fd565b005b341561016057fe5b610138610689565b005b341561017257fe5b6100cd610709565b60408051918252519081900360200190f35b341561019457fe5b61013861070f565b005b34156101a657fe5b6100ef6108ba565b60408051600160a060020a039092168252519081900360200190f35b34156101d257fe5b6101e6600160a060020a03600435166108c9565b6040805196875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b341561022357fe5b6100ef610904565b60408051600160a060020a039092168252519081900360200190f35b341561024f57fe5b610138600160a060020a0360043516610913565b005b600160a060020a03821660009081526003602052604081208054151561028e57600091506102e2565b6040805160c08101825282548152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460ff16151560a08201526102df90846109aa565b91505b5092915050565b600254600160a060020a031681565b60005433600160a060020a039081169116146103145760006000fd5b600160a060020a038616151561032a5760006000fd5b600085116103385760006000fd5b600160a060020a0386166000908152600360205260409020541561035c5760006000fd5b82841115801561036c5750818311155b15156103785760006000fd5b600254604080516000602091820181905282517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152935193909416936370a08231936024808301949391928390030190829087803b15156103e657fe5b6102c65a03f115156103f457fe5b505060405151600454909150610410908763ffffffff610a2e16565b111561041c5760006000fd5b6040805160c08101825286815260208082018781528284018781526060840187815260006080860181815288151560a08801908152600160a060020a038f1683526003968790529790912095518655925160018601559051600285015551918301919091555160048083019190915591516005909101805460ff1916911515919091179055546104ac9086610a2e565b600455604080518681529051600160a060020a038089169233909116917ffabf00c3717e5e33d6fcc433d4d70ef919a4101fb7d5c444fe349927034eaa459181900360200190a35b5b505050505050565b60008054819033600160a060020a0390811691161461051c5760006000fd5b600160a060020a0383166000908152600360205260409020600581015490925060ff16151561054b5760006000fd5b600482015482546105619163ffffffff610a4816565b600160a060020a038416600090815260036020819052604082208281556001810183905560028101839055908101829055600480820192909255600501805460ff19169055549091506105ba908263ffffffff610a4816565b6004908155600254604080516000602091820181905282517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0333811696820196909652602481018790529251949093169363a9059cbb936044808501948390030190829087803b151561063357fe5b6102c65a03f1151561064157fe5b5050604080518381529051600160a060020a03861692507fe25d8515ad21a65f901eaac99e62ae923aa01c8eb5812dce069abd9ea2785b579181900360200190a25b5b505050565b60015433600160a060020a0390811691161415610706576001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617808455919093169093556040519092909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35b5b565b60045481565b600160a060020a033316600090815260036020526040812080549091908190151561073a5760006000fd5b6040805160c08101825284548152600185015460208201526002850154918101919091526003840154606082015260048401546080820152600584015460ff16151560a082015261078b90426109aa565b915081151561079957610683565b60048301546107af90839063ffffffff610a4816565b90508015156107bd57610683565b60048301546107d2908263ffffffff610a2e16565b600480850191909155546107ec908263ffffffff610a4816565b6004908155600254604080516000602091820181905282517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0333811696820196909652602481018790529251949093169363a9059cbb936044808501948390030190829087803b151561086557fe5b6102c65a03f1151561087357fe5b5050604080518381529051600160a060020a03331692507f18a0e773189b1ed3c86000a786f0a897168a9b8b2a805c482c91e69ca25e4b3c9181900360200190a25b505050565b600054600160a060020a031681565b600360208190526000918252604090912080546001820154600283015493830154600484015460059094015492949193919290919060ff1686565b600154600160a060020a031681565b60005433600160a060020a0390811691161461092f5760006000fd5b600160a060020a03811615156109455760006000fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519181169133909116907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a35b5b50565b600082604001518210156109c057506000610a28565b606083015182106109d357508151610a28565b610a256109f184602001518560600151610a4890919063ffffffff16565b610a19610a0b866020015186610a4890919063ffffffff16565b86519063ffffffff610a5f16565b9063ffffffff610a8e16565b90505b92915050565b600082820183811015610a3d57fe5b8091505b5092915050565b600082821115610a5457fe5b508082035b92915050565b6000828202831580610a7b5750828482811515610a7857fe5b04145b1515610a3d57fe5b8091505b5092915050565b600060008284811515610a9d57fe5b0490508091505b50929150505600a165627a7a723058200df6488b6d1243c35b3f8dd4808249b66a0144dcc6cf4f7275556c5d84e8cfd70029a165627a7a723058208a943274414e1ae2a3fbc32c625dddfe2e97a1c3dbf51d669005b498181d6e480029

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

000000000000000000000000006bea43baa3f7a6f765f14f10a1a1b08334ef450000000000000000000000003dd88b391fe62a91436181ed2d43e20b86cde60c000000000000000000000000000000000000000000000000000000005981dae0

-----Decoded View---------------
Arg [0] : _stox (address): 0x006BeA43Baa3f7A6f765F14f10A1a1b08334EF45
Arg [1] : _fundingRecipient (address): 0x3dD88B391fe62a91436181eD2D43E20B86CDE60c
Arg [2] : _startTime (uint256): 1501682400

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000006bea43baa3f7a6f765f14f10a1a1b08334ef45
Arg [1] : 0000000000000000000000003dd88b391fe62a91436181ed2d43e20b86cde60c
Arg [2] : 000000000000000000000000000000000000000000000000000000005981dae0


Swarm Source

bzzr://8a943274414e1ae2a3fbc32c625dddfe2e97a1c3dbf51d669005b498181d6e48

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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