Contract 0xfd26d4fedea09da1bb2c4e410c747dda72fdb506

 

TxHash Block Age From To Value [TxFee]
0x76c9905846006d3b2cae7a3b28fa8b30b22e6cd5abb6287b7d39e413ceb9705f5294288365 days 23 hrs ago0xe4925c73851490401b858b657f26e62e9ad20f66 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060 Ether0.00153355
0xab4bd4a6fc9af5c929d472a4b62b412473804060968f758acfa4f023d3135ca55236678375 days 18 hrs ago0xc5010c73abd6b47e4ffd9ccc3299059c4a4a0970 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50656 Ether0.000333885
0xa10c3d0e6675aef4197a3e070a6d711dca2b1e7fb7c48684e3e36487e40faaf95236670375 days 18 hrs ago0xc5010c73abd6b47e4ffd9ccc3299059c4a4a0970 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50633 Ether0.000333885
0xd7c3ba28a91184a834d19a3fd4d66ae17769b9fc8591bcbf796ca2357bdb787b5236652375 days 18 hrs ago0xc5010c73abd6b47e4ffd9ccc3299059c4a4a0970 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5061 Ether0.00071486
0xf107b931345f3edba05aceca23c9771ec73da15f38d3b0dfed9cc955c7893b345194546382 days 21 hrs ago0xe4925c73851490401b858b657f26e62e9ad20f66 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060 Ether0.00153355
0xe0ac1ec2112cb7fb2e71bf220578786a64586684bbcb8112e95b10229f7f67005183992384 days 16 hrs ago0xb3d6e71f153ba5e9892164b024b3cfe338cb3394 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50629.3 Ether0.002737857
0x1cc8cb6ff53d8268013f11337b9b8d8e6a173a813f88e6d06e0253f055ccdec15178956385 days 13 hrs ago0x1daa18bb32682c9ae9b74081aa40447e80d9b9e3 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50611.79751752 Ether0.00081
0xe696bfed396b05be627ed172e5f542ae88cd0fee2b88092a3c15738509500c505178700385 days 14 hrs ago0x0d958153f0f8178f2fc8c39e5480c9fadc662e3a IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50611.79770652 Ether0.00081
0xa3272c5b9a59c060d46d804a3a8eb543822da319c2b91cb719c9bbbd93dc3eee5146087391 days 3 hrs ago0xb3d6e71f153ba5e9892164b024b3cfe338cb3394 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb50684 Ether0.005861852
0x6463fc86668130d5914b854ea526ed2cdd9b0af7094565e7ed0bc18c022c7ebe5123172395 days 1 hr ago0xe4925c73851490401b858b657f26e62e9ad20f66 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060 Ether0.001742728
0x26ae72f2db15133fb7e7f504a86552fa398a3181c7218d804bde854acce4e0be5031889410 days 9 hrs ago0xa0b3a5cec99e3f7359da46898e112b2882dceded IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.11 Ether0.005861852
0x2bb3205348dd9d7e37181c0bb678849eb5550d526cf8f938cdbb502ff58e1b015026253411 days 7 hrs ago0x91e7cdf79134360a7a5bf950c984b19c5b51e157 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.001669425
0x2b43152ef40af78348234055634e73df5d527ca8e6fc7c653609292dd40bfdd75026233411 days 8 hrs ago0x91e7cdf79134360a7a5bf950c984b19c5b51e157 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.0035743
0xad68fb12a7a0a7244220ab6758ed261787523489696af50807d56a3c603afa325026217411 days 8 hrs ago0x91e7cdf79134360a7a5bf950c984b19c5b51e157 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.000021
0x175c47d199dc0c7d035beffc4b49df50869d38c23564043b73416139aaa1b4b85026184411 days 8 hrs ago0x91e7cdf79134360a7a5bf950c984b19c5b51e157 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.000861
0xa1bdf4bf90c4c2ecd3d73ddd044886a89933852728d151a1e8a14ba1e629817a5026173411 days 8 hrs ago0x91e7cdf79134360a7a5bf950c984b19c5b51e157 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.000021
0xa877985caaea37404bd91e876f41906844d24076fd0b3521365deba4175af7ed5024272411 days 16 hrs ago0x0341ce97f4b9ac738d7879c954805723b9eb8096 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.25 Ether0.003002412
0xa80d1aefb2031b02e40e8bb085ebdda3ddac54f8ac5a86bfb07c3213e8af82825018058412 days 16 hrs ago0xe4925c73851490401b858b657f26e62e9ad20f66 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060 Ether0.00201084
0xd44b72c1ce6d85346285c05dce05ebcd0d7fa7a2dfa934af39cd195ee69788ae5017968412 days 17 hrs ago0xddf1e3de9834ed7c682daa45872a62037a04ac74 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.1 Ether0.005861852
0x0d73b0f04d1c83c95af2e2d84ac7aaa7d28b26e77f8f0e3e7a884a00ec04ff6a5011923413 days 18 hrs ago0xb11a0af743af0505c8d99b1eee5b4c71a0cc29a5 IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5064 Ether0.005861852
0xe9a4836d93431b5157c9810ee04ba31331a80804fc1997b1fe9657b2ac05695e4970927420 days 16 hrs ago0x61607ba462d70cf338b6a670ae3c1a9e69a461ed IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.1 Ether0.00405944
0x6bb29a2b98afe96aa78b1b0c8788c6aa8154b8488d1be4a6abbf1e865e7df7a54970893420 days 16 hrs ago0x61607ba462d70cf338b6a670ae3c1a9e69a461ed IN  0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060.1 Ether0.00111228
0x30f2d3f4bd9f206030161f5824cfe9c8403241667a33f0f935cb0a23743551f04937441426 days 8 hrs ago0xe4925c73851490401b858b657f26e62e9ad20f66 IN  Contract Creation0 Ether0.05991915
[ Download CSV Export 

Latest 2 internal transactions Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x76c9905846006d3b2cae7a3b28fa8b30b22e6cd5abb6287b7d39e413ceb9705f5294288365 days 23 hrs ago0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060xe4925c73851490401b858b657f26e62e9ad20f6690 Ether
0xf107b931345f3edba05aceca23c9771ec73da15f38d3b0dfed9cc955c7893b345194546382 days 21 hrs ago0xfd26d4fedea09da1bb2c4e410c747dda72fdb5060xe4925c73851490401b858b657f26e62e9ad20f66118.36 Ether
[ Download CSV Export 

Contract Source Code Verified (Exact Match)

Contract Name:
VZTPresale

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

pragma solidity ^0.4.18;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 * https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}





/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    assert(token.transfer(to, value));
  }

  function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
    assert(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    assert(token.approve(spender, value));
  }
}



