ETH Price: $2,612.28 (+0.81%)

Contract

0x8DD9034f7cCC805bDc4D593A01f6A2E2EB94A67a
 
Transaction Hash
Method
Block
From
To
Transfer64994262018-10-12 5:34:082141 days ago1539322448IN
Ubcoin: Token Sale
0.08 ETH0.0019830690
Transfer63917222018-09-24 16:16:142158 days ago1537805774IN
Ubcoin: Token Sale
0 ETH0.00044121
Transfer63916902018-09-24 16:08:112158 days ago1537805291IN
Ubcoin: Token Sale
0 ETH0.00044121
Transfer62948432018-09-08 15:09:352174 days ago1536419375IN
Ubcoin: Token Sale
0.49 ETH0.000112375.1
Transfer62267662018-08-28 4:14:572186 days ago1535429697IN
Ubcoin: Token Sale
0.00025 ETH0.000088134
Finish62229612018-08-27 12:50:022187 days ago1535374202IN
Ubcoin: Token Sale
0 ETH0.0245059699
Transfer62229142018-08-27 12:37:482187 days ago1535373468IN
Ubcoin: Token Sale
0.075 ETH0.0005508525
Transfer62228572018-08-27 12:24:132187 days ago1535372653IN
Ubcoin: Token Sale
0.1 ETH0.000044062
Transfer62227712018-08-27 12:04:132187 days ago1535371453IN
Ubcoin: Token Sale
0.1605 ETH0.0019830690
Transfer62227472018-08-27 11:58:142187 days ago1535371094IN
Ubcoin: Token Sale
3.3964 ETH0.000212222.2
Transfer62227352018-08-27 11:55:472187 days ago1535370947IN
Ubcoin: Token Sale
0.08134035 ETH0.0033401841
Transfer62227332018-08-27 11:55:122187 days ago1535370912IN
Ubcoin: Token Sale
0.11 ETH0.0086821290
0xe2d7466c62227302018-08-27 11:54:352187 days ago1535370875IN
Ubcoin: Token Sale
0.5 ETH0.0034472341
Transfer62227122018-08-27 11:50:122187 days ago1535370612IN
Ubcoin: Token Sale
1.5 ETH0.0073321290
Transfer62227112018-08-27 11:49:572187 days ago1535370597IN
Ubcoin: Token Sale
0.1 ETH0.0086821290
Transfer62227102018-08-27 11:49:492187 days ago1535370589IN
Ubcoin: Token Sale
0.08123854 ETH0.0033401841
Transfer62226962018-08-27 11:46:232187 days ago1535370383IN
Ubcoin: Token Sale
0.0015 ETH0.00024443
Transfer62225882018-08-27 11:19:412187 days ago1535368781IN
Ubcoin: Token Sale
0.9 ETH0.0073321290
Transfer62225802018-08-27 11:16:322187 days ago1535368592IN
Ubcoin: Token Sale
0.02 ETH0.000195522.4
Transfer62225782018-08-27 11:15:462187 days ago1535368546IN
Ubcoin: Token Sale
0.05 ETH0.0017922922
Mint Tokens By E...62225662018-08-27 11:12:512187 days ago1535368371IN
Ubcoin: Token Sale
0 ETH0.0062043165
Transfer62225652018-08-27 11:12:182187 days ago1535368338IN
Ubcoin: Token Sale
0.15 ETH0.0086821290
Transfer62225472018-08-27 11:09:102187 days ago1535368150IN
Ubcoin: Token Sale
0.15 ETH0.0019946420
Mint Tokens By E...62225472018-08-27 11:09:102187 days ago1535368150IN
Ubcoin: Token Sale
0 ETH0.0062043165
Transfer62225232018-08-27 11:04:562187 days ago1535367896IN
Ubcoin: Token Sale
0.377 ETH0.00063916.625
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
62227472018-08-27 11:58:142187 days ago1535371094
Ubcoin: Token Sale
3.3964 ETH
62227352018-08-27 11:55:472187 days ago1535370947
Ubcoin: Token Sale
0.08134035 ETH
62227332018-08-27 11:55:122187 days ago1535370912
Ubcoin: Token Sale
0.11 ETH
62227302018-08-27 11:54:352187 days ago1535370875
Ubcoin: Token Sale
0.5 ETH
62227122018-08-27 11:50:122187 days ago1535370612
Ubcoin: Token Sale
1.5 ETH
62227112018-08-27 11:49:572187 days ago1535370597
Ubcoin: Token Sale
0.1 ETH
62227102018-08-27 11:49:492187 days ago1535370589
Ubcoin: Token Sale
0.08123854 ETH
62226962018-08-27 11:46:232187 days ago1535370383
Ubcoin: Token Sale
0.0015 ETH
62225882018-08-27 11:19:412187 days ago1535368781
Ubcoin: Token Sale
0.9 ETH
62225802018-08-27 11:16:322187 days ago1535368592
Ubcoin: Token Sale
0.02 ETH
62225782018-08-27 11:15:462187 days ago1535368546
Ubcoin: Token Sale
0.05 ETH
62225652018-08-27 11:12:182187 days ago1535368338
Ubcoin: Token Sale
0.15 ETH
62225472018-08-27 11:09:102187 days ago1535368150
Ubcoin: Token Sale
0.15 ETH
62225232018-08-27 11:04:562187 days ago1535367896
Ubcoin: Token Sale
0.377 ETH
62225202018-08-27 11:04:172187 days ago1535367857
Ubcoin: Token Sale
0.2 ETH
62224862018-08-27 10:57:132187 days ago1535367433
Ubcoin: Token Sale
0.16672296 ETH
62224692018-08-27 10:51:232187 days ago1535367083
Ubcoin: Token Sale
1.1 ETH
62224672018-08-27 10:51:042187 days ago1535367064
Ubcoin: Token Sale
1.3 ETH
62224632018-08-27 10:50:192187 days ago1535367019
Ubcoin: Token Sale
0.00616904 ETH
62224582018-08-27 10:49:032187 days ago1535366943
Ubcoin: Token Sale
0.991529 ETH
62224432018-08-27 10:45:462187 days ago1535366746
Ubcoin: Token Sale
0.05 ETH
62224382018-08-27 10:44:462187 days ago1535366686
Ubcoin: Token Sale
0.995729 ETH
62224362018-08-27 10:44:042187 days ago1535366644
Ubcoin: Token Sale
21 ETH
62224332018-08-27 10:43:242187 days ago1535366604
Ubcoin: Token Sale
5.99 ETH
62224192018-08-27 10:40:122187 days ago1535366412
Ubcoin: Token Sale
1.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ICO

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-24
*/

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/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 StandardToken, Ownable {

  event Mint(address indexed to, uint256 amount);

  event MintFinished();

  bool public mintingFinished = false;

  address public saleAgent;

  modifier notLocked() {
    require(msg.sender == owner || msg.sender == saleAgent || mintingFinished);
    _;
  }

  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);
    Mint(_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 returns (bool) {
    return super.transfer(_to, _value);
  }

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

}

