Latest 6 txns

TxHash Age From To Value [TxFee]
0xffcafbc5e2cd79093c4fa640611b6b0b580a60913bec61ea05204b1316074458237 days 14 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN   0x9c5834c43b2ed54a12b798d8fcf25801025407171 Ether0.00018426
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b237 days 15 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN   0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether0.000861825
0x79bcf3a597111f7119dbab8b0785a616ef22c664bd794fb236beec4146e2cd78237 days 15 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN   0x9c5834c43b2ed54a12b798d8fcf25801025407173.1 Ether0.000317785
0x8373d4821a2c5a480dd33b8d5bfe2be7b17d1f80e3d6dcff6a97eae9c1dd349c237 days 15 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN   0x9c5834c43b2ed54a12b798d8fcf25801025407171 Ether0.000384225
0x4c16871ab5f33ba3fac8cf8f2dc7daaa7e4bd1d4558065ebdecc6e384dca6163237 days 15 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN   0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether0.000031171
0xa0bdbbada28cf85e4b37d48a02695ddcce7ccf547cd2a7263dcb8ed33dcd7a08237 days 15 hrs ago0x8fd94be56237ea9d854b23b78615775121dd1e82  IN    Contract Creation0 Ether0.001334941
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0xffcafbc5e2cd79093c4fa640611b6b0b580a60913bec61ea05204b13160744583052221237 days 14 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170x8fd94be56237ea9d854b23b78615775121dd1e821 Ether
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b3052187237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b3052187237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b3052187237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b3052187237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x641bab63bc51edf47d16762ffd130af89d21ac5c29e684b6fa04fc9575dd609b3052187237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x79bcf3a597111f7119dbab8b0785a616ef22c664bd794fb236beec4146e2cd783052170237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x79bcf3a597111f7119dbab8b0785a616ef22c664bd794fb236beec4146e2cd783052170237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170x8fd94be56237ea9d854b23b78615775121dd1e823.1 Ether
0x8373d4821a2c5a480dd33b8d5bfe2be7b17d1f80e3d6dcff6a97eae9c1dd349c3052158237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170xcb97df60e1bc485bf882bf3d8370589bbb64c91b0 Ether
0x8373d4821a2c5a480dd33b8d5bfe2be7b17d1f80e3d6dcff6a97eae9c1dd349c3052158237 days 15 hrs ago0x9c5834c43b2ed54a12b798d8fcf25801025407170x8fd94be56237ea9d854b23b78615775121dd1e821 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
0x8d160c61b3d3bfc4186a5e3e4ee43a9df663554e8859c65e9cdd12777691b3b93052015237 days 15 hrs ago0x0204fe350d95e600b55a7eb3fed1374ecea9527c0x9c5834c43b2ed54a12b798d8fcf25801025407170 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: ITO
Compiler Text: v0.4.18+commit.9cf6e910
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.18;

// File: contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  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 onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: contracts/InvestedProvider.sol

contract InvestedProvider is Ownable {

  uint public invested;

}

// File: contracts/AddressesFilterFeature.sol

contract AddressesFilterFeature is Ownable {

  mapping(address => bool) public allowedAddresses;

  function addAllowedAddress(address allowedAddress) public onlyOwner {
    allowedAddresses[allowedAddress] = true;
  }

  function removeAllowedAddress(address allowedAddress) public onlyOwner {
    allowedAddresses[allowedAddress] = false;
  }

}

// File: contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
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;
  }
}

// File: contracts/token/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
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);
}

// File: contracts/token/BasicToken.sol