/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 * https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract Ownable {
  address public owner;                                                     // Operational owner.
  address public masterOwner = 0xe4925C73851490401b858B657F26E62e9aD20F66;  // for ownership transfer segregation of duty, hard coded to wallet account

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public {
    require(newOwner != address(0));
    require(masterOwner == msg.sender); // only master owner can initiate change to ownership
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}




/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 * https://github.com/OpenZeppelin/zeppelin-solidity/
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

  function cei(uint256 a, uint256 b) internal pure returns (uint256) {
    return ((a + b - 1) / b) * b;
  }
}












/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}





/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 * https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}


/** This interfaces will be implemented by different VZT contracts in future*/
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract VZToken is StandardToken, Ownable {


    /* metadata */

    string public constant name = "VectorZilla Token"; // solium-disable-line uppercase
    string public constant symbol = "VZT"; // solium-disable-line uppercase
    string public constant version = "1.0"; // solium-disable-line uppercase
    uint8 public constant decimals = 18; // solium-disable-line uppercase

    /* all accounts in wei */

    uint256 public constant INITIAL_SUPPLY = 100000000 * 10 ** 18; //intial total supply
    uint256 public constant BURNABLE_UP_TO =  90000000 * 10 ** 18; //burnable up to 90% (90 million) of total supply
    uint256 public constant VECTORZILLA_RESERVE_VZT = 25000000 * 10 ** 18; //25 million - reserved tokens

    // Reserved tokens will be sent to this address. this address will be replaced on production:
    address public constant VECTORZILLA_RESERVE = 0xF63e65c57024886cCa65985ca6E2FB38df95dA11;

    // - tokenSaleContract receives the whole balance for distribution
    address public tokenSaleContract;

    /* Following stuff is to manage regulatory hurdles on who can and cannot use VZT token  */
    mapping (address => bool) public frozenAccount;
    event FrozenFunds(address target, bool frozen);


    /** Modifiers to be used all over the place **/

    modifier onlyOwnerAndContract() {
        require(msg.sender == owner || msg.sender == tokenSaleContract);
        _;
    }


    modifier onlyWhenValidAddress( address _addr ) {
        require(_addr != address(0x0));
        _;
    }

    modifier onlyWhenValidContractAddress(address _addr) {
        require(_addr != address(0x0));
        require(_addr != address(this));
        require(isContract(_addr));
        _;
    }

    modifier onlyWhenBurnable(uint256 _value) {
        require(totalSupply - _value >= INITIAL_SUPPLY - BURNABLE_UP_TO);
        _;
    }

    modifier onlyWhenNotFrozen(address _addr) {
        require(!frozenAccount[_addr]);
        _;
    }

    /** End of Modifier Definations */

    /** Events */

    event Burn(address indexed burner, uint256 value);
    event Finalized();
    //log event whenever withdrawal from this contract address happens
    event Withdraw(address indexed from, address indexed to, uint256 value);

    /*
        Contructor that distributes initial supply between
        owner and vzt reserve.
    */
    function VZToken(address _owner) public {
        require(_owner != address(0));
        totalSupply = INITIAL_SUPPLY;
        balances[_owner] = INITIAL_SUPPLY - VECTORZILLA_RESERVE_VZT; //75 millions tokens
        balances[VECTORZILLA_RESERVE] = VECTORZILLA_RESERVE_VZT; //25 millions
        owner = _owner;
    }

    /*
        This unnamed function is called whenever the owner send Ether to fund the gas
        fees and gas reimbursement.
    */
    function () payable public onlyOwner {}

    /**
     * @dev transfer `_value` token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) 
        public
        onlyWhenValidAddress(_to)
        onlyWhenNotFrozen(msg.sender)
        onlyWhenNotFrozen(_to)
        returns(bool) {
        return super.transfer(_to, _value);
    }

    /**
     * @dev Transfer `_value` tokens from one address (`_from`) to another (`_to`)
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address _from, address _to, uint256 _value) 
        public
        onlyWhenValidAddress(_to)
        onlyWhenValidAddress(_from)
        onlyWhenNotFrozen(_from)
        onlyWhenNotFrozen(_to)
        returns(bool) {
        return super.transferFrom(_from, _to, _value);
    }

    /**
     * @dev Burns a specific (`_value`) amount of tokens.
     * @param _value uint256 The amount of token to be burned.
     */
    function burn(uint256 _value)
        public
        onlyWhenBurnable(_value)
        onlyWhenNotFrozen(msg.sender)
        returns (bool) {
        require(_value <= balances[msg.sender]);
      // no need to require value <= totalSupply, since that would imply the
      // sender's balance is greater than the totalSupply, which *should* be an assertion failure
        address burner = msg.sender;
        balances[burner] = balances[burner].sub(_value);
        totalSupply = totalSupply.sub(_value);
        Burn(burner, _value);
        Transfer(burner, address(0x0), _value);
        return true;
      }

    /**
     * Destroy tokens from other account
     *
     * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
     *
     * @param _from the address of the sender
     * @param _value the amount of money to burn
     */
    function burnFrom(address _from, uint256 _value) 
        public
        onlyWhenBurnable(_value)
        onlyWhenNotFrozen(_from)
        onlyWhenNotFrozen(msg.sender)
        returns (bool success) {
        assert(transferFrom( _from, msg.sender, _value ));
        return burn(_value);
    }

    /**
     * Set allowance for other address and notify
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     * @param _extraData some extra information to send to the approved contract
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData)
        public
        onlyWhenValidAddress(_spender)
        returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    /**
     * Freezes account and disables transfers/burning
     *  This is to manage regulatory hurdlers where contract owner is required to freeze some accounts.
     */
    function freezeAccount(address target, bool freeze) external onlyOwner {
        frozenAccount[target] = freeze;
        FrozenFunds(target, freeze);
    }

    /* Owner withdrawal of an ether deposited from Token ether balance */
    function withdrawToOwner(uint256 weiAmt) public onlyOwner {
        // do not allow zero transfer
        require(weiAmt > 0);
        owner.transfer(weiAmt);
        // signal the event for communication only it is meaningful
        Withdraw(this, msg.sender, weiAmt);
    }


    /// @notice This method can be used by the controller to extract mistakenly
    ///  sent tokens to this contract.
    /// @param _token The address of the token contract that you want to recover
    ///  set to 0 in case you want to extract ether.
    function claimTokens(address _token) external onlyOwner {
        if (_token == 0x0) {
            owner.transfer(this.balance);
            return;
        }
        StandardToken token = StandardToken(_token);
        uint balance = token.balanceOf(this);
        token.transfer(owner, balance);
        // signal the event for communication only it is meaningful
        Withdraw(this, owner, balance);
    }

    function setTokenSaleContract(address _tokenSaleContract)
        external
        onlyWhenValidContractAddress(_tokenSaleContract)
        onlyOwner {
           require(_tokenSaleContract != tokenSaleContract);
           tokenSaleContract = _tokenSaleContract;
    }

    /// @dev Internal function to determine if an address is a contract
    /// @param _addr address The address being queried
    /// @return True if `_addr` is a contract
    function isContract(address _addr) constant internal returns(bool) {
        if (_addr == 0) {
            return false;
        }
        uint256 size;
        assembly {
            size: = extcodesize(_addr)
        }
        return (size > 0);
    }

    /**
     * @dev Function to send `_value` tokens to user (`_to`) from sale contract/owner
     * @param _to address The address that will receive the minted tokens.
     * @param _value uint256 The amount of tokens to be sent.
     * @return True if the operation was successful.
     */
    function sendToken(address _to, uint256 _value)
        public
        onlyWhenValidAddress(_to)
        onlyOwnerAndContract
        returns(bool) {
        address _from = owner;
        // Check if the sender has enough
        require(balances[_from] >= _value);
        // Check for overflows
        require(balances[_to] + _value > balances[_to]);
        // Save this for an assertion in the future
        uint256 previousBalances = balances[_from] + balances[_to];
        // Subtract from the sender
        balances[_from] -= _value;
        // Add the same to the recipient
        balances[_to] += _value;
        Transfer(_from, _to, _value);
        // Asserts are used to use static analysis to find bugs in your code. They should never fail
        assert(balances[_from] + balances[_to] == previousBalances);
        return true;
    }
    /**
     * @dev Batch transfer of tokens to addresses from owner's balance
     * @param addresses address[] The address that will receive the minted tokens.
     * @param _values uint256[] The amount of tokens to be sent.
     * @return True if the operation was successful.
     */
    function batchSendTokens(address[] addresses, uint256[] _values) 
        public onlyOwnerAndContract
        returns (bool) {
        require(addresses.length == _values.length);
        require(addresses.length <= 20); //only batches of 20 allowed
        uint i = 0;
        uint len = addresses.length;
        for (;i < len; i++) {
            sendToken(addresses[i], _values[i]);
        }
        return true;
    }
}