// File: contracts/FreezeTokensWallet.sol

contract FreezeTokensWallet is Ownable {

  using SafeMath for uint256;

  MintableToken public token;

  bool public started;

  uint public startLockPeriod = 180 days;

  uint public period = 360 days;

  uint public duration = 90 days;

  uint public startUnlock;

  uint public retrievedTokens;

  uint public startBalance;

  modifier notStarted() {
    require(!started);
    _;
  }

  function setPeriod(uint newPeriod) public onlyOwner notStarted {
    period = newPeriod * 1 days;
  }

  function setDuration(uint newDuration) public onlyOwner notStarted {
    duration = newDuration * 1 days;
  }

  function setStartLockPeriod(uint newStartLockPeriod) public onlyOwner notStarted {
    startLockPeriod = newStartLockPeriod * 1 days;
  }

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

  function start() public onlyOwner notStarted {
    startUnlock = now + startLockPeriod;
    retrievedTokens = 0;
    startBalance = token.balanceOf(this);
    started = true;
  }

  function retrieveTokens(address to) public onlyOwner {
    require(started && now >= startUnlock);
    if (now >= startUnlock + period) {
      token.transfer(to, token.balanceOf(this));
    } else {
      uint parts = period.div(duration);
      uint tokensByPart = startBalance.div(parts);
      uint timeSinceStart = now.sub(startUnlock);
      uint pastParts = timeSinceStart.div(duration);
      uint tokensToRetrieveSinceStart = pastParts.mul(tokensByPart);
      uint tokensToRetrieve = tokensToRetrieveSinceStart.sub(retrievedTokens);
      if(tokensToRetrieve > 0) {
        retrievedTokens = retrievedTokens.add(tokensToRetrieve);
        token.transfer(to, tokensToRetrieve);
      }
    }
  }
}

// File: contracts/InvestedProvider.sol

contract InvestedProvider is Ownable {

  uint public invested;

}

// File: contracts/PercentRateProvider.sol