/**
 * @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];
  }

}

// File: contracts/token/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
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);
}

// File: contracts/token/StandardToken.sol

/**
 * @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;
  }

}

// File: contracts/MintableToken.sol

contract MintableToken is AddressesFilterFeature, StandardToken {

  event Mint(address indexed to, uint256 amount);

  event MintFinished();

  bool public mintingFinished = false;

  address public saleAgent;

  mapping (address => uint) public initialBalances;

  uint public vestingPercent;

  uint public constant percentRate = 100;

  modifier notLocked(address _from, uint _value) {
    if(!(_from == owner || _from == saleAgent || allowedAddresses[_from])) {
      require(mintingFinished);
      if((vestingPercent <= percentRate) && (vestingPercent != 0)) {
        uint minLockedBalance = initialBalances[_from].mul(vestingPercent).div(percentRate);
        require(minLockedBalance <= balances[_from].sub(_value));
      }
    }
    _;
  }

  function setVestingPercent(uint newVestingPercent) public {
    require(msg.sender == saleAgent || msg.sender == owner);
    vestingPercent = newVestingPercent;
  }

  function setSaleAgent(address newSaleAgnet) public {
    require(msg.sender == saleAgent || msg.sender == owner);
    saleAgent = newSaleAgnet;
  }

  function mint(address _to, uint256 _amount) public returns (bool) {
    require((msg.sender == saleAgent || msg.sender == owner) && !mintingFinished);
    
    totalSupply = totalSupply.add(_amount);
    balances[_to] = balances[_to].add(_amount);

    initialBalances[_to] = balances[_to];

    Mint(_to, _amount);
    Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() public returns (bool) {
    require((msg.sender == saleAgent || msg.sender == owner) && !mintingFinished);
    mintingFinished = true;
    MintFinished();
    return true;
  }

  function transfer(address _to, uint256 _value) public notLocked(msg.sender, _value)  returns (bool) {
    return super.transfer(_to, _value);
  }

  function transferFrom(address from, address to, uint256 value) public notLocked(from, value) returns (bool) {
    return super.transferFrom(from, to, value);
  }

}

// File: contracts/TokenProvider.sol

contract TokenProvider is Ownable {

  MintableToken public token;

  function setToken(address newToken) public onlyOwner {
    token = MintableToken(newToken);
  }

}

// File: contracts/MintTokensInterface.sol

contract MintTokensInterface is TokenProvider {

  function mintTokens(address to, uint tokens) internal;

}

// File: contracts/MintTokensFeature.sol

contract MintTokensFeature is MintTokensInterface {

  function mintTokens(address to, uint tokens) internal {
    token.mint(to, tokens);
  }

}

// File: contracts/PercentRateProvider.sol

contract PercentRateProvider {

  uint public percentRate = 100;

}

// File: contracts/PercentRateFeature.sol

contract PercentRateFeature is Ownable, PercentRateProvider {

  function setPercentRate(uint newPercentRate) public onlyOwner {
    percentRate = newPercentRate;
  }

}

// File: contracts/RetrieveTokensFeature.sol

contract RetrieveTokensFeature is Ownable {

  function retrieveTokens(address to, address anotherToken) public onlyOwner {
    ERC20 alienToken = ERC20(anotherToken);
    alienToken.transfer(to, alienToken.balanceOf(this));
  }

}

// File: contracts/WalletProvider.sol

contract WalletProvider is Ownable {

  address public wallet;

  function setWallet(address newWallet) public onlyOwner {
    wallet = newWallet;
  }

}

// File: contracts/CommonSale.sol

contract CommonSale is PercentRateFeature, InvestedProvider, WalletProvider, RetrieveTokensFeature, MintTokensFeature {

  using SafeMath for uint;

  address public directMintAgent;

  uint public price;

  uint public start;

  uint public minInvestedLimit;

  uint public hardcap;

  modifier isUnderHardcap() {
    require(invested <= hardcap);
    _;
  }

  function setHardcap(uint newHardcap) public onlyOwner {
    hardcap = newHardcap;
  }

  modifier onlyDirectMintAgentOrOwner() {
    require(directMintAgent == msg.sender || owner == msg.sender);
    _;
  }

  modifier minInvestLimited(uint value) {
    require(value >= minInvestedLimit);
    _;
  }

  function setStart(uint newStart) public onlyOwner {
    start = newStart;
  }

  function setMinInvestedLimit(uint newMinInvestedLimit) public onlyOwner {
    minInvestedLimit = newMinInvestedLimit;
  }

  function setDirectMintAgent(address newDirectMintAgent) public onlyOwner {
    directMintAgent = newDirectMintAgent;
  }

  function setPrice(uint newPrice) public onlyOwner {
    price = newPrice;
  }

  function calculateTokens(uint _invested) internal returns(uint);

  function mintTokensExternal(address to, uint tokens) public onlyDirectMintAgentOrOwner {
    mintTokens(to, tokens);
  }

  function endSaleDate() public view returns(uint);

  function mintTokensByETHExternal(address to, uint _invested) public onlyDirectMintAgentOrOwner returns(uint) {
    updateInvested(_invested);
    return mintTokensByETH(to, _invested);
  }

  function mintTokensByETH(address to, uint _invested) internal isUnderHardcap returns(uint) {
    uint tokens = calculateTokens(_invested);
    mintTokens(to, tokens);
    return tokens;
  }

  function transferToWallet(uint value) internal {
    wallet.transfer(value);
  }

  function updateInvested(uint value) internal {
    invested = invested.add(value);
  }

  function fallback() internal minInvestLimited(msg.value) returns(uint) {
    require(now >= start && now < endSaleDate());
    transferToWallet(msg.value);
    updateInvested(msg.value);
    return mintTokensByETH(msg.sender, msg.value);
  }

  function () public payable {
    fallback();
  }

}

// File: contracts/ValueBonusFeature.sol

/*import './PercentRateProvider.sol';*/