/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
  }
}









/**
 * @title Contracts that should be able to recover tokens
 * @author SylTi
 * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
 * This will prevent any accidental loss of tokens.
 * https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract CanReclaimToken is Ownable {
  using SafeERC20 for ERC20Basic;

    //log event whenever withdrawal from this contract address happens
    event Withdraw(address indexed from, address indexed to, uint256 value);
  /**
   * @dev Reclaim all ERC20Basic compatible tokens
   * @param token ERC20Basic The address of the token contract
   */
  function reclaimToken(address token) external onlyOwner {
    if (token == 0x0) {
      owner.transfer(this.balance);
      return;
    }
    ERC20Basic ecr20BasicToken = ERC20Basic(token);
    uint256 balance = ecr20BasicToken.balanceOf(this);
    ecr20BasicToken.safeTransfer(owner, balance);
    Withdraw(msg.sender, owner, balance);
  }

}

/**
 * @title Contracts that should not own Tokens
 * @author Remco Bloemen <[email protected]π.com>
 * @dev This blocks incoming ERC23 tokens to prevent accidental loss of tokens.
 * Should tokens (any ERC20Basic compatible) end up in the contract, it allows the
 * owner to reclaim the tokens.
* https://github.com/OpenZeppelin/zeppelin-solidity/
 */
contract HasNoTokens is CanReclaimToken {

 /**
  * @dev Reject all ERC23 compatible tokens
  * @param from_ address The address that is transferring the tokens
  * @param value_ uint256 the amount of the specified token
  * @param data_ Bytes The data passed from the caller.
  */
  function tokenFallback(address from_, uint256 value_, bytes data_) pure external {
    from_;
    value_;
    data_;
    revert();
  }

}