contract PercentRateProvider is Ownable {

  uint public percentRate = 100;

  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 InvestedProvider, WalletProvider, PercentRateProvider, RetrieveTokensFeature {

  using SafeMath for uint;

  address public directMintAgent;

  uint public price;

  uint public start;

  uint public minInvestedLimit;

  MintableToken public token;

  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 setToken(address newToken) public onlyOwner {
    token = MintableToken(newToken);
  }

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

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

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

  function endSaleDate() public view returns(uint);

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

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

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

  function () public payable {
    fallback();
  }

}

// File: contracts/StagedCrowdsale.sol

contract StagedCrowdsale is Ownable {

  using SafeMath for uint;

  struct Milestone {
    uint period;
    uint bonus;
  }

  uint public totalPeriod;

  Milestone[] public milestones;

  function milestonesCount() public view returns(uint) {
    return milestones.length;
  }

  function addMilestone(uint period, uint bonus) public onlyOwner {
    require(period > 0);
    milestones.push(Milestone(period, bonus));
    totalPeriod = totalPeriod.add(period);
  }

  function removeMilestone(uint8 number) public onlyOwner {
    require(number < milestones.length);
    Milestone storage milestone = milestones[number];
    totalPeriod = totalPeriod.sub(milestone.period);

    delete milestones[number];

    for (uint i = number; i < milestones.length - 1; i++) {
      milestones[i] = milestones[i+1];
    }

    milestones.length--;
  }

  function changeMilestone(uint8 number, uint period, uint bonus) public onlyOwner {
    require(number < milestones.length);
    Milestone storage milestone = milestones[number];

    totalPeriod = totalPeriod.sub(milestone.period);

    milestone.period = period;
    milestone.bonus = bonus;

    totalPeriod = totalPeriod.add(period);
  }

  function insertMilestone(uint8 numberAfter, uint period, uint bonus) public onlyOwner {
    require(numberAfter < milestones.length);

    totalPeriod = totalPeriod.add(period);

    milestones.length++;

    for (uint i = milestones.length - 2; i > numberAfter; i--) {
      milestones[i + 1] = milestones[i];
    }

    milestones[numberAfter + 1] = Milestone(period, bonus);
  }

  function clearMilestones() public onlyOwner {
    require(milestones.length > 0);
    for (uint i = 0; i < milestones.length; i++) {
      delete milestones[i];
    }
    milestones.length -= milestones.length;
    totalPeriod = 0;
  }

  function lastSaleDate(uint start) public view returns(uint) {
    return start + totalPeriod * 1 days;
  }

  function currentMilestone(uint start) public view returns(uint) {
    uint previousDate = start;
    for(uint i=0; i < milestones.length; i++) {
      if(now >= previousDate && now < previousDate + milestones[i].period * 1 days) {
        return i;
      }
      previousDate = previousDate.add(milestones[i].period * 1 days);
    }
    revert();
  }

}

// File: contracts/ValueBonusFeature.sol

contract ValueBonusFeature is PercentRateProvider {

  using SafeMath for uint;

  bool public activeValueBonus = true;

  struct ValueBonus {
    uint from;
    uint bonus;
  }

  ValueBonus[] public valueBonuses;

  modifier checkPrevBonus(uint number, uint from, uint bonus) {
    if(number > 0 && number < valueBonuses.length) {
      ValueBonus storage valueBonus = valueBonuses[number - 1];
      require(valueBonus.from < from && valueBonus.bonus < bonus);
    }
    _;
  }

  modifier checkNextBonus(uint number, uint from, uint bonus) {
    if(number + 1 < valueBonuses.length) {
      ValueBonus storage valueBonus = valueBonuses[number + 1];
      require(valueBonus.from > from && valueBonus.bonus > bonus);
    }
    _;
  }

  function setActiveValueBonus(bool newActiveValueBonus) public onlyOwner {
    activeValueBonus = newActiveValueBonus;
  }

  function addValueBonus(uint from, uint bonus) public onlyOwner checkPrevBonus(valueBonuses.length - 1, from, bonus) {
    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;
    if(activeValueBonus) {
      for(uint i = 0; i < valueBonuses.length; i++) {
        if(value >= valueBonuses[i].from) {
          bonus = valueBonuses[i].bonus;
        } else {
          return bonus;
        }
      }
    }
    return bonus;
  }

  function removeValueBonus(uint8 number) public onlyOwner {
    require(number < valueBonuses.length);

    delete valueBonuses[number];

    for (uint i = number; i < valueBonuses.length - 1; i++) {
      valueBonuses[i] = valueBonuses[i+1];
    }

    valueBonuses.length--;
  }

  function changeValueBonus(uint8 number, uint from, uint bonus) public onlyOwner checkPrevBonus(number, from, bonus) checkNextBonus(number, from, bonus) {
    require(number < valueBonuses.length);
    ValueBonus storage valueBonus = valueBonuses[number];
    valueBonus.from = from;
    valueBonus.bonus = bonus;
  }

  function insertValueBonus(uint8 numberAfter, uint from, uint bonus) public onlyOwner checkPrevBonus(numberAfter, from, bonus) checkNextBonus(numberAfter, from, bonus) {
    require(numberAfter < valueBonuses.length);

    valueBonuses.length++;

    for (uint i = valueBonuses.length - 2; i > numberAfter; i--) {
      valueBonuses[i + 1] = valueBonuses[i];
    }

    valueBonuses[numberAfter + 1] = ValueBonus(from, bonus);
  }

  function clearValueBonuses() public onlyOwner {
    require(valueBonuses.length > 0);
    for (uint i = 0; i < valueBonuses.length; i++) {
      delete valueBonuses[i];
    }
    valueBonuses.length = 0;
  }

}

// File: contracts/ICO.sol

contract ICO is ValueBonusFeature, StagedCrowdsale, CommonSale {

  FreezeTokensWallet public teamTokensWallet;

  address public bountyTokensWallet;

  address public reservedTokensWallet;

  uint public teamTokensPercent;

  uint public bountyTokensPercent;

  uint public reservedTokensPercent;

  function setTeamTokensPercent(uint newTeamTokensPercent) public onlyOwner {
    teamTokensPercent = newTeamTokensPercent;
  }

  function setBountyTokensPercent(uint newBountyTokensPercent) public onlyOwner {
    bountyTokensPercent = newBountyTokensPercent;
  }

  function setReservedTokensPercent(uint newReservedTokensPercent) public onlyOwner {
    reservedTokensPercent = newReservedTokensPercent;
  }

  function setTeamTokensWallet(address newTeamTokensWallet) public onlyOwner {
    teamTokensWallet = FreezeTokensWallet(newTeamTokensWallet);
  }

  function setBountyTokensWallet(address newBountyTokensWallet) public onlyOwner {
    bountyTokensWallet = newBountyTokensWallet;
  }

  function setReservedTokensWallet(address newReservedTokensWallet) public onlyOwner {
    reservedTokensWallet = newReservedTokensWallet;
  }

  function calculateTokens(uint _invested) internal returns(uint) {
    uint milestoneIndex = currentMilestone(start);
    Milestone storage milestone = milestones[milestoneIndex];
    uint tokens = _invested.mul(price).div(1 ether);
    uint valueBonusTokens = getValueBonusTokens(tokens, _invested);
    if(milestone.bonus > 0) {
      tokens = tokens.add(tokens.mul(milestone.bonus).div(percentRate));
    }
    return tokens.add(valueBonusTokens);
  }

  function finish() public onlyOwner {
    uint summaryTokensPercent = bountyTokensPercent.add(teamTokensPercent).add(reservedTokensPercent);
    uint mintedTokens = token.totalSupply();
    uint allTokens = mintedTokens.mul(percentRate).div(percentRate.sub(summaryTokensPercent));
    uint foundersTokens = allTokens.mul(teamTokensPercent).div(percentRate);
    uint bountyTokens = allTokens.mul(bountyTokensPercent).div(percentRate);
    uint reservedTokens = allTokens.mul(reservedTokensPercent).div(percentRate);
    mintTokens(teamTokensWallet, foundersTokens);
    mintTokens(bountyTokensWallet, bountyTokens);
    mintTokens(reservedTokensWallet, reservedTokens);
    token.finishMinting();
    teamTokensWallet.start();
    teamTokensWallet.transferOwnership(owner);
  }

  function endSaleDate() public view returns(uint) {
    return lastSaleDate(start);
  }

}

// File: contracts/NextSaleAgentFeature.sol

contract NextSaleAgentFeature is Ownable {

  address public nextSaleAgent;

  function setNextSaleAgent(address newNextSaleAgent) public onlyOwner {
    nextSaleAgent = newNextSaleAgent;
  }

}

// File: contracts/PreICO.sol

contract PreICO is NextSaleAgentFeature, CommonSale {

  uint public period;

  function calculateTokens(uint _invested) internal returns(uint) {
    return _invested.mul(price).div(1 ether);
  }

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

  function finish() public onlyOwner {
    token.setSaleAgent(nextSaleAgent);
  }

  function endSaleDate() public view returns(uint) {
    return start.add(period * 1 days);
  }
  
  function fallback() internal minInvestLimited(msg.value) returns(uint) {
    require(now >= start && now < endSaleDate());
    wallet.transfer(msg.value);
    return mintTokensByETH(msg.sender, msg.value);
  }
  
}

// File: contracts/ReceivingContractCallback.sol

contract ReceivingContractCallback {

  function tokenFallback(address _from, uint _value) public;

}

// File: contracts/UBCoinToken.sol

contract UBCoinToken is MintableToken {

  string public constant name = "UBCoin";

  string public constant symbol = "UBC";

  uint32 public constant decimals = 18;

  mapping(address => bool)  public registeredCallbacks;

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

  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    return processCallback(super.transferFrom(_from, _to, _value), _from, _to, _value);
  }

  function registerCallback(address callback) public onlyOwner {
    registeredCallbacks[callback] = true;
  }

  function deregisterCallback(address callback) public onlyOwner {
    registeredCallbacks[callback] = false;
  }

  function processCallback(bool result, address from, address to, uint value) internal returns(bool) {
    if (result && registeredCallbacks[to]) {
      ReceivingContractCallback targetCallback = ReceivingContractCallback(to);
      targetCallback.tokenFallback(from, value);
    }
    return result;
  }

}

// File: contracts/MigrationConfigurator.sol

/**
 * How to migrate:
 * 1. deploy
 * 2. call deploy
 * 3. token.setSaleAgent(new ito)
 */
contract MigrationConfigurator is Ownable {

  MintableToken public token = MintableToken(0x2D3E7D4870a51b918919E7B851FE19983E4c38d5);

  ICO public ico;

  FreezeTokensWallet public teamTokensWallet;

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

  function deploy() public onlyOwner {
    ico = new ICO();

    ico.addMilestone(20, 40);
    ico.addMilestone(20, 25);
    ico.addMilestone(20, 20);
    ico.addMilestone(20, 15);
    ico.addMilestone(20, 8);
    ico.addMilestone(4, 0);
    ico.addValueBonus(20000000000000000000,50);
    ico.addValueBonus(50000000000000000000,65);
    ico.addValueBonus(300000000000000000000,80);
    ico.setMinInvestedLimit(100000000000000000);
    ico.setToken(token);
    ico.setPrice(14286000000000000000000);
    ico.setWallet(0x5FB78D8B8f1161731BC80eF93CBcfccc5783356F);
    ico.setBountyTokensWallet(0xdAA156b6eA6b9737eA20c68Db4040B1182E487B6);
    ico.setReservedTokensWallet(0xE1D1898660469797B22D348Ff67d54643d848295);
    ico.setStart(1522627200); // 02 Apr 2018 00:00:00 GMT
    ico.setHardcap(96000000000000000000000);
    ico.setTeamTokensPercent(12);
    ico.setBountyTokensPercent(4);
    ico.setReservedTokensPercent(34);

    teamTokensWallet = new FreezeTokensWallet();
    teamTokensWallet.setStartLockPeriod(180);
    teamTokensWallet.setPeriod(360);
    teamTokensWallet.setDuration(90);
    teamTokensWallet.setToken(token);
    teamTokensWallet.transferOwnership(ico);

    ico.setTeamTokensWallet(teamTokensWallet);

    address manager = 0xF1f94bAD54C8827C3B53754ad7dAa0FF5DCD527d;

    ico.transferOwnership(manager);
  }

}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"newToken","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newTeamTokensPercent","type":"uint256"}],"name":"setTeamTokensPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"clearValueBonuses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservedTokensWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reservedTokensPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newPercentRate","type":"uint256"}],"name":"setPercentRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"clearMilestones","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":"period","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"addMilestone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newReservedTokensWallet","type":"address"}],"name":"setReservedTokensWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBountyTokensPercent","type":"uint256"}],"name":"setBountyTokensPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"start","type":"uint256"}],"name":"currentMilestone","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"directMintAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"teamTokensWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"numberAfter","type":"uint8"},{"name":"from","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"insertValueBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newDirectMintAgent","type":"address"}],"name":"setDirectMintAgent","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":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"teamTokensPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bountyTokensWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bountyTokensPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"mintTokensExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newTeamTokensWallet","type":"address"}],"name":"setTeamTokensWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"numberAfter","type":"uint8"},{"name":"period","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"insertMilestone","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":false,"inputs":[{"name":"number","type":"uint8"}],"name":"removeMilestone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"milestonesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":false,"inputs":[{"name":"number","type":"uint8"},{"name":"period","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"changeMilestone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newReservedTokensPercent","type":"uint256"}],"name":"setReservedTokensPercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newActiveValueBonus","type":"bool"}],"name":"setActiveValueBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"totalPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint8"}],"name":"removeValueBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint8"},{"name":"from","type":"uint256"},{"name":"bonus","type":"uint256"}],"name":"changeValueBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"milestones","outputs":[{"name":"period","type":"uint256"},{"name":"bonus","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":"activeValueBonus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newBountyTokensWallet","type":"address"}],"name":"setBountyTokensWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"start","type":"uint256"}],"name":"lastSaleDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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"}]

606060405260646003556004805460ff1916600117905560008054600160a060020a033316600160a060020a0319909116179055611d84806100426000396000f3006060604052600436106102845763ffffffff60e060020a600035041663144fa6d7811461028f57806320ad8a81146102b057806329033133146102c65780632c138236146102d9578063388fb0af14610308578063480b890d1461032d5780634c94ac6a14610343578063521eb2731461035657806354717ea9146103695780635601477b14610382578063575300171461039b57806359169d06146103ba5780636341ca0b146103d05780636793c8e1146103f55780636abc3fe41461040b5780636c9d99da1461041e578063702b7bc314610431578063769ffb7d146104505780638090114f1461046f5780638da5cb5b1461048257806391b7f5ed1461049557806393167204146104ab57806399cd211d146104be5780639a3fdfd0146104d15780639bf6eb60146104e45780639c05093b146105065780639dc905bb14610525578063a035b1fe14610544578063a34d927014610557578063aa525c551461056d578063ab36e4a614610586578063af78facf14610599578063b071cbe6146105c7578063b8a4db81146105da578063bd17647f146105f3578063be9a655514610612578063c66c67e914610625578063c865cadb1461063b578063ca1e5bb714610653578063cafb220214610675578063cd7e318414610688578063ce14a46e1461069e578063cf51ee7a146106b1578063d4b03d34146106ca578063d56b2889146106e9578063d64196f8146106fc578063d7d880431461070f578063deaa59df14610722578063e28fa27d14610741578063e89e4ed614610757578063f2fde38b1461076d578063f6a03ebf1461078c578063f95bbc9c146107a2578063fa8b72ff146107c9578063fc0c546a146107e8578063fd83da09146107fb575b61028c610811565b50005b341561029a57600080fd5b6102ae600160a060020a036004351661088d565b005b34156102bb57600080fd5b6102ae6004356108ca565b34156102d157600080fd5b6102ae6108ea565b34156102e457600080fd5b6102ec610964565b604051600160a060020a03909116815260200160405180910390f35b341561031357600080fd5b61031b610973565b60405190815260200160405180910390f35b341561033857600080fd5b6102ae600435610979565b341561034e57600080fd5b6102ae610999565b341561036157600080fd5b6102ec610a18565b341561037457600080fd5b61031b600435602435610a27565b341561038d57600080fd5b6102ae600435602435610a72565b34156103a657600080fd5b6102ae600160a060020a0360043516610afe565b34156103c557600080fd5b6102ae600435610b3b565b34156103db57600080fd5b6102ae600160a060020a0360043581169060243516610b5b565b341561040057600080fd5b61031b600435610c44565b341561041657600080fd5b6102ec610ce0565b341561042957600080fd5b6102ec610cef565b341561043c57600080fd5b6102ae60ff60043516602435604435610cfe565b341561045b57600080fd5b6102ae600160a060020a0360043516610ebf565b341561047a57600080fd5b61031b610efc565b341561048d57600080fd5b6102ec610f02565b34156104a057600080fd5b6102ae600435610f11565b34156104b657600080fd5b61031b610f31565b34156104c957600080fd5b6102ec610f37565b34156104dc57600080fd5b61031b610f46565b34156104ef57600080fd5b6102ae600160a060020a0360043516602435610f4c565b341561051157600080fd5b6102ae600160a060020a0360043516610f8c565b341561053057600080fd5b6102ae60ff60043516602435604435610fc9565b341561054f57600080fd5b61031b6110d7565b341561056257600080fd5b6102ae6004356110dd565b341561057857600080fd5b6102ae60ff600435166110fd565b341561059157600080fd5b61031b611210565b34156105a457600080fd5b6105af600435611217565b60405191825260208201526040908101905180910390f35b34156105d257600080fd5b61031b611243565b34156105e557600080fd5b6102ae600435602435611249565b34156105fe57600080fd5b6102ae60ff60043516602435604435611319565b341561061d57600080fd5b61031b6113a9565b341561063057600080fd5b6102ae6004356113af565b341561064657600080fd5b6102ae60043515156113cf565b341561065e57600080fd5b61031b600160a060020a03600435166024356113fd565b341561068057600080fd5b61031b611447565b341561069357600080fd5b61031b60043561144d565b34156106a957600080fd5b61031b6114c9565b34156106bc57600080fd5b6102ae60ff600435166114cf565b34156106d557600080fd5b6102ae60ff600435166024356044356115a2565b34156106f457600080fd5b6102ae6116c2565b341561070757600080fd5b61031b611947565b341561071a57600080fd5b61031b61194d565b341561072d57600080fd5b6102ae600160a060020a036004351661195f565b341561074c57600080fd5b6102ae60043561199c565b341561076257600080fd5b6105af6004356119bc565b341561077857600080fd5b6102ae600160a060020a03600435166119ca565b341561079757600080fd5b6102ae600435611a58565b34156107ad57600080fd5b6107b5611a78565b604051901515815260200160405180910390f35b34156107d457600080fd5b6102ae600160a060020a0360043516611a81565b34156107f357600080fd5b6102ec611abe565b341561080657600080fd5b61031b600435611acd565b600034600b54811015151561082557600080fd5b600a54421015801561083d575061083a61194d565b42105b151561084857600080fd5b600254600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561087c57600080fd5b6108863334611ad9565b91505b5090565b60005433600160a060020a039081169116146108a857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146108e557600080fd5b601155565b6000805433600160a060020a0390811691161461090657600080fd5b6005546000901161091657600080fd5b5060005b60055481101561095357600580548290811061093257fe5b6000918252602082206002909102018181556001908101919091550161091a565b6000610960600582611d14565b5050565b601054600160a060020a031681565b60135481565b60005433600160a060020a0390811691161461099457600080fd5b600355565b6000805433600160a060020a039081169116146109b557600080fd5b600754600090116109c557600080fd5b5060005b600754811015610a025760078054829081106109e157fe5b600091825260208220600290910201818155600190810191909155016109c9565b6000610a0f600782611d14565b50506000600655565b600254600160a060020a031681565b600080610a338361144d565b9050801515610a455760009150610a6b565b600354610a6890610a5c868463ffffffff611b1916565b9063ffffffff611b4416565b91505b5092915050565b60005433600160a060020a03908116911614610a8d57600080fd5b60008211610a9a57600080fd5b6007805460018101610aac8382611d14565b9160005260206000209060020201600060408051908101604052858152602081018590529190508151815560208201516001909101555050600654610af7908363ffffffff611b5b16565b6006555050565b60005433600160a060020a03908116911614610b1957600080fd5b60108054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610b5657600080fd5b601255565b6000805433600160a060020a03908116911614610b7757600080fd5b5080600160a060020a03811663a9059cbb84826370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610bce57600080fd5b5af11515610bdb57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c2857600080fd5b5af11515610c3557600080fd5b50505060405180515050505050565b600081815b600754811015610cd457814210158015610c8857506007805482908110610c6c57fe5b9060005260206000209060020201600001546201518002820142105b15610c9557809250610cd9565b610cca600782815481101515610ca757fe5b60009182526020909120600290910201548390620151800263ffffffff611b5b16565b9150600101610c49565b600080fd5b5050919050565b600854600160a060020a031681565b600e54600160a060020a031681565b6000805433600160a060020a03908116911614610d1a57600080fd5b8360ff16838360008084118015610d32575060055484105b15610d7a57600580546000198601908110610d4957fe5b90600052602060002090600202019050828160000154108015610d6f5750818160010154105b1515610d7a57600080fd5b8760ff1687876000600580549050846001011015610dd4576005805460018601908110610da357fe5b90600052602060002090600202019050828160000154118015610dc95750818160010154115b1515610dd457600080fd5b60055460ff8d1610610de557600080fd5b6005805490610df79060018301611d14565b506005546001190198505b8b60ff16891115610e6657600580548a908110610e1b57fe5b906000526020600020906002020160058a600101815481101515610e3b57fe5b6000918252602090912082546002909202019081556001918201549101556000199890980197610e02565b60408051908101604052808c81526020018b81525060058d60010160ff16815481101515610e9057fe5b906000526020600020906002020160008201518155602082015160019091015550505050505050505050505050565b60005433600160a060020a03908116911614610eda57600080fd5b60088054600160a060020a031916600160a060020a0392909216919091179055565b60035481565b600054600160a060020a031681565b60005433600160a060020a03908116911614610f2c57600080fd5b600955565b60115481565b600f54600160a060020a031681565b60125481565b60085433600160a060020a0390811691161480610f77575060005433600160a060020a039081169116145b1515610f8257600080fd5b6109608282611b6a565b60005433600160a060020a03908116911614610fa757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b6000805433600160a060020a03908116911614610fe557600080fd5b60075460ff851610610ff657600080fd5b600654611009908463ffffffff611b5b16565b600655600780549061101e9060018301611d14565b5050600754600119015b8360ff1681111561108857600780548290811061104157fe5b906000526020600020906002020160078260010181548110151561106157fe5b60009182526020909120825460029092020190815560019182015491015560001901611028565b60408051908101604052838152602081018390526007805460ff60018801169081106110b057fe5b90600052602060002090600202016000820151815560208201516001909101555050505050565b60095481565b60005433600160a060020a039081169116146110f857600080fd5b600b55565b60008054819033600160a060020a0390811691161461111b57600080fd5b60075460ff84161061112c57600080fd5b6007805460ff851690811061113d57fe5b906000526020600020906002020191506111668260000154600654611c4890919063ffffffff16565b6006556007805460ff851690811061117a57fe5b600091825260208220600290910201818155600101555060ff82165b600754600019018110156111f75760078054600183019081106111b557fe5b90600052602060002090600202016007828154811015156111d257fe5b6000918252602090912082546002909202019081556001918201549082015501611196565b600780549061120a906000198301611d14565b50505050565b6007545b90565b600580548290811061122557fe5b60009182526020909120600290910201805460019091015490915082565b600d5481565b60005433600160a060020a0390811691161461126457600080fd5b6005546000190182826000808411801561127f575060055484105b156112c75760058054600019860190811061129657fe5b906000526020600020906002020190508281600001541080156112bc5750818160010154105b15156112c757600080fd5b60058054600181016112d98382611d14565b9160005260206000209060020201600060408051908101604052898152602081018990529190508151815560208201518160010155505050505050505050565b6000805433600160a060020a0390811691161461133557600080fd5b60075460ff85161061134657600080fd5b6007805460ff861690811061135757fe5b906000526020600020906002020190506113808160000154600654611c4890919063ffffffff16565b600690815583825560018201839055546113a0908463ffffffff611b5b16565b60065550505050565b600a5481565b60005433600160a060020a039081169116146113ca57600080fd5b601355565b60005433600160a060020a039081169116146113ea57600080fd5b6004805460ff1916911515919091179055565b60085460009033600160a060020a039081169116148061142b575060005433600160a060020a039081169116145b151561143657600080fd5b6114408383611ad9565b9392505050565b60015481565b6004546000908190819060ff1615610a6b575060005b600554811015610a6b57600580548290811061147b57fe5b600091825260209091206002909102015484106114b95760058054829081106114a057fe5b90600052602060002090600202016001015491506114c1565b819250610cd9565b600101611463565b60065481565b6000805433600160a060020a039081169116146114eb57600080fd5b60055460ff8316106114fc57600080fd5b6005805460ff841690811061150d57fe5b600091825260208220600290910201818155600101555060ff81165b6005546000190181101561158a57600580546001830190811061154857fe5b906000526020600020906002020160058281548110151561156557fe5b6000918252602090912082546002909202019081556001918201549082015501611529565b600580549061159d906000198301611d14565b505050565b6000805433600160a060020a039081169116146115be57600080fd5b8360ff168383600080841180156115d6575060055484105b1561161e576005805460001986019081106115ed57fe5b906000526020600020906002020190508281600001541080156116135750818160010154105b151561161e57600080fd5b8760ff168787600060058054905084600101101561167857600580546001860190811061164757fe5b9060005260206000209060020201905082816000015411801561166d5750818160010154115b151561167857600080fd5b60055460ff8d161061168957600080fd5b6005805460ff8e1690811061169a57fe5b600091825260209091206002909102019a8b5550505050600190960194909455505050505050565b600080548190819081908190819033600160a060020a039081169116146116e857600080fd5b611711601354611705601154601254611b5b90919063ffffffff16565b9063ffffffff611b5b16565b600c54909650600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561175357600080fd5b5af1151561176057600080fd5b50505060405180516003549096506117979150611783908863ffffffff611c4816565b600354610a5c90889063ffffffff611b1916565b93506117b4600354610a5c60115487611b1990919063ffffffff16565b92506117d1600354610a5c60125487611b1990919063ffffffff16565b91506117ee600354610a5c60135487611b1990919063ffffffff16565b600e5490915061180790600160a060020a031684611b6a565b600f5461181d90600160a060020a031683611b6a565b60105461183390600160a060020a031682611b6a565b600c54600160a060020a0316637d64bcb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561187257600080fd5b5af1151561187f57600080fd5b50505060405180515050600e54600160a060020a031663be9a65556040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156118c857600080fd5b5af115156118d557600080fd5b5050600e54600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561192f57600080fd5b5af1151561193c57600080fd5b505050505050505050565b600b5481565b600061195a600a54611acd565b905090565b60005433600160a060020a0390811691161461197a57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146119b757600080fd5b600d55565b600780548290811061122557fe5b60005433600160a060020a039081169116146119e557600080fd5b600160a060020a03811615156119fa57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614611a7357600080fd5b600a55565b60045460ff1681565b60005433600160a060020a03908116911614611a9c57600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b600c54600160a060020a031681565b60065462015180020190565b600080600d54600154101515611aee57600080fd5b600154611b01908463ffffffff611b5b16565b600155611b0d83611c5a565b90506114408482611b6a565b600080831515611b2c5760009150610a6b565b50828202828482811515611b3c57fe5b041461144057fe5b6000808284811515611b5257fe5b04949350505050565b60008282018381101561144057fe5b600c54600160a060020a03166340c10f19308360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bc057600080fd5b5af11515611bcd57600080fd5b50505060405180515050600c54600160a060020a031663a9059cbb838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611c2d57600080fd5b5af11515611c3a57600080fd5b505050604051805150505050565b600082821115611c5457fe5b50900390565b6000806000806000611c6d600a54610c44565b9350600784815481101515611c7e57fe5b90600052602060002090600202019250611caf670de0b6b3a7640000610a5c60095489611b1990919063ffffffff16565b9150611cbb8287610a27565b9050600083600101541115611cfa57611cf7611cea600354610a5c866001015486611b1990919063ffffffff16565b839063ffffffff611b5b16565b91505b611d0a828263ffffffff611b5b16565b9695505050505050565b81548183558181151161159d5760008381526020902061159d916112149160029182028101918502015b808211156108895760008082556001820155600201611d3e5600a165627a7a723058201d5a29bd962a463a280cba30e77d3cb9c2df188e47c69432ef02d8acc5b29c240029