contract ValueBonusFeature is /*PercentRateProvider,*/ Ownable {

  using SafeMath for uint;

  uint percentRate = 1000;

  struct ValueBonus {
    uint from;
    uint bonus;
  }

  ValueBonus[] public valueBonuses;

  function addValueBonus(uint from, uint bonus) public onlyOwner {
    valueBonuses.push(ValueBonus(from, bonus));
  }

  function getValueBonusTokens(uint tokens, uint invested) public view returns(uint) {
    uint valueBonus = getValueBonus(invested);
    if(valueBonus == 0) {
      return 0;
    }
    return tokens.mul(valueBonus).div(percentRate);
  }

  function getValueBonus(uint value) public view returns(uint) {
    uint bonus = 0;
    for(uint i = 0; i < valueBonuses.length; i++) {
      if(value >= valueBonuses[i].from) {
        bonus = valueBonuses[i].bonus;
      } else {
        return bonus;
      }
    }
    return bonus;
  }

}

// File: contracts/AssembledCommonSale.sol

contract AssembledCommonSale is ValueBonusFeature, CommonSale {

}

// File: contracts/WalletsPercents.sol

contract WalletsPercents is Ownable {

  address[] public wallets;

  mapping (address => uint) percents;

  function addWallet(address wallet, uint percent) public onlyOwner {
    wallets.push(wallet);
    percents[wallet] = percent;
  }
 
  function cleanWallets() public onlyOwner {
    wallets.length = 0;
  }


}

// File: contracts/ExtendedWalletsMintTokensFeature.sol

//import './PercentRateProvider.sol';

contract ExtendedWalletsMintTokensFeature is /*PercentRateProvider,*/ MintTokensInterface, WalletsPercents {

  using SafeMath for uint;

  uint public percentRate = 1000;

  function mintExtendedTokens() public onlyOwner {
    uint summaryTokensPercent = 0;
    for(uint i = 0; i < wallets.length; i++) {
      summaryTokensPercent = summaryTokensPercent.add(percents[wallets[i]]);
    }
    uint mintedTokens = token.totalSupply();
    uint allTokens = mintedTokens.mul(percentRate).div(percentRate.sub(summaryTokensPercent));
    for(uint k = 0; k < wallets.length; k++) {
      mintTokens(wallets[k], allTokens.mul(percents[wallets[k]]).div(percentRate));
    }

  }

}

