Sponsored:   INLOCK - Put Your BTC, Get Your Cash! Crypto Backed Loans, 3.2M Raised Already. Join NOW!
Contract Overview | VeChain
Balance: 0 Ether
Ether Value: $0
Transactions: 411360 txns
Token Tracker: VeChain (VEN)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0x5cd9f1c602ca78444142568958151027b1334d36at txn 0xb649f4a1585900faa4d44178e0c6994cce83e628a0ed31d9f699e2801d283916
Token Balance:
 Latest 25 txns From a total of 411360 Transactions
(+15 PendingTxns)

TxHash Age From To Value [TxFee]
0x25a3230e5cbce909653bbaba7f5ebaa2edc840d525cb1cc813f95291bc004e76(pending)0x707fb994b0d3cf91b31ba5aa0deb3f5b86cdc0cb  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x98c74be0888ea8bad21d49f2e6040bef3bbd99f07a60f5843815349158d600e5(pending)0x950daaedf4cc125a81b19b8718dddd5991bbf0e4  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x23cfbc8d18e25cbdfc99433d7dc9f042f3316ec91df1e85fbfe1784dcb4fc94b(pending)0x8f36e6f16e0742046d4bed8205db86c74d89c2f8  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xcca741db783e929fdd8d7f84ba07797464ac0f0089bad8163bc7a7b04efed6d9(pending)0xb6d975ff228fab7c44e024ac68966010d21f0f55  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xabe504916c576044b60aa4cbb2ffdd51c8974487afed90350d7e57d58a687a14(pending)0x9b262195a962e7165b3b24c69c33d31802fc21ce  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xdff3b37b89ea93bc48d25d7d89cfb58eebf2d63b882cf4e9fee6f975ea5db5ea(pending)0x38ce21d1f1ac15214b24c4d2bd158f98812388da  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xc592738a06e6375a1faf390fbc3d4fa1aed1a771c09d3a59cab95e9625c7611f(pending)0xd21b08461fcb217833c03ada51ba7ad416c0f9fe  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x9d1041aee00256d6eb4f3a7d0deec709465312e076c0b82e30010a1105cf7552(pending)0x54e9c4c21d457d793f0f12a35665131330fc1cf6  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x9aa76d4b1e215a46f9a918ef1171583fecbfcd00727e6f9c86ee66104fd9c5b0(pending)0x4b375d473ef802fec3d483903af8f9bc1edf52ce  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x423a9b6c5e695dba8a869ee9d0a458831acc369076775ff7f6cc650d966e0c07(pending)0x56a15a63d24316f558811781e63f7554684fa18a  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xb1f334189570381da6ac5498f16ffee8e4f90e2a42a0370a52f17dd6e9b99b66(pending)0x3b1b2ef125fe139cdf2794c1b3b19c99478c2333  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xe37e1581e59542338a695fbee8fbc4fdabceb2541dc6c28683e40c385ff103c8(pending)0x4ee635e7e816c3f1d03bd509c4eca5c65206ab63  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x692c4a262b9aa0d5ea53c40b40b3903c97fe1f321af477248624e152efa00d5b(pending)0x1ea0bd4df96da5bdbc0401f1ea975c00d720a225  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x639dbec6aaeeed14944c7f33f82ceb62cdf61c8ffc9476390f5f9a6344a9516d(pending)0xc0c226b735956a3c14b703d84c8c74fa4c7b3e50  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0x1798ea8fccb4c56f01cef5ecbf84e3038bca820ce5a8a186cb191d56bf415ded(pending)0x14f37f9fd05ab877200c992418ee71f1b1d03911  IN  0xd850942ef8811f2a866692a623011bde52a462c10 Ether(Pending)
0xdffb024572fdecc3d997acf3f06b502ac9c75b42f940498cc6733cd989455f5a6 mins ago0x046ede8216fc4eabad7bc8ad7fa42d78056fd5f3  IN   VeChain0 Ether0.002214123
0x5abb6427dbb9425df353beafc11e5f02ebda565aa38d7a7dcfefa555662c5da210 mins ago0x1eaca90931dd14528aa4558a6dc85dbae5e1fea6  IN   VeChain0 Ether0.001606995
0x3b8a6c191c11791dba02124fca90370e783d73b401f2d55092d4e66918d553ec18 mins ago0x1e9abcb3548035eb53f2f4083d60acb8729d4a8a  IN   VeChain0 Ether0.00054003
0x61aa3fe83d9516504015b05afe43a6aa5ef17d612b7c9c244a43a01ef2ed52eb20 mins ago0xd1c4eebd6f8ab62ca2a6699577c7a7f16d1b4253  IN   VeChain0 Ether0.001878288
0x339236c137c0798737ff1a24fe819d8c9f9fd45d1e88af814d3b86d0d9b0884c21 mins ago0x6985a08f33a856f90293cba6c66936d6091e686a  IN   VeChain0 Ether0.00352755
0x90e6dcd2397f569fcb790b2881995ab906f0a18cd6c6e4c249fd472db272239729 mins ago0x318342bb066c49b6b7651cf399b40261e016d6f0  IN   VeChain0 Ether0.002214123
0xe26ae5aac49101366287bb16f479c9730847111b71643e0d6600d6b840c58d1738 mins ago0x8789a9b1a8e7354bf82368a1c7f5c4f6fc5c66f1  IN   VeChain0 Ether0.000653265
0x1cf8faa1f7f8c4a9258f3f919484e26c950dc760ea76c5428a561537c9a31c3642 mins ago0x11d1dfe82e6e27175f3e10a815832791c0947357  IN   VeChain0 Ether0.00062740125
0x6bbd4fea742cb3eb8cdee75c95b8da31ce408639bd531472cac42e0df5fa756454 mins ago0xcb1383c6ceb25acda70bf62b06336ebe6c083ab7  IN   VeChain0 Ether0.0006591507
0x59ff484497b1658757731f350a26d2bfbce8391407f8e60946b32de48495845354 mins ago0xcb1383c6ceb25acda70bf62b06336ebe6c083ab7  IN   VeChain0 Ether0.0009126507
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Contract Name: VEN
Compiler Text: v0.4.11+commit.68ef5810
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.11;