Deployed Bytecode

0x6060604052600436106102845763ffffffff60e060020a600035041663144fa6d7811461028f57806320ad8a81146102b057806329033133146102c65780632c138236146102d9578063388fb0af14610308578063480b890d1461032d5780634c94ac6a14610343578063521eb2731461035657806354717ea9146103695780635601477b14610382578063575300171461039b57806359169d06146103ba5780636341ca0b146103d05780636793c8e1146103f55780636abc3fe41461040b5780636c9d99da1461041e578063702b7bc314610431578063769ffb7d146104505780638090114f1461046f5780638da5cb5b1461048257806391b7f5ed1461049557806393167204146104ab57806399cd211d146104be5780639a3fdfd0146104d15780639bf6eb60146104e45780639c05093b146105065780639dc905bb14610525578063a035b1fe14610544578063a34d927014610557578063aa525c551461056d578063ab36e4a614610586578063af78facf14610599578063b071cbe6146105c7578063b8a4db81146105da578063bd17647f146105f3578063be9a655514610612578063c66c67e914610625578063c865cadb1461063b578063ca1e5bb714610653578063cafb220214610675578063cd7e318414610688578063ce14a46e1461069e578063cf51ee7a146106b1578063d4b03d34146106ca578063d56b2889146106e9578063d64196f8146106fc578063d7d880431461070f578063deaa59df14610722578063e28fa27d14610741578063e89e4ed614610757578063f2fde38b1461076d578063f6a03ebf1461078c578063f95bbc9c146107a2578063fa8b72ff146107c9578063fc0c546a146107e8578063fd83da09146107fb575b61028c610811565b50005b341561029a57600080fd5b6102ae600160a060020a036004351661088d565b005b34156102bb57600080fd5b6102ae6004356108ca565b34156102d157600080fd5b6102ae6108ea565b34156102e457600080fd5b6102ec610964565b604051600160a060020a03909116815260200160405180910390f35b341561031357600080fd5b61031b610973565b60405190815260200160405180910390f35b341561033857600080fd5b6102ae600435610979565b341561034e57600080fd5b6102ae610999565b341561036157600080fd5b6102ec610a18565b341561037457600080fd5b61031b600435602435610a27565b341561038d57600080fd5b6102ae600435602435610a72565b34156103a657600080fd5b6102ae600160a060020a0360043516610afe565b34156103c557600080fd5b6102ae600435610b3b565b34156103db57600080fd5b6102ae600160a060020a0360043581169060243516610b5b565b341561040057600080fd5b61031b600435610c44565b341561041657600080fd5b6102ec610ce0565b341561042957600080fd5b6102ec610cef565b341561043c57600080fd5b6102ae60ff60043516602435604435610cfe565b341561045b57600080fd5b6102ae600160a060020a0360043516610ebf565b341561047a57600080fd5b61031b610efc565b341561048d57600080fd5b6102ec610f02565b34156104a057600080fd5b6102ae600435610f11565b34156104b657600080fd5b61031b610f31565b34156104c957600080fd5b6102ec610f37565b34156104dc57600080fd5b61031b610f46565b34156104ef57600080fd5b6102ae600160a060020a0360043516602435610f4c565b341561051157600080fd5b6102ae600160a060020a0360043516610f8c565b341561053057600080fd5b6102ae60ff60043516602435604435610fc9565b341561054f57600080fd5b61031b6110d7565b341561056257600080fd5b6102ae6004356110dd565b341561057857600080fd5b6102ae60ff600435166110fd565b341561059157600080fd5b61031b611210565b34156105a457600080fd5b6105af600435611217565b60405191825260208201526040908101905180910390f35b34156105d257600080fd5b61031b611243565b34156105e557600080fd5b6102ae600435602435611249565b34156105fe57600080fd5b6102ae60ff60043516602435604435611319565b341561061d57600080fd5b61031b6113a9565b341561063057600080fd5b6102ae6004356113af565b341561064657600080fd5b6102ae60043515156113cf565b341561065e57600080fd5b61031b600160a060020a03600435166024356113fd565b341561068057600080fd5b61031b611447565b341561069357600080fd5b61031b60043561144d565b34156106a957600080fd5b61031b6114c9565b34156106bc57600080fd5b6102ae60ff600435166114cf565b34156106d557600080fd5b6102ae60ff600435166024356044356115a2565b34156106f457600080fd5b6102ae6116c2565b341561070757600080fd5b61031b611947565b341561071a57600080fd5b61031b61194d565b341561072d57600080fd5b6102ae600160a060020a036004351661195f565b341561074c57600080fd5b6102ae60043561199c565b341561076257600080fd5b6105af6004356119bc565b341561077857600080fd5b6102ae600160a060020a03600435166119ca565b341561079757600080fd5b6102ae600435611a58565b34156107ad57600080fd5b6107b5611a78565b604051901515815260200160405180910390f35b34156107d457600080fd5b6102ae600160a060020a0360043516611a81565b34156107f357600080fd5b6102ec611abe565b341561080657600080fd5b61031b600435611acd565b600034600b54811015151561082557600080fd5b600a54421015801561083d575061083a61194d565b42105b151561084857600080fd5b600254600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561087c57600080fd5b6108863334611ad9565b91505b5090565b60005433600160a060020a039081169116146108a857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146108e557600080fd5b601155565b6000805433600160a060020a0390811691161461090657600080fd5b6005546000901161091657600080fd5b5060005b60055481101561095357600580548290811061093257fe5b6000918252602082206002909102018181556001908101919091550161091a565b6000610960600582611d14565b5050565b601054600160a060020a031681565b60135481565b60005433600160a060020a0390811691161461099457600080fd5b600355565b6000805433600160a060020a039081169116146109b557600080fd5b600754600090116109c557600080fd5b5060005b600754811015610a025760078054829081106109e157fe5b600091825260208220600290910201818155600190810191909155016109c9565b6000610a0f600782611d14565b50506000600655565b600254600160a060020a031681565b600080610a338361144d565b9050801515610a455760009150610a6b565b600354610a6890610a5c868463ffffffff611b1916565b9063ffffffff611b4416565b91505b5092915050565b60005433600160a060020a03908116911614610a8d57600080fd5b60008211610a9a57600080fd5b6007805460018101610aac8382611d14565b9160005260206000209060020201600060408051908101604052858152602081018590529190508151815560208201516001909101555050600654610af7908363ffffffff611b5b16565b6006555050565b60005433600160a060020a03908116911614610b1957600080fd5b60108054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610b5657600080fd5b601255565b6000805433600160a060020a03908116911614610b7757600080fd5b5080600160a060020a03811663a9059cbb84826370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610bce57600080fd5b5af11515610bdb57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c2857600080fd5b5af11515610c3557600080fd5b50505060405180515050505050565b600081815b600754811015610cd457814210158015610c8857506007805482908110610c6c57fe5b9060005260206000209060020201600001546201518002820142105b15610c9557809250610cd9565b610cca600782815481101515610ca757fe5b60009182526020909120600290910201548390620151800263ffffffff611b5b16565b9150600101610c49565b600080fd5b5050919050565b600854600160a060020a031681565b600e54600160a060020a031681565b6000805433600160a060020a03908116911614610d1a57600080fd5b8360ff16838360008084118015610d32575060055484105b15610d7a57600580546000198601908110610d4957fe5b90600052602060002090600202019050828160000154108015610d6f5750818160010154105b1515610d7a57600080fd5b8760ff1687876000600580549050846001011015610dd4576005805460018601908110610da357fe5b90600052602060002090600202019050828160000154118015610dc95750818160010154115b1515610dd457600080fd5b60055460ff8d1610610de557600080fd5b6005805490610df79060018301611d14565b506005546001190198505b8b60ff16891115610e6657600580548a908110610e1b57fe5b906000526020600020906002020160058a600101815481101515610e3b57fe5b6000918252602090912082546002909202019081556001918201549101556000199890980197610e02565b60408051908101604052808c81526020018b81525060058d60010160ff16815481101515610e9057fe5b906000526020600020906002020160008201518155602082015160019091015550505050505050505050505050565b60005433600160a060020a03908116911614610eda57600080fd5b60088054600160a060020a031916600160a060020a0392909216919091179055565b60035481565b600054600160a060020a031681565b60005433600160a060020a03908116911614610f2c57600080fd5b600955565b60115481565b600f54600160a060020a031681565b60125481565b60085433600160a060020a0390811691161480610f77575060005433600160a060020a039081169116145b1515610f8257600080fd5b6109608282611b6a565b60005433600160a060020a03908116911614610fa757600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b6000805433600160a060020a03908116911614610fe557600080fd5b60075460ff851610610ff657600080fd5b600654611009908463ffffffff611b5b16565b600655600780549061101e9060018301611d14565b5050600754600119015b8360ff1681111561108857600780548290811061104157fe5b906000526020600020906002020160078260010181548110151561106157fe5b60009182526020909120825460029092020190815560019182015491015560001901611028565b60408051908101604052838152602081018390526007805460ff60018801169081106110b057fe5b90600052602060002090600202016000820151815560208201516001909101555050505050565b60095481565b60005433600160a060020a039081169116146110f857600080fd5b600b55565b60008054819033600160a060020a0390811691161461111b57600080fd5b60075460ff84161061112c57600080fd5b6007805460ff851690811061113d57fe5b906000526020600020906002020191506111668260000154600654611c4890919063ffffffff16565b6006556007805460ff851690811061117a57fe5b600091825260208220600290910201818155600101555060ff82165b600754600019018110156111f75760078054600183019081106111b557fe5b90600052602060002090600202016007828154811015156111d257fe5b6000918252602090912082546002909202019081556001918201549082015501611196565b600780549061120a906000198301611d14565b50505050565b6007545b90565b600580548290811061122557fe5b60009182526020909120600290910201805460019091015490915082565b600d5481565b60005433600160a060020a0390811691161461126457600080fd5b6005546000190182826000808411801561127f575060055484105b156112c75760058054600019860190811061129657fe5b906000526020600020906002020190508281600001541080156112bc5750818160010154105b15156112c757600080fd5b60058054600181016112d98382611d14565b9160005260206000209060020201600060408051908101604052898152602081018990529190508151815560208201518160010155505050505050505050565b6000805433600160a060020a0390811691161461133557600080fd5b60075460ff85161061134657600080fd5b6007805460ff861690811061135757fe5b906000526020600020906002020190506113808160000154600654611c4890919063ffffffff16565b600690815583825560018201839055546113a0908463ffffffff611b5b16565b60065550505050565b600a5481565b60005433600160a060020a039081169116146113ca57600080fd5b601355565b60005433600160a060020a039081169116146113ea57600080fd5b6004805460ff1916911515919091179055565b60085460009033600160a060020a039081169116148061142b575060005433600160a060020a039081169116145b151561143657600080fd5b6114408383611ad9565b9392505050565b60015481565b6004546000908190819060ff1615610a6b575060005b600554811015610a6b57600580548290811061147b57fe5b600091825260209091206002909102015484106114b95760058054829081106114a057fe5b90600052602060002090600202016001015491506114c1565b819250610cd9565b600101611463565b60065481565b6000805433600160a060020a039081169116146114eb57600080fd5b60055460ff8316106114fc57600080fd5b6005805460ff841690811061150d57fe5b600091825260208220600290910201818155600101555060ff81165b6005546000190181101561158a57600580546001830190811061154857fe5b906000526020600020906002020160058281548110151561156557fe5b6000918252602090912082546002909202019081556001918201549082015501611529565b600580549061159d906000198301611d14565b505050565b6000805433600160a060020a039081169116146115be57600080fd5b8360ff168383600080841180156115d6575060055484105b1561161e576005805460001986019081106115ed57fe5b906000526020600020906002020190508281600001541080156116135750818160010154105b151561161e57600080fd5b8760ff168787600060058054905084600101101561167857600580546001860190811061164757fe5b9060005260206000209060020201905082816000015411801561166d5750818160010154115b151561167857600080fd5b60055460ff8d161061168957600080fd5b6005805460ff8e1690811061169a57fe5b600091825260209091206002909102019a8b5550505050600190960194909455505050505050565b600080548190819081908190819033600160a060020a039081169116146116e857600080fd5b611711601354611705601154601254611b5b90919063ffffffff16565b9063ffffffff611b5b16565b600c54909650600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561175357600080fd5b5af1151561176057600080fd5b50505060405180516003549096506117979150611783908863ffffffff611c4816565b600354610a5c90889063ffffffff611b1916565b93506117b4600354610a5c60115487611b1990919063ffffffff16565b92506117d1600354610a5c60125487611b1990919063ffffffff16565b91506117ee600354610a5c60135487611b1990919063ffffffff16565b600e5490915061180790600160a060020a031684611b6a565b600f5461181d90600160a060020a031683611b6a565b60105461183390600160a060020a031682611b6a565b600c54600160a060020a0316637d64bcb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561187257600080fd5b5af1151561187f57600080fd5b50505060405180515050600e54600160a060020a031663be9a65556040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156118c857600080fd5b5af115156118d557600080fd5b5050600e54600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561192f57600080fd5b5af1151561193c57600080fd5b505050505050505050565b600b5481565b600061195a600a54611acd565b905090565b60005433600160a060020a0390811691161461197a57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146119b757600080fd5b600d55565b600780548290811061122557fe5b60005433600160a060020a039081169116146119e557600080fd5b600160a060020a03811615156119fa57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614611a7357600080fd5b600a55565b60045460ff1681565b60005433600160a060020a03908116911614611a9c57600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b600c54600160a060020a031681565b60065462015180020190565b600080600d54600154101515611aee57600080fd5b600154611b01908463ffffffff611b5b16565b600155611b0d83611c5a565b90506114408482611b6a565b600080831515611b2c5760009150610a6b565b50828202828482811515611b3c57fe5b041461144057fe5b6000808284811515611b5257fe5b04949350505050565b60008282018381101561144057fe5b600c54600160a060020a03166340c10f19308360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bc057600080fd5b5af11515611bcd57600080fd5b50505060405180515050600c54600160a060020a031663a9059cbb838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611c2d57600080fd5b5af11515611c3a57600080fd5b505050604051805150505050565b600082821115611c5457fe5b50900390565b6000806000806000611c6d600a54610c44565b9350600784815481101515611c7e57fe5b90600052602060002090600202019250611caf670de0b6b3a7640000610a5c60095489611b1990919063ffffffff16565b9150611cbb8287610a27565b9050600083600101541115611cfa57611cf7611cea600354610a5c866001015486611b1990919063ffffffff16565b839063ffffffff611b5b16565b91505b611d0a828263ffffffff611b5b16565b9695505050505050565b81548183558181151161159d5760008381526020902061159d916112149160029182028101918502015b808211156108895760008082556001820155600201611d3e5600a165627a7a723058201d5a29bd962a463a280cba30e77d3cb9c2df188e47c69432ef02d8acc5b29c240029

Swarm Source

bzzr://1d5a29bd962a463a280cba30e77d3cb9c2df188e47c69432ef02d8acc5b29c24

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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