contract VZTPresale is Ownable, Pausable, HasNoTokens {


    using SafeMath for uint256;

    string public constant name = "VectorZilla Public Presale";  // solium-disable-line uppercase
    string public constant version = "1.0"; // solium-disable-line uppercase

    VZToken token;

    // this multi-sig address will be replaced on production:
    address public constant VZT_WALLET = 0xa50EB7D45aA025525254aB2452679cE888B16b86;
    /* if the minimum funding goal in wei is not reached, buyers may withdraw their funds */
    uint256 public constant MIN_FUNDING_GOAL = 200 * 10 ** 18;
    uint256 public constant PRESALE_TOKEN_SOFT_CAP = 1875000 * 10 ** 18;    // presale soft cap of 1,875,000 VZT
    uint256 public constant PRESALE_RATE = 1250;                            // presale price is 1 ETH to 1,250 VZT
    uint256 public constant SOFTCAP_RATE = 1150;                            // presale price becomes 1 ETH to 1,150 VZT after softcap is reached
    uint256 public constant PRESALE_TOKEN_HARD_CAP = 5900000 * 10 ** 18;    // presale token hardcap
    uint256 public constant MAX_GAS_PRICE = 50000000000;

    uint256 public minimumPurchaseLimit = 0.1 * 10 ** 18;                      // minimum purchase is 0.1 ETH to make the gas worthwhile
    uint256 public startDate = 1516001400;                            // January 15, 2018 7:30 AM UTC
    uint256 public endDate = 1517815800;                              // Febuary 5, 2018 7:30 AM UTC
    uint256 public totalCollected = 0;                                // total amount of Ether raised in wei
    uint256 public tokensSold = 0;                                    // total number of VZT tokens sold
    uint256 public totalDistributed = 0;                              // total number of VZT tokens distributed once finalised
    uint256 public numWhitelisted = 0;                                // total number whitelisted

    struct PurchaseLog {
        uint256 ethValue;
        uint256 vztValue;
        bool kycApproved;
        bool tokensDistributed;
        bool paidFiat;
        uint256 lastPurchaseTime;
        uint256 lastDistributionTime;
    }

    //purchase log that captures
    mapping (address => PurchaseLog) public purchaseLog;
    //capture refunds
    mapping (address => bool) public refundLog;
    //capture buyers in array, this is for quickly looking up from DAPP
    address[] public buyers;
    uint256 public buyerCount = 0;                                              // total number of buyers purchased VZT

    bool public isFinalized = false;                                        // it becomes true when token sale is completed
    bool public publicSoftCapReached = false;                               // it becomes true when public softcap is reached

    // list of addresses that can purchase
    mapping(address => bool) public whitelist;

    // event logging for token purchase
    event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
    // event logging for token sale finalized
    event Finalized();
    // event logging for softcap reached
    event SoftCapReached();
    // event logging for funds transfered to VectorZilla multi-sig wallet
    event FundsTransferred();
    // event logging for each individual refunded amount
    event Refunded(address indexed beneficiary, uint256 weiAmount);
    // event logging for each individual distributed token + bonus
    event TokenDistributed(address indexed purchaser, uint256 tokenAmt);


    /*
        Constructor to initialize everything.
    */
    function VZTPresale(address _token, address _owner) public {
        require(_token != address(0));
        require(_owner != address(0));
        token = VZToken(_token);
        // default owner
        owner = _owner;
    }

    /*
       default function to buy tokens.
    */

    function() payable public whenNotPaused {
        doPayment(msg.sender);
    }

    /*
       allows owner to register token purchases done via fiat-eth (or equivalent currency)
    */
    function payableInFiatEth(address buyer, uint256 value) external onlyOwner {
        purchaseLog[buyer].paidFiat = true;
        // do public presale
        purchasePresale(buyer, value);
    }

    function setTokenContract(address _token) external onlyOwner {
        require(token != address(0));
        token = VZToken(_token);

    }

    /**
    * add address to whitelist
    * @param _addr wallet address to be added to whitelist
    */
    function addToWhitelist(address _addr) public onlyOwner returns (bool) {
        require(_addr != address(0));
        if (!whitelist[_addr]) {
            whitelist[_addr] = true;
            numWhitelisted++;
        }
        purchaseLog[_addr].kycApproved = true;
        return true;
    }

     /**
      * add address to whitelist
      * @param _addresses wallet addresses to be whitelisted
      */
    function addManyToWhitelist(address[] _addresses) 
        external 
        onlyOwner 
        returns (bool) 
        {
        require(_addresses.length <= 50);
        uint idx = 0;
        uint len = _addresses.length;
        for (; idx < len; idx++) {
            address _addr = _addresses[idx];
            addToWhitelist(_addr);
        }
        return true;
    }
    /**
     * remove address from whitelist
     * @param _addr wallet address to be removed from whitelist
     */
     function removeFomWhitelist(address _addr) public onlyOwner returns (bool) {
         require(_addr != address(0));
         require(whitelist[_addr]);
        delete whitelist[_addr];
        purchaseLog[_addr].kycApproved = false;
        numWhitelisted--;
        return true;
     }

    /*
        Send Tokens tokens to a buyer:
        - and KYC is approved
    */
    function sendTokens(address _user) public onlyOwner returns (bool) {
        require(_user != address(0));
        require(_user != address(this));
        require(purchaseLog[_user].kycApproved);
        require(purchaseLog[_user].vztValue > 0);
        require(!purchaseLog[_user].tokensDistributed);
        require(!refundLog[_user]);
        purchaseLog[_user].tokensDistributed = true;
        purchaseLog[_user].lastDistributionTime = now;
        totalDistributed++;
        token.sendToken(_user, purchaseLog[_user].vztValue);
        TokenDistributed(_user, purchaseLog[_user].vztValue);
        return true;
    }

    /*
        Refund ethers to buyer if KYC couldn't/wasn't verified.
    */
    function refundEthIfKYCNotVerified(address _user) public onlyOwner returns (bool) {
        if (!purchaseLog[_user].kycApproved) {
            return doRefund(_user);
        }
        return false;
    }

    /*

    /*
        return true if buyer is whitelisted
    */
    function isWhitelisted(address buyer) public view returns (bool) {
        return whitelist[buyer];
    }

    /*
        Check to see if this is public presale.
    */
    function isPresale() public view returns (bool) {
        return !isFinalized && now >= startDate && now <= endDate;
    }

    /*
        check if allocated has sold out.
    */
    function hasSoldOut() public view returns (bool) {
        return PRESALE_TOKEN_HARD_CAP - tokensSold < getMinimumPurchaseVZTLimit();
    }

    /*
        Check to see if the presale end date has passed or if all tokens allocated
        for sale has been purchased.
    */
    function hasEnded() public view returns (bool) {
        return now > endDate || hasSoldOut();
    }

    /*
        Determine if the minimum goal in wei has been reached.
    */
    function isMinimumGoalReached() public view returns (bool) {
        return totalCollected >= MIN_FUNDING_GOAL;
    }

    /*
        For the convenience of presale interface to present status info.
    */
    function getSoftCapReached() public view returns (bool) {
        return publicSoftCapReached;
    }

    function setMinimumPurchaseEtherLimit(uint256 newMinimumPurchaseLimit) external onlyOwner {
        require(newMinimumPurchaseLimit > 0);
        minimumPurchaseLimit = newMinimumPurchaseLimit;
    }
    /*
        For the convenience of presale interface to find current tier price.
    */

    function getMinimumPurchaseVZTLimit() public view returns (uint256) {
        if (getTier() == 1) {
            return minimumPurchaseLimit.mul(PRESALE_RATE); //1250VZT/ether
        } else if (getTier() == 2) {
            return minimumPurchaseLimit.mul(SOFTCAP_RATE); //1150VZT/ether
        }
        return minimumPurchaseLimit.mul(1000); //base price
    }

    /*
        For the convenience of presale interface to find current discount tier.
    */
    function getTier() public view returns (uint256) {
        // Assume presale top tier discount
        uint256 tier = 1;
        if (now >= startDate && now < endDate && getSoftCapReached()) {
            // tier 2 discount
            tier = 2;
        }
        return tier;
    }

    /*
        For the convenience of presale interface to present status info.
    */
    function getPresaleStatus() public view returns (uint256[3]) {
        // 0 - presale not started
        // 1 - presale started
        // 2 - presale ended
        if (now < startDate)
            return ([0, startDate, endDate]);
        else if (now <= endDate && !hasEnded())
            return ([1, startDate, endDate]);
        else
            return ([2, startDate, endDate]);
    }

    /*
        Called after presale ends, to do some extra finalization work.
    */
    function finalize() public onlyOwner {
        // do nothing if finalized
        require(!isFinalized);
        // presale must have ended
        require(hasEnded());

        if (isMinimumGoalReached()) {
            // transfer to VectorZilla multisig wallet
            VZT_WALLET.transfer(this.balance);
            // signal the event for communication
            FundsTransferred();
        }
        // mark as finalized
        isFinalized = true;
        // signal the event for communication
        Finalized();
    }


    /**
     * @notice `proxyPayment()` allows the caller to send ether to the VZTPresale
     * and have the tokens created in an address of their choosing
     * @param buyer The address that will hold the newly created tokens
     */
    function proxyPayment(address buyer) 
    payable 
    public
    whenNotPaused 
    returns(bool success) 
    {
        return doPayment(buyer);
    }

    /*
        Just in case we need to tweak pre-sale dates
    */
    function setDates(uint256 newStartDate, uint256 newEndDate) public onlyOwner {
        require(newEndDate >= newStartDate);
        startDate = newStartDate;
        endDate = newEndDate;
    }


    // @dev `doPayment()` is an internal function that sends the ether that this
    //  contract receives to the `vault` and creates tokens in the address of the
    //  `buyer` assuming the VZTPresale is still accepting funds
    //  @param buyer The address that will hold the newly created tokens
    // @return True if payment is processed successfully
    function doPayment(address buyer) internal returns(bool success) {
        require(tx.gasprice <= MAX_GAS_PRICE);
        // Antispam
        // do not allow contracts to game the system
        require(buyer != address(0));
        require(!isContract(buyer));
        // limit the amount of contributions to once per 100 blocks
        //require(getBlockNumber().sub(lastCallBlock[msg.sender]) >= maxCallFrequency);
        //lastCallBlock[msg.sender] = getBlockNumber();

        if (msg.sender != owner) {
            // stop if presale is over
            require(isPresale());
            // stop if no more token is allocated for sale
            require(!hasSoldOut());
            require(msg.value >= minimumPurchaseLimit);
        }
        require(msg.value > 0);
        purchasePresale(buyer, msg.value);
        return true;
    }

    /// @dev Internal function to determine if an address is a contract
    /// @param _addr The address being queried
    /// @return True if `_addr` is a contract
    function isContract(address _addr) constant internal returns (bool) {
        if (_addr == 0) {
            return false;
        }
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    /// @dev Internal function to process sale
    /// @param buyer The buyer address
    /// @param value  The value of ether paid
    function purchasePresale(address buyer, uint256 value) internal {
         require(value >= minimumPurchaseLimit);
         require(buyer != address(0));
        uint256 tokens = 0;
        // still under soft cap
        if (!publicSoftCapReached) {
            // 1 ETH for 1,250 VZT
            tokens = value * PRESALE_RATE;
            // get less if over softcap
            if (tokensSold + tokens > PRESALE_TOKEN_SOFT_CAP) {
                uint256 availablePresaleTokens = PRESALE_TOKEN_SOFT_CAP - tokensSold;
                uint256 softCapTokens = (value - (availablePresaleTokens / PRESALE_RATE)) * SOFTCAP_RATE;
                tokens = availablePresaleTokens + softCapTokens;
                // process presale at 1 ETH to 1,150 VZT
                processSale(buyer, value, tokens, SOFTCAP_RATE);
                // public soft cap has been reached
                publicSoftCapReached = true;
                // signal the event for communication
                SoftCapReached();
            } else {
                // process presale @PRESALE_RATE
                processSale(buyer, value, tokens, PRESALE_RATE);
            }
        } else {
            // 1 ETH to 1,150 VZT
            tokens = value * SOFTCAP_RATE;
            // process presale at 1 ETH to 1,150 VZT
            processSale(buyer, value, tokens, SOFTCAP_RATE);
        }
    }

    /*
        process sale at determined price.
    */
    function processSale(address buyer, uint256 value, uint256 vzt, uint256 vztRate) internal {
        require(buyer != address(0));
        require(vzt > 0);
        require(vztRate > 0);
        require(value > 0);

        uint256 vztOver = 0;
        uint256 excessEthInWei = 0;
        uint256 paidValue = value;
        uint256 purchasedVzt = vzt;

        if (tokensSold + purchasedVzt > PRESALE_TOKEN_HARD_CAP) {// if maximum is exceeded
            // find overage
            vztOver = tokensSold + purchasedVzt - PRESALE_TOKEN_HARD_CAP;
            // overage ETH to refund
            excessEthInWei = vztOver / vztRate;
            // adjust tokens purchased
            purchasedVzt = purchasedVzt - vztOver;
            // adjust Ether paid
            paidValue = paidValue - excessEthInWei;
        }

        /* To quick lookup list of buyers (pending token, kyc, or even refunded)
            we are keeping an array of buyers. There might be duplicate entries when
            a buyer gets refund (incomplete kyc, or requested), and then again contributes.
        */
        if (purchaseLog[buyer].vztValue == 0) {
            buyers.push(buyer);
            buyerCount++;
        }

        //if not whitelisted, mark kyc pending
        if (!isWhitelisted(buyer)) {
            purchaseLog[buyer].kycApproved = false;
        }
        //reset refund status in refundLog
        refundLog[buyer] = false;

         // record purchase in purchaseLog
        purchaseLog[buyer].vztValue = SafeMath.add(purchaseLog[buyer].vztValue, purchasedVzt);
        purchaseLog[buyer].ethValue = SafeMath.add(purchaseLog[buyer].ethValue, paidValue);
        purchaseLog[buyer].lastPurchaseTime = now;


        // total Wei raised
        totalCollected += paidValue;
        // total VZT sold
        tokensSold += purchasedVzt;

        /*
            For event, log buyer and beneficiary properly
        */
        address beneficiary = buyer;
        if (beneficiary == msg.sender) {
            beneficiary = msg.sender;
        }
        // signal the event for communication
        TokenPurchase(buyer, beneficiary, paidValue, purchasedVzt);
        // transfer must be done at the end after all states are updated to prevent reentrancy attack.
        if (excessEthInWei > 0 && !purchaseLog[buyer].paidFiat) {
            // refund overage ETH
            buyer.transfer(excessEthInWei);
            // signal the event for communication
            Refunded(buyer, excessEthInWei);
        }
    }

    /*
        Distribute tokens to a buyer:
        - when minimum goal is reached
        - and KYC is approved
    */
    function distributeTokensFor(address buyer) external onlyOwner returns (bool) {
        require(isFinalized);
        require(hasEnded());
        if (isMinimumGoalReached()) {
            return sendTokens(buyer);
        }
        return false;
    }

    /*
        purchaser requesting a refund, only allowed when minimum goal not reached.
    */
    function claimRefund() external returns (bool) {
        return doRefund(msg.sender);
    }

    /*
      send refund to purchaser requesting a refund 
   */
    function sendRefund(address buyer) external onlyOwner returns (bool) {
        return doRefund(buyer);
    }

    /*
        Internal function to manage refunds 
    */
    function doRefund(address buyer) internal returns (bool) {
        require(tx.gasprice <= MAX_GAS_PRICE);
        require(buyer != address(0));
        require(!purchaseLog[buyer].paidFiat);
        if (msg.sender != owner) {
            // cannot refund unless authorized
            require(isFinalized && !isMinimumGoalReached());
        }
        require(purchaseLog[buyer].ethValue > 0);
        require(purchaseLog[buyer].vztValue > 0);
        require(!refundLog[buyer]);
        require(!purchaseLog[buyer].tokensDistributed);

        // ETH to refund
        uint256 depositedValue = purchaseLog[buyer].ethValue;
        //VZT to revert
        uint256 vztValue = purchaseLog[buyer].vztValue;
        // assume all refunded, should we even do this if
        // we are going to delete buyer from log?
        purchaseLog[buyer].ethValue = 0;
        purchaseLog[buyer].vztValue = 0;
        refundLog[buyer] = true;
        //delete from purchase log.
        //but we won't remove buyer from buyers array
        delete purchaseLog[buyer];
        //decrement global counters
        tokensSold = tokensSold.sub(vztValue);
        totalCollected = totalCollected.sub(depositedValue);

        // send must be called only after purchaseLog[buyer] is deleted to
        //prevent reentrancy attack.
        buyer.transfer(depositedValue);
        Refunded(buyer, depositedValue);
        return true;
    }

    function getBuyersList() external view returns (address[]) {
        return buyers;
    }

    /**
        * @dev Transfer all Ether held by the contract to the owner.
        * Emergency where we might need to recover
    */
    function reclaimEther() external onlyOwner {
        assert(owner.send(this.balance));
    }

}

Contract ABI

[{"constant":true,"inputs":[],"name":"hasSoldOut","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSoftCapReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VZT_WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"reclaimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"publicSoftCapReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FUNDING_GOAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBuyersList","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numWhitelisted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMinimumPurchaseVZTLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newMinimumPurchaseLimit","type":"uint256"}],"name":"setMinimumPurchaseEtherLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"refundLog","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"refundEthIfKYCNotVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isMinimumGoalReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"sendTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"}],"name":"addManyToWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"purchaseLog","outputs":[{"name":"ethValue","type":"uint256"},{"name":"vztValue","type":"uint256"},{"name":"kycApproved","type":"bool"},{"name":"tokensDistributed","type":"bool"},{"name":"paidFiat","type":"bool"},{"name":"lastPurchaseTime","type":"uint256"},{"name":"lastDistributionTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPresale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyerCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_TOKEN_SOFT_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"distributeTokensFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimRefund","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setTokenContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"from_","type":"address"},{"name":"value_","type":"uint256"},{"name":"data_","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"endDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_TOKEN_HARD_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"sendRefund","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPresaleStatus","outputs":[{"name":"","type":"uint256[3]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newStartDate","type":"uint256"},{"name":"newEndDate","type":"uint256"}],"name":"setDates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_GAS_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"addToWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"masterOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"},{"name":"value","type":"uint256"}],"name":"payableInFiatEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalDistributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimumPurchaseLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SOFTCAP_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"buyers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"proxyPayment","outputs":[{"name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"removeFomWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[],"name":"SoftCapReached","type":"event"},{"anonymous":false,"inputs":[],"name":"FundsTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"tokenAmt","type":"uint256"}],"name":"TokenDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code

60606040526001805460a060020a60ff0219600160a060020a031990911673e4925c73851490401b858b657f26e62e9ad20f661716905567016345785d8a0000600355635a5c5878600455635a7807f860055560006006819055600781905560088190556009819055600d55600e805461ffff19169055341561008157600080fd5b6040516040806120fe833981016040528080519190602001805160008054600160a060020a03191633600160a060020a03908116919091179091559092508316151590506100ce57600080fd5b600160a060020a03811615156100e357600080fd5b60028054600160a060020a03938416600160a060020a03199182161790915560008054929093169116179055611fe08061011e6000396000f3006060604052600436106102845763ffffffff60e060020a60003504166303824f7681146102a757806306e4d36f146102ce57806306fdde03146102e15780630b97bc861461036b5780631342c0e81461039057806317ffc320146103bf5780632d5858a3146103e0578063340695c0146103f357806336d95f56146104065780633af32abf146104195780633f4ba83a146104385780634bb278f31461044b5780634f8b9e641461045e578063518ab2a8146104c457806354dacb96146104d757806354fd4d50146104ea5780635ad701c2146104fd5780635b63831a146105105780635b71207b146105235780635c830197146105395780635c975abb146105585780636a653d941461056b5780637c2e08a31461058a578063837197b21461059d5780638456cb59146105bc5780638c10671c146105cf5780638d4e4083146105ed5780638d86702d146106005780638da5cb5b1461066557806395364a84146106785780639b19251a1461068b5780639e0cea05146106aa5780639ed78df0146106bd5780639f727c27146106d0578063b28fb5db146106e3578063b5545a3c14610702578063bbcd5bbe14610715578063c0ee0b8a14610734578063c24a0f8b14610763578063c805b6bc14610776578063cae4d67614610789578063d7517caa146107a8578063dedf141e146107f3578063e29eb8361461080c578063e3bbb4f11461081f578063e43252d714610832578063e7201d7d14610851578063ecb70fb714610864578063ee9eadf614610877578063efca2eed14610899578063efca9f09146108ac578063f2102390146108bf578063f2aa8218146108d2578063f2fde38b146108e8578063f48c305414610907578063f8028d091461091b575b60015460a060020a900460ff161561029b57600080fd5b6102a43361093a565b50005b34156102b257600080fd5b6102ba6109e0565b604051901515815260200160405180910390f35b34156102d957600080fd5b6102ba610a01565b34156102ec57600080fd5b6102f4610a0f565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610330578082015183820152602001610318565b50505050905090810190601f16801561035d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037657600080fd5b61037e610a46565b60405190815260200160405180910390f35b341561039b57600080fd5b6103a3610a4c565b604051600160a060020a03909116815260200160405180910390f35b34156103ca57600080fd5b6103de600160a060020a0360043516610a64565b005b34156103eb57600080fd5b6102ba610bb1565b34156103fe57600080fd5b61037e610bbf565b341561041157600080fd5b61037e610bc5565b341561042457600080fd5b6102ba600160a060020a0360043516610bd2565b341561044357600080fd5b6103de610bf0565b341561045657600080fd5b6103de610c6f565b341561046957600080fd5b610471610d69565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104b0578082015183820152602001610498565b505050509050019250505060405180910390f35b34156104cf57600080fd5b61037e610dd1565b34156104e257600080fd5b61037e610dd7565b34156104f557600080fd5b6102f4610ddd565b341561050857600080fd5b61037e610e14565b341561051b57600080fd5b61037e610e4d565b341561052e57600080fd5b6103de600435610eba565b341561054457600080fd5b6102ba600160a060020a0360043516610ee7565b341561056357600080fd5b6102ba610efc565b341561057657600080fd5b6102ba600160a060020a0360043516610f0c565b341561059557600080fd5b6102ba610f65565b34156105a857600080fd5b6102ba600160a060020a0360043516610f78565b34156105c757600080fd5b6103de611176565b34156105da57600080fd5b6102ba60048035602481019101356111fa565b34156105f857600080fd5b6102ba611279565b341561060b57600080fd5b61061f600160a060020a0360043516611282565b604051968752602087019590955292151560408087019190915291151560608601521515608085015260a084019190915260c083019190915260e0909101905180910390f35b341561067057600080fd5b6103a36112c6565b341561068357600080fd5b6102ba6112d5565b341561069657600080fd5b6102ba600160a060020a03600435166112fe565b34156106b557600080fd5b61037e611313565b34156106c857600080fd5b61037e611319565b34156106db57600080fd5b6103de611328565b34156106ee57600080fd5b6102ba600160a060020a036004351661137b565b341561070d57600080fd5b6102ba6113d1565b341561072057600080fd5b6103de600160a060020a03600435166113dc565b341561073f57600080fd5b6103de60048035600160a060020a031690602480359160443591820191013561143d565b341561076e57600080fd5b61037e611442565b341561078157600080fd5b61037e611448565b341561079457600080fd5b6102ba600160a060020a0360043516611457565b34156107b357600080fd5b6107bb611482565b6040518082606080838360005b838110156107e05780820151838201526020016107c8565b5050505090500191505060405180910390f35b34156107fe57600080fd5b6103de600435602435611528565b341561081757600080fd5b61037e61155b565b341561082a57600080fd5b61037e611561565b341561083d57600080fd5b6102ba600160a060020a036004351661156a565b341561085c57600080fd5b6103a3611619565b341561086f57600080fd5b6102ba611628565b341561088257600080fd5b6103de600160a060020a036004351660243561163d565b34156108a457600080fd5b61037e611690565b34156108b757600080fd5b61037e611696565b34156108ca57600080fd5b61037e61169c565b34156108dd57600080fd5b6103a36004356116a2565b34156108f357600080fd5b6103de600160a060020a03600435166116ca565b6102ba600160a060020a0360043516611765565b341561092657600080fd5b6102ba600160a060020a0360043516611788565b6000640ba43b74003a111561094e57600080fd5b600160a060020a038216151561096357600080fd5b61096c82611827565b1561097657600080fd5b60005433600160a060020a039081169116146109c0576109946112d5565b151561099f57600080fd5b6109a76109e0565b156109b157600080fd5b6003543410156109c057600080fd5b600034116109cd57600080fd5b6109d78234611854565b5060015b919050565b60006109ea610e4d565b6007546a04e15fa410ec46cf800000031090505b90565b600e54610100900460ff1690565b60408051908101604052601a81527f566563746f725a696c6c61205075626c69632050726573616c65000000000000602082015281565b60045481565b73a50eb7d45aa025525254ab2452679ce888b16b8681565b60008054819033600160a060020a03908116911614610a8257600080fd5b600160a060020a0383161515610ad057600054600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515610acb57600080fd5b610bac565b82915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b2a57600080fd5b6102c65a03f11515610b3b57600080fd5b5050506040518051600054909250610b679150600160a060020a0384811691168363ffffffff61195316565b600054600160a060020a039081169033167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8360405190815260200160405180910390a35b505050565b600e54610100900460ff1681565b6104e281565b680ad78ebc5ac620000081565b600160a060020a03166000908152600f602052604090205460ff1690565b60005433600160a060020a03908116911614610c0b57600080fd5b60015460a060020a900460ff161515610c2357600080fd5b6001805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60005433600160a060020a03908116911614610c8a57600080fd5b600e5460ff1615610c9a57600080fd5b610ca2611628565b1515610cad57600080fd5b610cb5610f65565b15610d2e5773a50eb7d45aa025525254ab2452679ce888b16b8630600160a060020a03163180156108fc0290604051600060405180830381858888f193505050501515610d0157600080fd5b7f3866ece3d7c90f5416667cfb1e242958f5f25e4ee68390ddfcbe9f6807b82bbf60405160405180910390a15b600e805460ff191660011790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a1565b610d71611f42565b600c805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610da9575b5050505050905090565b60075481565b60095481565b60408051908101604052600381527f312e300000000000000000000000000000000000000000000000000000000000602082015281565b6004546000906001904210801590610e2d575060055442105b8015610e3c5750610e3c610a01565b15610e45575060025b8091505b5090565b6000610e57610e14565b60011415610e7b57600354610e74906104e263ffffffff6119d316565b90506109fe565b610e83610e14565b60021415610ea057600354610e749061047e63ffffffff6119d316565b600354610eb5906103e863ffffffff6119d316565b905090565b60005433600160a060020a03908116911614610ed557600080fd5b60008111610ee257600080fd5b600355565b600b6020526000908152604090205460ff1681565b60015460a060020a900460ff1681565b6000805433600160a060020a03908116911614610f2857600080fd5b600160a060020a0382166000908152600a602052604090206002015460ff161515610f5d57610f5682611a09565b90506109db565b506000919050565b600654680ad78ebc5ac620000090101590565b6000805433600160a060020a03908116911614610f9457600080fd5b600160a060020a0382161515610fa957600080fd5b30600160a060020a031682600160a060020a031614151515610fca57600080fd5b600160a060020a0382166000908152600a602052604090206002015460ff161515610ff457600080fd5b600160a060020a0382166000908152600a60205260408120600101541161101a57600080fd5b600160a060020a0382166000908152600a6020526040902060020154610100900460ff161561104857600080fd5b600160a060020a0382166000908152600b602052604090205460ff161561106e57600080fd5b600160a060020a038083166000908152600a60205260408082206002808201805461ff001916610100179055426004830155600880546001908101909155905491015493169263412664ae928692516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561110457600080fd5b6102c65a03f1151561111557600080fd5b50505060405180515050600160a060020a0382166000818152600a602052604090819020600101547ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64915190815260200160405180910390a2506001919050565b60005433600160a060020a0390811691161461119157600080fd5b60015460a060020a900460ff16156111a857600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000805481908190819033600160a060020a0390811691161461121c57600080fd5b603285111561122a57600080fd5b600092508491505b8183101561126d5785858481811061124657fe5b90506020020135600160a060020a031690506112618161156a565b50600190920191611232565b50600195945050505050565b600e5460ff1681565b600a60205260009081526040902080546001820154600283015460038401546004909401549293919260ff8083169361010084048216936201000090049091169187565b600054600160a060020a031681565b600e5460009060ff161580156112ed57506004544210155b8015610eb557505060055442111590565b600f6020526000908152604090205460ff1681565b600d5481565b6a018d0bf423c03d8de0000081565b60005433600160a060020a0390811691161461134357600080fd5b600054600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561137957fe5b565b6000805433600160a060020a0390811691161461139757600080fd5b600e5460ff1615156113a857600080fd5b6113b0611628565b15156113bb57600080fd5b6113c3610f65565b15610f5d57610f5682610f78565b6000610eb533611a09565b60005433600160a060020a039081169116146113f757600080fd5b600254600160a060020a0316151561140e57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080fd5b60055481565b6a04e15fa410ec46cf80000081565b6000805433600160a060020a0390811691161461147357600080fd5b61147c82611a09565b92915050565b61148a611f54565b6004544210156114bc5760606040519081016040528060008152602001600454815260200160055481525090506109fe565b60055442111580156114d357506114d1611628565b155b156115005760606040519081016040528060018152602001600454815260200160055481525090506109fe565b60606040519081016040528060028152602001600454815260200160055481525090506109fe565b60005433600160a060020a0390811691161461154357600080fd5b8181101561155057600080fd5b600491909155600555565b60065481565b640ba43b740081565b6000805433600160a060020a0390811691161461158657600080fd5b600160a060020a038216151561159b57600080fd5b600160a060020a0382166000908152600f602052604090205460ff1615156115ed57600160a060020a0382166000908152600f60205260409020805460ff191660019081179091556009805490910190555b50600160a060020a03166000908152600a60205260409020600201805460ff1916600190811790915590565b600154600160a060020a031681565b6000600554421180610eb55750610eb56109e0565b60005433600160a060020a0390811691161461165857600080fd5b600160a060020a0382166000908152600a60205260409020600201805462ff000019166201000017905561168c8282611854565b5050565b60085481565b60035481565b61047e81565b600c8054829081106116b057fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a03811615156116df57600080fd5b60015433600160a060020a039081169116146116fa57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015460009060a060020a900460ff161561177f57600080fd5b61147c8261093a565b6000805433600160a060020a039081169116146117a457600080fd5b600160a060020a03821615156117b957600080fd5b600160a060020a0382166000908152600f602052604090205460ff1615156117e057600080fd5b50600160a060020a03166000908152600f60209081526040808320805460ff19908116909155600a9092529091206002018054909116905560098054600019019055600190565b600080600160a060020a0383161515611843576000915061184e565b823b90506000811191505b50919050565b6000806000600354841015151561186a57600080fd5b600160a060020a038516151561187f57600080fd5b600e5460009350610100900460ff161515611937576104e2840292506a018d0bf423c03d8de0000083600754011115611924576007546a018d0bf423c03d8de0000003915061047e6104e28304850302905080820192506118e485858561047e611c44565b600e805461ff0019166101001790557f629c1b672a634075c61f1cbfbec5f3e47b94c3f90f065486f615ecfa18713d3460405160405180910390a1611932565b6119328585856104e2611c44565b61194c565b61047e8402925061194c85858561047e611c44565b5050505050565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119b057600080fd5b6102c65a03f115156119c157600080fd5b505050604051805190501515610bac57fe5b6000808315156119e65760009150611a02565b508282028284828115156119f657fe5b04146119fe57fe5b8091505b5092915050565b60008080640ba43b74003a1115611a1f57600080fd5b600160a060020a0384161515611a3457600080fd5b600160a060020a0384166000908152600a602052604090206002015462010000900460ff1615611a6357600080fd5b60005433600160a060020a03908116911614611a9b57600e5460ff168015611a905750611a8e610f65565b155b1515611a9b57600080fd5b600160a060020a0384166000908152600a602052604081205411611abe57600080fd5b600160a060020a0384166000908152600a602052604081206001015411611ae457600080fd5b600160a060020a0384166000908152600b602052604090205460ff1615611b0a57600080fd5b600160a060020a0384166000908152600a6020526040902060020154610100900460ff1615611b3857600080fd5b5050600160a060020a0382166000908152600a60208181526040808420805460018083018054888555888255600b8752948820805460ff1916909217909155949093528481559284905560028301805462ffffff1916905560038301849055600490920192909255600754611bb3908263ffffffff611f2116565b600755600654611bc9908363ffffffff611f2116565b600655600160a060020a03841682156108fc0283604051600060405180830381858888f193505050501515611bfd57600080fd5b83600160a060020a03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518360405190815260200160405180910390a25060019392505050565b600080808080600160a060020a0389161515611c5f57600080fd5b60008711611c6c57600080fd5b60008611611c7957600080fd5b60008811611c8657600080fd5b60009450600093508792508691506a04e15fa410ec46cf80000082600754011115611cd8576a04e15fa410ec46cf80000082600754010394508585811515611cca57fe5b049350848203915083830392505b600160a060020a0389166000908152600a60205260409020600101541515611d4857600c805460018101611d0c8382611f7b565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038b16179055600d805460010190555b611d5189610bd2565b1515611d7b57600160a060020a0389166000908152600a60205260409020600201805460ff191690555b600160a060020a0389166000908152600b60209081526040808320805460ff19169055600a909152902060010154611db39083611f33565b600160a060020a038a166000908152600a60205260409020600181019190915554611dde9084611f33565b600160a060020a03808b166000818152600a6020526040902092835542600390930192909255600680548601905560078054850190558a925033161415611e225750335b80600160a060020a031689600160a060020a03167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18858560405191825260208201526040908101905180910390a3600084118015611ea25750600160a060020a0389166000908152600a602052604090206002015462010000900460ff16155b15611f1657600160a060020a03891684156108fc0285604051600060405180830381858888f193505050501515611ed857600080fd5b88600160a060020a03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518560405190815260200160405180910390a25b505050505050505050565b600082821115611f2d57fe5b50900390565b6000828201838110156119fe57fe5b60206040519081016040526000815290565b60606040519081016040526003815b6000815260200190600190039081611f635790505090565b815481835581811511610bac57600083815260209020610bac9181019083016109fe91905b80821115610e495760008155600101611fa05600a165627a7a72305820442e230de4482723468ac42cedaee225283bd6675c10744b174e7a320057dcb20029000000000000000000000000fa814a9837c46c6c2065be983b546f56b19d2232000000000000000000000000e4925c73851490401b858b657f26e62e9ad20f66

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

000000000000000000000000fa814a9837c46c6c2065be983b546f56b19d2232000000000000000000000000e4925c73851490401b858b657f26e62e9ad20f66

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000fa814a9837c46c6c2065be983b546f56b19d2232
Arg [1] : 000000000000000000000000e4925c73851490401b858b657f26e62e9ad20f66

Swarm Source

bzzr://442e230de4482723468ac42cedaee225283bd6675c10744b174e7a320057dcb2
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.