contract Owned {

    address public owner;

    function Owned() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function setOwner(address _newOwner) onlyOwner {
        owner = _newOwner;
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal constant 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 constant returns (uint256) {
    assert(b <= a);
    return a - b;
  }

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

  function toUINT112(uint256 a) internal constant returns(uint112) {
    assert(uint112(a) == a);
    return uint112(a);
  }

  function toUINT120(uint256 a) internal constant returns(uint120) {
    assert(uint120(a) == a);
    return uint120(a);
  }

  function toUINT128(uint256 a) internal constant returns(uint128) {
    assert(uint128(a) == a);
    return uint128(a);
  }
}


// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/issues/20

contract Token {
    /* This is a slight change to the ERC20 base standard.
    function totalSupply() constant returns (uint256 supply);
    is replaced with:
    uint256 public totalSupply;
    This automatically creates a getter function for the totalSupply.
    This is moved to the base contract since public getter functions are not
    currently recognised as an implementation of the matching abstract
    function by the compiler.
    */
    /// total amount of tokens
    //uint256 public totalSupply;
    function totalSupply() constant returns (uint256 supply);

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) constant returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);

    /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of wei to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint256 _value) returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    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);
}


/// VEN token, ERC20 compliant
contract VEN is Token, Owned {
    using SafeMath for uint256;

    string public constant name    = "VeChain Token";  //The Token's name
    uint8 public constant decimals = 18;               //Number of decimals of the smallest unit
    string public constant symbol  = "VEN";            //An identifier    

    // packed to 256bit to save gas usage.
    struct Supplies {
        // uint128's max value is about 3e38.
        // it's enough to present amount of tokens
        uint128 total;
        uint128 rawTokens;
    }

    Supplies supplies;

    // Packed to 256bit to save gas usage.    
    struct Account {
        // uint112's max value is about 5e33.
        // it's enough to present amount of tokens
        uint112 balance;

        // raw token can be transformed into balance with bonus        
        uint112 rawTokens;

        // safe to store timestamp
        uint32 lastMintedTimestamp;
    }

    // Balances for each account
    mapping(address => Account) accounts;

    // Owner of account approves the transfer of an amount to another account
    mapping(address => mapping(address => uint256)) allowed;

    // bonus that can be shared by raw tokens
    uint256 bonusOffered;

    // Constructor
    function VEN() {
    }

    function totalSupply() constant returns (uint256 supply){
        return supplies.total;
    }

    // Send back ether sent to me
    function () {
        revert();
    }

    // If sealed, transfer is enabled and mint is disabled
    function isSealed() constant returns (bool) {
        return owner == 0;
    }

    function lastMintedTimestamp(address _owner) constant returns(uint32) {
        return accounts[_owner].lastMintedTimestamp;
    }

    // Claim bonus by raw tokens
    function claimBonus(address _owner) internal{      
        require(isSealed());
        if (accounts[_owner].rawTokens != 0) {
            uint256 realBalance = balanceOf(_owner);
            uint256 bonus = realBalance
                .sub(accounts[_owner].balance)
                .sub(accounts[_owner].rawTokens);

            accounts[_owner].balance = realBalance.toUINT112();
            accounts[_owner].rawTokens = 0;
            if(bonus > 0){
                Transfer(this, _owner, bonus);
            }
        }
    }

    // What is the balance of a particular account?
    function balanceOf(address _owner) constant returns (uint256 balance) {
        if (accounts[_owner].rawTokens == 0)
            return accounts[_owner].balance;

        if (bonusOffered > 0) {
            uint256 bonus = bonusOffered
                 .mul(accounts[_owner].rawTokens)
                 .div(supplies.rawTokens);

            return bonus.add(accounts[_owner].balance)
                    .add(accounts[_owner].rawTokens);
        }
        
        return uint256(accounts[_owner].balance)
            .add(accounts[_owner].rawTokens);
    }

    // Transfer the balance from owner's account to another account
    function transfer(address _to, uint256 _amount) returns (bool success) {
        require(isSealed());

        // implicitly claim bonus for both sender and receiver
        claimBonus(msg.sender);
        claimBonus(_to);

        // according to VEN's total supply, never overflow here
        if (accounts[msg.sender].balance >= _amount
            && _amount > 0) {            
            accounts[msg.sender].balance -= uint112(_amount);
            accounts[_to].balance = _amount.add(accounts[_to].balance).toUINT112();
            Transfer(msg.sender, _to, _amount);
            return true;
        } else {
            return false;
        }
    }

    // Send _value amount of tokens from address _from to address _to
    // The transferFrom method is used for a withdraw workflow, allowing contracts to send
    // tokens on your behalf, for example to "deposit" to a contract address and/or to charge
    // fees in sub-currencies; the command should fail unless the _from account has
    // deliberately authorized the sender of the message via some mechanism; we propose
    // these standardized APIs for approval:
    function transferFrom(
        address _from,
        address _to,
        uint256 _amount
    ) returns (bool success) {
        require(isSealed());

        // implicitly claim bonus for both sender and receiver
        claimBonus(_from);
        claimBonus(_to);

        // according to VEN's total supply, never overflow here
        if (accounts[_from].balance >= _amount
            && allowed[_from][msg.sender] >= _amount
            && _amount > 0) {
            accounts[_from].balance -= uint112(_amount);
            allowed[_from][msg.sender] -= _amount;
            accounts[_to].balance = _amount.add(accounts[_to].balance).toUINT112();
            Transfer(_from, _to, _amount);
            return true;
        } else {
            return false;
        }
    }

    // Allow _spender to withdraw from your account, multiple times, up to the _value amount.
    // If this function is called again it overwrites the current allowance with _value.
    function approve(address _spender, uint256 _amount) returns (bool success) {
        allowed[msg.sender][_spender] = _amount;
        Approval(msg.sender, _spender, _amount);
        return true;
    }

    /* Approves and then calls the receiving contract */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);

        //call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
        //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
        //it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.
        //if(!_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { revert(); }
        ApprovalReceiver(_spender).receiveApproval(msg.sender, _value, this, _extraData);
        return true;
    }

    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }

    // Mint tokens and assign to some one
    function mint(address _owner, uint256 _amount, bool _isRaw, uint32 timestamp) onlyOwner{
        if (_isRaw) {
            accounts[_owner].rawTokens = _amount.add(accounts[_owner].rawTokens).toUINT112();
            supplies.rawTokens = _amount.add(supplies.rawTokens).toUINT128();
        } else {
            accounts[_owner].balance = _amount.add(accounts[_owner].balance).toUINT112();
        }

        accounts[_owner].lastMintedTimestamp = timestamp;

        supplies.total = _amount.add(supplies.total).toUINT128();
        Transfer(0, _owner, _amount);
    }
    
    // Offer bonus to raw tokens holder
    function offerBonus(uint256 _bonus) onlyOwner { 
        bonusOffered = bonusOffered.add(_bonus);
        supplies.total = _bonus.add(supplies.total).toUINT128();
        Transfer(0, this, _bonus);
    }

    // Set owner to zero address, to disable mint, and enable token transfer
    function seal() onlyOwner {
        setOwner(0);
    }
}

contract ApprovalReceiver {
    function receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData);
}


// Contract to sell and distribute VEN tokens
contract VENSale is Owned{

    /// chart of stage transition 
    ///
    /// deploy   initialize      startTime                            endTime                 finalize
    ///                              | <-earlyStageLasts-> |             | <- closedStageLasts -> |
    ///  O-----------O---------------O---------------------O-------------O------------------------O------------>
    ///     Created     Initialized           Early             Normal             Closed            Finalized
    enum Stage {
        NotCreated,
        Created,
        Initialized,
        Early,
        Normal,
        Closed,
        Finalized
    }

    using SafeMath for uint256;
    
    uint256 public constant totalSupply         = (10 ** 9) * (10 ** 18); // 1 billion VEN, decimals set to 18

    uint256 constant privateSupply              = totalSupply * 9 / 100;  // 9% for private ICO
    uint256 constant commercialPlan             = totalSupply * 23 / 100; // 23% for commercial plan
    uint256 constant reservedForTeam            = totalSupply * 5 / 100;  // 5% for team
    uint256 constant reservedForOperations      = totalSupply * 22 / 100; // 22 for operations

    // 59%
    uint256 public constant nonPublicSupply     = privateSupply + commercialPlan + reservedForTeam + reservedForOperations;
    // 41%
    uint256 public constant publicSupply = totalSupply - nonPublicSupply;


    uint256 public constant officialLimit = 64371825 * (10 ** 18);
    uint256 public constant channelsLimit = publicSupply - officialLimit;

    // packed to 256bit
    struct SoldOut {
        uint16 placeholder; // placeholder to make struct pre-alloced

        // amount of tokens officially sold out.
        // max value of 120bit is about 1e36, it's enough for token amount
        uint120 official; 

        uint120 channels; // amount of tokens sold out via channels
    }

    SoldOut soldOut;
    
    uint256 constant venPerEth = 3500;  // normal exchange rate
    uint256 constant venPerEthEarlyStage = venPerEth + venPerEth * 15 / 100;  // early stage has 15% reward

    uint constant minBuyInterval = 30 minutes; // each account can buy once in 30 minutes
    uint constant maxBuyEthAmount = 30 ether;
   
    VEN ven; // VEN token contract follows ERC20 standard

    address ethVault; // the account to keep received ether
    address venVault; // the account to keep non-public offered VEN tokens

    uint public constant startTime = 1503057600; // time to start sale
    uint public constant endTime = 1504180800;   // tiem to close sale
    uint public constant earlyStageLasts = 3 days; // early bird stage lasts in seconds

    bool initialized;
    bool finalized;

    function VENSale() {
        soldOut.placeholder = 1;
    }    

    /// @notice calculte exchange rate according to current stage
    /// @return exchange rate. zero if not in sale.
    function exchangeRate() constant returns (uint256){
        if (stage() == Stage.Early) {
            return venPerEthEarlyStage;
        }
        if (stage() == Stage.Normal) {
            return venPerEth;
        }
        return 0;
    }

    /// @notice for test purpose
    function blockTime() constant returns (uint32) {
        return uint32(block.timestamp);
    }

    /// @notice estimate stage
    /// @return current stage
    function stage() constant returns (Stage) { 
        if (finalized) {
            return Stage.Finalized;
        }

        if (!initialized) {
            // deployed but not initialized
            return Stage.Created;
        }

        if (blockTime() < startTime) {
            // not started yet
            return Stage.Initialized;
        }

        if (uint256(soldOut.official).add(soldOut.channels) >= publicSupply) {
            // all sold out
            return Stage.Closed;
        }

        if (blockTime() < endTime) {
            // in sale            
            if (blockTime() < startTime.add(earlyStageLasts)) {
                // early bird stage
                return Stage.Early;
            }
            // normal stage
            return Stage.Normal;
        }

        // closed
        return Stage.Closed;
    }

    function isContract(address _addr) constant internal returns(bool) {
        uint size;
        if (_addr == 0) return false;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }

    /// @notice entry to buy tokens
    function () payable {        
        buy();
    }

    /// @notice entry to buy tokens
    function buy() payable {
        // reject contract buyer to avoid breaking interval limit
        require(!isContract(msg.sender));
        require(msg.value >= 0.01 ether);

        uint256 rate = exchangeRate();
        // here don't need to check stage. rate is only valid when in sale
        require(rate > 0);
        // each account is allowed once in minBuyInterval
        require(blockTime() >= ven.lastMintedTimestamp(msg.sender) + minBuyInterval);

        uint256 requested;
        // and limited to maxBuyEthAmount
        if (msg.value > maxBuyEthAmount) {
            requested = maxBuyEthAmount.mul(rate);
        } else {
            requested = msg.value.mul(rate);
        }

        uint256 remained = officialLimit.sub(soldOut.official);
        if (requested > remained) {
            //exceed remained
            requested = remained;
        }

        uint256 ethCost = requested.div(rate);
        if (requested > 0) {
            ven.mint(msg.sender, requested, true, blockTime());
            // transfer ETH to vault
            ethVault.transfer(ethCost);

            soldOut.official = requested.add(soldOut.official).toUINT120();
            onSold(msg.sender, requested, ethCost);        
        }

        uint256 toReturn = msg.value.sub(ethCost);
        if(toReturn > 0) {
            // return over payed ETH
            msg.sender.transfer(toReturn);
        }        
    }

    /// @notice returns tokens sold officially
    function officialSold() constant returns (uint256) {
        return soldOut.official;
    }

    /// @notice returns tokens sold via channels
    function channelsSold() constant returns (uint256) {
        return soldOut.channels;
    } 

    /// @notice manually offer tokens to channel
    function offerToChannel(address _channelAccount, uint256 _venAmount) onlyOwner {
        Stage stg = stage();
        // since the settlement may be delayed, so it's allowed in closed stage
        require(stg == Stage.Early || stg == Stage.Normal || stg == Stage.Closed);

        soldOut.channels = _venAmount.add(soldOut.channels).toUINT120();

        //should not exceed limit
        require(soldOut.channels <= channelsLimit);

        ven.mint(
            _channelAccount,
            _venAmount,
            true,  // unsold tokens can be claimed by channels portion
            blockTime()
            );

        onSold(_channelAccount, _venAmount, 0);
    }

    /// @notice initialize to prepare for sale
    /// @param _ven The address VEN token contract following ERC20 standard
    /// @param _ethVault The place to store received ETH
    /// @param _venVault The place to store non-publicly supplied VEN tokens
    function initialize(
        VEN _ven,
        address _ethVault,
        address _venVault) onlyOwner {
        require(stage() == Stage.Created);

        // ownership of token contract should already be this
        require(_ven.owner() == address(this));

        require(address(_ethVault) != 0);
        require(address(_venVault) != 0);      

        ven = _ven;
        
        ethVault = _ethVault;
        venVault = _venVault;    
        
        ven.mint(
            venVault,
            reservedForTeam.add(reservedForOperations),
            false, // team and operations reserved portion can't share unsold tokens
            blockTime()
        );

        ven.mint(
            venVault,
            privateSupply.add(commercialPlan),
            true, // private ICO and commercial plan can share unsold tokens
            blockTime()
        );

        initialized = true;
        onInitialized();
    }

    /// @notice finalize
    function finalize() onlyOwner {
        // only after closed stage
        require(stage() == Stage.Closed);       

        uint256 unsold = publicSupply.sub(soldOut.official).sub(soldOut.channels);

        if (unsold > 0) {
            // unsold VEN as bonus
            ven.offerBonus(unsold);        
        }
        ven.seal();

        finalized = true;
        onFinalized();
    }

    event onInitialized();
    event onFinalized();

    event onSold(address indexed buyer, uint256 venAmount, uint256 ethCost);
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"supply","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"seal","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_bonus","type":"uint256"}],"name":"offerBonus","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isSealed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"lastMintedTimestamp","outputs":[{"name":"","type":"uint32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_isRaw","type":"bool"},{"name":"timestamp","type":"uint32"}],"name":"mint","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":false,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052341561000c57fe5b5b5b60008054600160a060020a03191633600160a060020a03161790555b5b5b6111ab8061003b6000396000f300606060405236156100d55763ffffffff60e060020a60003504166306fdde0381146100eb578063095ea7b31461017b57806313af4035146101ae57806318160ddd146101cc57806323b872dd146101ee578063313ce567146102275780633fb27b851461024d578063534eb1d41461025f578063631f98521461027457806370a08231146102985780637ba49b81146102c65780638da5cb5b146102fb57806395d89b4114610327578063a9059cbb146103b7578063b5e73249146103ea578063cae9ca5114610419578063dd62ed3e14610490575b34156100dd57fe5b6100e95b60006000fd5b565b005b34156100f357fe5b6100fb6104c4565b604080516020808252835181830152835191928392908301918501908083838215610141575b80518252602083111561014157601f199092019160209182019101610121565b505050905090810190601f16801561016d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561018357fe5b61019a600160a060020a03600435166024356104fb565b604080519115158252519081900360200190f35b34156101b657fe5b6100e9600160a060020a0360043516610566565b005b34156101d457fe5b6101dc6105af565b60408051918252519081900360200190f35b34156101f657fe5b61019a600160a060020a03600435811690602435166044356105bf565b604080519115158252519081900360200190f35b341561022f57fe5b610237610748565b6040805160ff9092168252519081900360200190f35b341561025557fe5b6100e961074d565b005b341561026757fe5b6100e9600435610777565b005b341561027c57fe5b61019a61082d565b604080519115158252519081900360200190f35b34156102a057fe5b6101dc600160a060020a036004351661083e565b60408051918252519081900360200190f35b34156102ce57fe5b6102e2600160a060020a03600435166109a6565b6040805163ffffffff9092168252519081900360200190f35b341561030357fe5b61030b6109d2565b60408051600160a060020a039092168252519081900360200190f35b341561032f57fe5b6100fb6109e1565b604080516020808252835181830152835191928392908301918501908083838215610141575b80518252602083111561014157601f199092019160209182019101610121565b505050905090810190601f16801561016d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103bf57fe5b61019a600160a060020a0360043516602435610a18565b604080519115158252519081900360200190f35b34156103f257fe5b6100e9600160a060020a0360043516602435604435151563ffffffff60643516610b56565b005b341561042157fe5b604080516020600460443581810135601f810184900484028501840190955284845261019a948235600160a060020a0316946024803595606494929391909201918190840183828082843750949650610dc095505050505050565b604080519115158252519081900360200190f35b341561049857fe5b6101dc600160a060020a0360043581169060243516610f2e565b60408051918252519081900360200190f35b60408051808201909152600d81527f5665436861696e20546f6b656e00000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260036020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005433600160a060020a039081169116146105825760006000fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6001546001608060020a03165b90565b60006105c961082d565b15156105d55760006000fd5b6105de84610f5b565b6105e783610f5b565b600160a060020a0384166000908152600260205260409020546001607060020a03168290108015906106405750600160a060020a0380851660009081526003602090815260408083203390941683529290522054829010155b801561064c5750600082115b1561073c57600160a060020a03848116600090815260026020818152604080842080546dffffffffffffffffffffffffffff1981166001607060020a039182168a900382161790915560038352818520338716865283528185208054899003905594881684529190529020546106cd916106c8918591166110aa565b6110c4565b600160a060020a0384811660008181526002602090815260409182902080546dffffffffffffffffffffffffffff19166001607060020a0396909616959095179094558051868152905191939288169260008051602061116083398151915292918290030190a3506001610740565b5060005b5b9392505050565b601281565b60005433600160a060020a039081169116146107695760006000fd5b6100e76000610566565b5b5b565b60005433600160a060020a039081169116146107935760006000fd5b6004546107a6908263ffffffff6110aa16565b6004556001546107cf906107ca9083906001608060020a031663ffffffff6110aa16565b6110e0565b600180546fffffffffffffffffffffffffffffffff19166001608060020a039290921691909117905560408051828152905130600160a060020a031691600091600080516020611160833981519152916020908290030190a35b5b50565b600054600160a060020a0316155b90565b600160a060020a0381166000908152600260205260408120548190607060020a90046001607060020a0316151561089857600160a060020a0383166000908152600260205260409020546001607060020a031691506109a0565b6000600454111561096157600154600160a060020a03841660009081526002602052604090205460045461090a9270010000000000000000000000000000000090046001608060020a0316916108fe9190607060020a90046001607060020a03166110fc565b9063ffffffff61112b16565b600160a060020a03841660009081526002602052604090205490915061095a906001607060020a03607060020a820481169161094e9185911663ffffffff6110aa16565b9063ffffffff6110aa16565b91506109a0565b600160a060020a03831660009081526002602052604090205461099d906001607060020a0380821691607060020a90041663ffffffff6110aa16565b91505b50919050565b600160a060020a03811660009081526002602052604090205460e060020a900463ffffffff165b919050565b600054600160a060020a031681565b60408051808201909152600381527f56454e0000000000000000000000000000000000000000000000000000000000602082015281565b6000610a2261082d565b1515610a2e5760006000fd5b610a3733610f5b565b610a4083610f5b565b600160a060020a0333166000908152600260205260409020546001607060020a0316829010801590610a725750600082115b15610b475733600160a060020a0390811660009081526002602052604080822080546dffffffffffffffffffffffffffff1981166001607060020a039182168890038216179091559286168252902054610ad7916106c8918591166110aa565b6110c4565b600160a060020a0384811660008181526002602090815260409182902080546dffffffffffffffffffffffffffff19166001607060020a039690961695909517909455805186815290519193339093169260008051602061116083398151915292918290030190a3506001610560565b506000610560565b5b92915050565b60005433600160a060020a03908116911614610b725760006000fd5b8115610c7257600160a060020a038416600090815260026020526040902054610bb5906106c8908590607060020a90046001607060020a03166110aa565b6110c4565b600160a060020a038516600090815260026020526040902080546001607060020a0392909216607060020a027bffffffffffffffffffffffffffff000000000000000000000000000019909216919091179055600154610c43906107ca9085906001608060020a037001000000000000000000000000000000009091041663ffffffff6110aa16565b6110e0565b600180546001608060020a03928316700100000000000000000000000000000000029216919091179055610cec565b600160a060020a038416600090815260026020526040902054610cae906106c89085906001607060020a031663ffffffff6110aa16565b6110c4565b600160a060020a038516600090815260026020526040902080546dffffffffffffffffffffffffffff19166001607060020a03929092169190911790555b600160a060020a0384166000908152600260205260409020805463ffffffff80841660e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117909155600154610d5f916107ca9186916001608060020a03909116906110aa16565b6110e0565b600180546fffffffffffffffffffffffffffffffff19166001608060020a0392909216919091179055604080518481529051600160a060020a03861691600091600080516020611160833981519152916020908290030190a35b5b50505050565b600160a060020a03338116600081815260036020908152604080832094881680845294825280832087905580518781529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a383600160a060020a0316638f4ffcb1338530866040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360008314610ec7575b805182526020831115610ec757601f199092019160209182019101610ea7565b505050905090810190601f168015610ef35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1515610f1157fe5b6102c65a03f11515610f1f57fe5b505050600190505b9392505050565b600160a060020a038083166000908152600360209081526040808320938516835292905220545b92915050565b60006000610f6761082d565b1515610f735760006000fd5b600160a060020a038316600090815260026020526040902054607060020a90046001607060020a0316156110a357610faa8361083e565b600160a060020a038416600090815260026020526040902054909250610ffa906001607060020a03607060020a8204811691610fee9186911663ffffffff61114816565b9063ffffffff61114816565b9050611005826110c4565b600160a060020a038416600090815260026020526040812080546dffffffffffffffffffffffffffff19166001607060020a0393909316929092177bffffffffffffffffffffffffffff000000000000000000000000000019169091558111156110a35782600160a060020a031630600160a060020a0316600080516020611160833981519152836040518082815260200191505060405180910390a35b5b5b505050565b6000828201838110156110b957fe5b8091505b5092915050565b60006001607060020a03821682146110d857fe5b50805b919050565b60006001608060020a03821682146110d857fe5b50805b919050565b6000828202831580611118575082848281151561111557fe5b04145b15156110b957fe5b8091505b5092915050565b60006000828481151561113a57fe5b0490508091505b5092915050565b60008282111561115457fe5b508082035b929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820fa35cb6d9fd595f5020f436c343eb13b8bbbc3984f4c28bc7b89d36062d268a60029

   Swarm Source:
bzzr://fa35cb6d9fd595f5020f436c343eb13b8bbbc3984f4c28bc7b89d36062d268a6

 

View All
Block Age transaction Difficulty Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.