// File: contracts/ITO.sol

contract ITO is ExtendedWalletsMintTokensFeature, AssembledCommonSale {

  uint public period;

  uint public firstBonusPercent;

  uint public firstBonusLimitPercent;

  function setFirstBonusPercent(uint newFirstBonusPercent) public onlyOwner {
    firstBonusPercent = newFirstBonusPercent;
  }

  function setFirstBonusLimitPercent(uint newFirstBonusLimitPercent) public onlyOwner {
    firstBonusLimitPercent = newFirstBonusLimitPercent;
  }

  function calculateTokens(uint _invested) internal returns(uint) {
    uint tokens = _invested.mul(price).div(1 ether);
    uint valueBonusTokens = getValueBonusTokens(tokens, _invested);
    if(invested < hardcap.mul(firstBonusLimitPercent).div(percentRate)) {
      tokens = tokens.add(tokens.mul(firstBonusPercent).div(percentRate));
    }
    return tokens.add(valueBonusTokens);
  }

  function setPeriod(uint newPeriod) public onlyOwner {
    period = newPeriod;
  }

  function endSaleDate() public view returns(uint) {
    return start.add(period * 1 days);
  }

  function finish() public onlyOwner {
     mintExtendedTokens();
     token.finishMinting();
  }

}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"wallet","type":"address"},{"name":"percent","type":"uint256"}],"name":"addWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newPeriod","type":"uint256"}],"name":"setPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newToken","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newPercentRate","type":"uint256"}],"name":"setPercentRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokens","type":"uint256"},{"name":"invested","type":"uint256"}],"name":"getValueBonusTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"anotherToken","type":"address"}],"name":"retrieveTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"directMintAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstBonusLimitPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newDirectMintAgent","type":"address"}],"name":"setDirectMintAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"wallets","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mintExtendedTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"percentRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFirstBonusLimitPercent","type":"uint256"}],"name":"setFirstBonusLimitPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newFirstBonusPercent","type":"uint256"}],"name":"setFirstBonusPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"mintTokensExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newMinInvestedLimit","type":"uint256"}],"name":"setMinInvestedLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"valueBonuses","outputs":[{"name":"from","type":"uint256"},{"name":"bonus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardcap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"addValueBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstBonusPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"_invested","type":"uint256"}],"name":"mintTokensByETHExternal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"invested","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"uint256"}],"name":"getValueBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minInvestedLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endSaleDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newWallet","type":"address"}],"name":"setWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newHardcap","type":"uint256"}],"name":"setHardcap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"period","outputs":[{"name":"","type":"uint256"}],"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":"newStart","type":"uint256"}],"name":"setStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cleanWallets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60606040526103e86001819055606460035560095560008054600160a060020a033316600160a060020a0319909116179055611195806100406000396000f3006060604052600436106101be5763ffffffff60e060020a6000350416630a2a9a0181146101c95780630f3a9f65146101ed578063144fa6d714610203578063480b890d14610222578063521eb2731461023857806354717ea9146102675780636341ca0b146102925780636abc3fe4146102b757806370e32ae7146102ca578063769ffb7d146102dd5780637ad71f72146102fc5780637e00d77a146103125780638090114f146103255780638da5cb5b146103385780638e66ca5f1461034b57806391b7f5ed1461036157806395af7006146103775780639bf6eb601461038d578063a035b1fe146103af578063a34d9270146103c2578063af78facf146103d8578063b071cbe614610406578063b8a4db8114610419578063be9a655514610432578063c588cabd14610445578063ca1e5bb714610458578063cafb22021461047a578063cd7e31841461048d578063d56b2889146104a3578063d64196f8146104b6578063d7d88043146104c9578063deaa59df146104dc578063e28fa27d146104fb578063ef78d4fd14610511578063f2fde38b14610524578063f6a03ebf14610543578063fc0c546a14610559578063fcf401701461056c575b6101c661057f565b50005b34156101d457600080fd5b6101eb600160a060020a03600435166024356105d9565b005b34156101f857600080fd5b6101eb60043561064f565b341561020e57600080fd5b6101eb600160a060020a036004351661066f565b341561022d57600080fd5b6101eb6004356106b9565b341561024357600080fd5b61024b6106d9565b604051600160a060020a03909116815260200160405180910390f35b341561027257600080fd5b6102806004356024356106e8565b60405190815260200160405180910390f35b341561029d57600080fd5b6101eb600160a060020a0360043581169060243516610733565b34156102c257600080fd5b61024b610836565b34156102d557600080fd5b610280610845565b34156102e857600080fd5b6101eb600160a060020a036004351661084b565b341561030757600080fd5b61024b600435610895565b341561031d57600080fd5b6101eb6108bd565b341561033057600080fd5b610280610a76565b341561034357600080fd5b61024b610a7c565b341561035657600080fd5b6101eb600435610a8b565b341561036c57600080fd5b6101eb600435610aab565b341561038257600080fd5b6101eb600435610acb565b341561039857600080fd5b6101eb600160a060020a0360043516602435610aeb565b34156103ba57600080fd5b610280610b2f565b34156103cd57600080fd5b6101eb600435610b35565b34156103e357600080fd5b6103ee600435610b55565b60405191825260208201526040908101905180910390f35b341561041157600080fd5b610280610b81565b341561042457600080fd5b6101eb600435602435610b87565b341561043d57600080fd5b610280610bf0565b341561045057600080fd5b610280610bf6565b341561046357600080fd5b610280600160a060020a0360043516602435610bfc565b341561048557600080fd5b610280610c4f565b341561049857600080fd5b610280600435610c55565b34156104ae57600080fd5b6101eb610ccb565b34156104c157600080fd5b610280610d53565b34156104d457600080fd5b610280610d59565b34156104e757600080fd5b6101eb600160a060020a0360043516610d7d565b341561050657600080fd5b6101eb600435610dc7565b341561051c57600080fd5b610280610de7565b341561052f57600080fd5b6101eb600160a060020a0360043516610ded565b341561054e57600080fd5b6101eb600435610e88565b341561056457600080fd5b61024b610ea8565b341561057757600080fd5b6101eb610eb7565b600034600d54811015151561059357600080fd5b600c5442101580156105ab57506105a8610d59565b42105b15156105b657600080fd5b6105bf34610ee2565b6105c834610f15565b6105d23334610f2e565b91505b5090565b60005433600160a060020a039081169116146105f457600080fd5b600780546001810161060683826110da565b5060009182526020808320919091018054600160a060020a0390951673ffffffffffffffffffffffffffffffffffffffff19909516851790559281526008909252604090912055565b60005433600160a060020a0390811691161461066a57600080fd5b600f55565b60005433600160a060020a0390811691161461068a57600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146106d457600080fd5b600355565b600554600160a060020a031681565b6000806106f483610c55565b9050801515610706576000915061072c565b6001546107299061071d868463ffffffff610f5916565b9063ffffffff610f8416565b91505b5092915050565b6000805433600160a060020a0390811691161461074f57600080fd5b5080600160a060020a03811663a9059cbb84826370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156107af57600080fd5b6102c65a03f115156107c057600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561081657600080fd5b6102c65a03f1151561082757600080fd5b50505060405180515050505050565b600a54600160a060020a031681565b60115481565b60005433600160a060020a0390811691161461086657600080fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60078054829081106108a357fe5b600091825260209091200154600160a060020a0316905081565b60008054819081908190819033600160a060020a039081169116146108e157600080fd5b60009450600093505b6007548410156109495761093c6008600060078781548110151561090a57fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054869063ffffffff610f9b16565b94506001909301926108ea565b600654600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561099157600080fd5b6102c65a03f115156109a257600080fd5b50505060405180516009549094506109d991506109c5908763ffffffff610faa16565b60095461071d90869063ffffffff610f5916565b9150600090505b600754811015610a6f57610a676007828154811015156109fc57fe5b600091825260208220015460095460078054600160a060020a0390931693610a629361071d926008929189908110610a3057fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054879063ffffffff610f5916565b610fbc565b6001016109e0565b5050505050565b60095481565b600054600160a060020a031681565b60005433600160a060020a03908116911614610aa657600080fd5b601155565b60005433600160a060020a03908116911614610ac657600080fd5b600b55565b60005433600160a060020a03908116911614610ae657600080fd5b601055565b600a5433600160a060020a0390811691161480610b16575060005433600160a060020a039081169116145b1515610b2157600080fd5b610b2b8282610fbc565b5050565b600b5481565b60005433600160a060020a03908116911614610b5057600080fd5b600d55565b6002805482908110610b6357fe5b60009182526020909120600290910201805460019091015490915082565b600e5481565b60005433600160a060020a03908116911614610ba257600080fd5b6002805460018101610bb48382611103565b91600052602060002090600202016000604080519081016040528581526020810185905291905081518155602082015181600101555050505050565b600c5481565b60105481565b600a5460009033600160a060020a0390811691161480610c2a575060005433600160a060020a039081169116145b1515610c3557600080fd5b610c3e82610f15565b610c488383610f2e565b9392505050565b60045481565b600080805b600254811015610cc0576002805482908110610c7257fe5b60009182526020909120600290910201548410610cb0576002805482908110610c9757fe5b9060005260206000209060020201600101549150610cb8565b819250610cc4565b600101610c5a565b8192505b5050919050565b60005433600160a060020a03908116911614610ce657600080fd5b610cee6108bd565b600654600160a060020a0316637d64bcb46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d3657600080fd5b6102c65a03f11515610d4757600080fd5b50505060405180515050565b600d5481565b6000610d77600f546201518002600c54610f9b90919063ffffffff16565b90505b90565b60005433600160a060020a03908116911614610d9857600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610de257600080fd5b600e55565b600f5481565b60005433600160a060020a03908116911614610e0857600080fd5b600160a060020a0381161515610e1d57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610ea357600080fd5b600c55565b600654600160a060020a031681565b60005433600160a060020a03908116911614610ed257600080fd5b6000610edf6007826110da565b50565b600554600160a060020a031681156108fc0282604051600060405180830381858888f193505050501515610edf57600080fd5b600454610f28908263ffffffff610f9b16565b60045550565b600080600e5460045411151515610f4457600080fd5b610f4d8361103a565b9050610c488482610fbc565b600080831515610f6c576000915061072c565b50828202828482811515610f7c57fe5b0414610c4857fe5b6000808284811515610f9257fe5b04949350505050565b600082820183811015610c4857fe5b600082821115610fb657fe5b50900390565b600654600160a060020a03166340c10f19838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561101b57600080fd5b6102c65a03f1151561102c57600080fd5b505050604051805150505050565b6000806000611060670de0b6b3a764000061071d600b5487610f5990919063ffffffff16565b915061106c82856106e8565b905061108b60095461071d601154600e54610f5990919063ffffffff16565b60045410156110c2576110bf6110b260095461071d60105486610f5990919063ffffffff16565b839063ffffffff610f9b16565b91505b6110d2828263ffffffff610f9b16565b949350505050565b8154818355818115116110fe576000838152602090206110fe91810190830161112f565b505050565b8154818355818115116110fe576002028160020283600052602060002091820191016110fe9190611149565b610d7a91905b808211156105d55760008155600101611135565b610d7a91905b808211156105d5576000808255600182015560020161114f5600a165627a7a723058200b7b3e3f5507aac094cdaec97eb262606cab689611270a0501f5e14721a0c4890029

   Swarm Source:
bzzr://0b7b3e3f5507aac094cdaec97eb262606cab689611270a0501f5e14721a0c489

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward