ETH Price: $3,893.53 (-0.57%)

Contract

0x808508AcB3f5f9AeF7950375bedb8f001cCCAb77
 

Overview

ETH Balance

0.000000000000006969 ETH

Eth Value

Less Than $0.01 (@ $3,893.53/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer174516372023-06-10 18:46:35553 days ago1686422795IN
0x808508Ac...01cCCAb77
0 ETH0.0006387315.38832847
Transfer158759252022-11-01 14:58:59774 days ago1667314739IN
0x808508Ac...01cCCAb77
0 ETH0.0016054832.40057043
Transfer125928082021-06-08 8:29:231285 days ago1623140963IN
0x808508Ac...01cCCAb77
0 ETH0.0007791419.8
Transfer122293432021-04-13 3:30:381342 days ago1618284638IN
0x808508Ac...01cCCAb77
0 ETH0.0016354871
Transfer99890202020-05-02 20:47:351687 days ago1588452455IN
0x808508Ac...01cCCAb77
0 ETH0.0001534
Transfer99699052020-04-29 21:24:301690 days ago1588195470IN
0x808508Ac...01cCCAb77
0 ETH0.000191255
Transfer99415782020-04-25 12:12:511694 days ago1587816771IN
0x808508Ac...01cCCAb77
0 ETH0.000315578.25000035
Transfer99331512020-04-24 4:49:141696 days ago1587703754IN
0x808508Ac...01cCCAb77
0 ETH0.00004652
Transfer99177652020-04-21 19:44:031698 days ago1587498243IN
0x808508Ac...01cCCAb77
0 ETH0.00007652
Transfer96510162020-03-11 15:27:341739 days ago1583940454IN
0x808508Ac...01cCCAb77
0 ETH0.000334398.74218773
Transfer94636682020-02-11 19:46:331768 days ago1581450393IN
0x808508Ac...01cCCAb77
0 ETH0.000114753
Transfer94051402020-02-02 19:56:221777 days ago1580673382IN
0x808508Ac...01cCCAb77
0 ETH0.000038251
Transfer93915442020-01-31 18:06:011779 days ago1580493961IN
0x808508Ac...01cCCAb77
0 ETH0.000186584.87794117
Transfer93723312020-01-28 19:19:021782 days ago1580239142IN
0x808508Ac...01cCCAb77
0 ETH0.000038251
Transfer93097002020-01-19 4:49:241792 days ago1579409364IN
0x808508Ac...01cCCAb77
0 ETH0.000114753
Transfer93081812020-01-18 23:10:321792 days ago1579389032IN
0x808508Ac...01cCCAb77
0 ETH0.000038251
Transfer93059042020-01-18 14:55:391792 days ago1579359339IN
0x808508Ac...01cCCAb77
0 ETH0.000023231
Transfer93041582020-01-18 8:28:461792 days ago1579336126IN
0x808508Ac...01cCCAb77
0 ETH0.000114713
Transfer93036622020-01-18 6:37:101792 days ago1579329430IN
0x808508Ac...01cCCAb77
0 ETH0.00007652
Transfer92705792020-01-13 4:54:001797 days ago1578891240IN
0x808508Ac...01cCCAb77
0 ETH0.000267757
Transfer92303302020-01-07 0:51:301804 days ago1578358290IN
0x808508Ac...01cCCAb77
0 ETH0.000057371.5
Transfer90126452019-11-28 0:24:031844 days ago1574900643IN
0x808508Ac...01cCCAb77
0 ETH0.000344659.2
Transfer89329762019-11-14 14:43:191857 days ago1573742599IN
0x808508Ac...01cCCAb77
0 ETH0.000036311
Transfer88153012019-10-26 12:06:361876 days ago1572091596IN
0x808508Ac...01cCCAb77
0 ETH0.0004945113.2
Transfer87219982019-10-11 18:22:111891 days ago1570818131IN
0x808508Ac...01cCCAb77
0 ETH0.000018730.5
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
60617412018-07-31 6:56:232328 days ago1533020183
0x808508Ac...01cCCAb77
0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LittlePhilCoin

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-31
*/

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  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 a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}


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


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

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

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



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


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() 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 relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @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 {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}


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

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

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

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit 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) {
    return balances[_owner];
  }

}


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


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * 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);
    emit 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;
    emit 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,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit 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,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}


/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

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

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    hasMintPermission
    canMint
    public
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() onlyOwner canMint public returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}


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

  bool public paused = false;


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

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

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

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



/**
 * @title Pausable token
 * @dev StandardToken modified with pausable transfers.
 **/
contract PausableToken is StandardToken, Pausable {

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

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

  function approve(
    address _spender,
    uint256 _value
  )
    public
    whenNotPaused
    returns (bool)
  {
    return super.approve(_spender, _value);
  }

  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    whenNotPaused
    returns (bool success)
  {
    return super.increaseApproval(_spender, _addedValue);
  }

  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    whenNotPaused
    returns (bool success)
  {
    return super.decreaseApproval(_spender, _subtractedValue);
  }
}


contract LittlePhilCoin is MintableToken, PausableToken {
    string public name = "Little Phil Coin";
    string public symbol = "LPC";
    uint8 public decimals = 18;

    constructor () public {
        // Pause token on creation and only unpause after ICO
        pause();
    }

}


/**
 * @title Crowdsale
 * @dev Crowdsale is a base contract for managing a token crowdsale,
 * allowing investors to purchase tokens with ether. This contract implements
 * such functionality in its most fundamental form and can be extended to provide additional
 * functionality and/or custom behavior.
 * The external interface represents the basic interface for purchasing tokens, and conform
 * the base architecture for crowdsales. They are *not* intended to be modified / overriden.
 * The internal interface conforms the extensible and modifiable surface of crowdsales. Override
 * the methods to add functionality. Consider using 'super' where appropiate to concatenate
 * behavior.
 */
contract Crowdsale {
  using SafeMath for uint256;
  using SafeERC20 for ERC20;

  // The token being sold
  ERC20 public token;

  // Address where funds are collected
  address public wallet;

  // How many token units a buyer gets per wei.
  // The rate is the conversion between wei and the smallest and indivisible token unit.
  // So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
  // 1 wei will give you 1 unit, or 0.001 TOK.
  uint256 public rate;

  // Amount of wei raised
  uint256 public weiRaised;

  /**
   * Event for token purchase logging
   * @param purchaser who paid for the tokens
   * @param beneficiary who got the tokens
   * @param value weis paid for purchase
   * @param amount amount of tokens purchased
   */
  event TokenPurchase(
    address indexed purchaser,
    address indexed beneficiary,
    uint256 value,
    uint256 amount
  );

  /**
   * @param _rate Number of token units a buyer gets per wei
   * @param _wallet Address where collected funds will be forwarded to
   * @param _token Address of the token being sold
   */
  constructor(uint256 _rate, address _wallet, ERC20 _token) public {
    require(_rate > 0);
    require(_wallet != address(0));
    require(_token != address(0));

    rate = _rate;
    wallet = _wallet;
    token = _token;
  }

  // -----------------------------------------
  // Crowdsale external interface
  // -----------------------------------------

  /**
   * @dev fallback function ***DO NOT OVERRIDE***
   */
  function () external payable {
    buyTokens(msg.sender);
  }

  /**
   * @dev low level token purchase ***DO NOT OVERRIDE***
   * @param _beneficiary Address performing the token purchase
   */
  function buyTokens(address _beneficiary) public payable {

    uint256 weiAmount = msg.value;
    _preValidatePurchase(_beneficiary, weiAmount);

    // calculate token amount to be created
    uint256 tokens = _getTokenAmount(weiAmount);

    // update state
    weiRaised = weiRaised.add(weiAmount);

    _processPurchase(_beneficiary, tokens);
    emit TokenPurchase(
      msg.sender,
      _beneficiary,
      weiAmount,
      tokens
    );

    _updatePurchasingState(_beneficiary, weiAmount);

    _forwardFunds();
    _postValidatePurchase(_beneficiary, weiAmount);
  }

  // -----------------------------------------
  // Internal interface (extensible)
  // -----------------------------------------

  /**
   * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. Use super to concatenate validations.
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    require(_beneficiary != address(0));
    require(_weiAmount != 0);
  }

  /**
   * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met.
   * @param _beneficiary Address performing the token purchase
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _postValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens.
   * @param _beneficiary Address performing the token purchase
   * @param _tokenAmount Number of tokens to be emitted
   */
  function _deliverTokens(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    token.safeTransfer(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
   * @param _beneficiary Address receiving the tokens
   * @param _tokenAmount Number of tokens to be purchased
   */
  function _processPurchase(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    _deliverTokens(_beneficiary, _tokenAmount);
  }

  /**
   * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.)
   * @param _beneficiary Address receiving the tokens
   * @param _weiAmount Value in wei involved in the purchase
   */
  function _updatePurchasingState(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    // optional override
  }

  /**
   * @dev Override to extend the way in which ether is converted to tokens.
   * @param _weiAmount Value in wei to be converted into tokens
   * @return Number of tokens that can be purchased with the specified _weiAmount
   */
  function _getTokenAmount(uint256 _weiAmount)
    internal view returns (uint256)
  {
    return _weiAmount.mul(rate);
  }

  /**
   * @dev Determines how ETH is stored/forwarded on purchases.
   */
  function _forwardFunds() internal {
    wallet.transfer(msg.value);
  }
}


/**
 * @title MintedCrowdsale
 * @dev Extension of Crowdsale contract whose tokens are minted in each purchase.
 * Token ownership should be transferred to MintedCrowdsale for minting.
 */
contract MintedCrowdsale is Crowdsale {

  /**
   * @dev Overrides delivery by minting tokens upon purchase.
   * @param _beneficiary Token purchaser
   * @param _tokenAmount Number of tokens to be minted
   */
  function _deliverTokens(
    address _beneficiary,
    uint256 _tokenAmount
  )
    internal
  {
    require(MintableToken(token).mint(_beneficiary, _tokenAmount));
  }
}


/**
 * @title CappedCrowdsale
 * @dev Crowdsale with a limit for total contributions.
 */
contract CappedCrowdsale is Crowdsale {
  using SafeMath for uint256;

  uint256 public cap;

  /**
   * @dev Constructor, takes maximum amount of wei accepted in the crowdsale.
   * @param _cap Max amount of wei to be contributed
   */
  constructor(uint256 _cap) public {
    require(_cap > 0);
    cap = _cap;
  }

  /**
   * @dev Checks whether the cap has been reached.
   * @return Whether the cap was reached
   */
  function capReached() public view returns (bool) {
    return weiRaised >= cap;
  }

  /**
   * @dev Extend parent behavior requiring purchase to respect the funding cap.
   * @param _beneficiary Token purchaser
   * @param _weiAmount Amount of wei contributed
   */
  function _preValidatePurchase(
    address _beneficiary,
    uint256 _weiAmount
  )
    internal
  {
    super._preValidatePurchase(_beneficiary, _weiAmount);
    require(weiRaised.add(_weiAmount) <= cap);
  }

}


/**
 * @title TokenCappedCrowdsale
 * @dev Crowdsale with a limit for total minted tokens.
 */
contract TokenCappedCrowdsale is Crowdsale {
    using SafeMath for uint256;

    uint256 public tokenCap = 0;

    // Amount of LPC raised
    uint256 public tokensRaised = 0;

    // Event for manual refund of cap overflow
    event CapOverflow(address sender, uint256 weiAmount, uint256 receivedTokens);

    /**
     * @notice Checks whether the tokenCap has been reached.
     * @return Whether the tokenCap was reached
     */
    function capReached() public view returns (bool) {
        return tokensRaised >= tokenCap;
    }

    /**
     * @notice Update the amount of tokens raised & emit cap overflow events.
     */
    function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal {
        super._updatePurchasingState(_beneficiary, _weiAmount);
        uint256 purchasedTokens = _getTokenAmount(_weiAmount);
        tokensRaised = tokensRaised.add(purchasedTokens);

        if (capReached()) {
            // manual process unused eth amount to sender
            emit CapOverflow(_beneficiary, _weiAmount, purchasedTokens);
        }
    }

}


/**
 * @title Tiered Crowdsale
 * @dev Extension of Crowdsale contract that decreases the number of LPC tokens purchases dependent on the current number of tokens sold.
 */
contract TieredCrowdsale is TokenCappedCrowdsale, Ownable {

    using SafeMath for uint256;

    /**
    SalesState enum for use in state machine to manage sales rates
    */
    enum SaleState { 
        Initial,              // All contract initialization calls
        PrivateSale,          // Private sale for industy and closed group investors
        FinalisedPrivateSale, // Close private sale
        PreSale,              // Pre sale ICO (40% bonus LPC hard-capped at 180 million tokens)
        FinalisedPreSale,     // Close presale
        PublicSaleTier1,      // Tier 1 ICO public sale (30% bonus LPC capped at 85 million tokens)
        PublicSaleTier2,      // Tier 2 ICO public sale (20% bonus LPC capped at 65 million tokens)
        PublicSaleTier3,      // Tier 3 ICO public sale (10% bonus LPC capped at 45 million tokens)
        PublicSaleTier4,      // Tier 4 ICO public sale (standard rate capped at 25 million tokens)
        FinalisedPublicSale,  // Close public sale
        Closed                // ICO has finished, all tokens must have been claimed
    }
    SaleState public state = SaleState.Initial;

    struct TierConfig {
        string stateName;
        uint256 tierRatePercentage;
        uint256 hardCap;
    }

    mapping(bytes32 => TierConfig) private tierConfigs;

    // Event for manual refund of cap overflow
    event IncrementTieredState(string stateName);

    /**
     * @notice Checks the state when validating a purchase
     */
    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
        super._preValidatePurchase(_beneficiary, _weiAmount);
        require(
            state == SaleState.PrivateSale ||
            state == SaleState.PreSale ||
            state == SaleState.PublicSaleTier1 ||
            state == SaleState.PublicSaleTier2 ||
            state == SaleState.PublicSaleTier3 ||
            state == SaleState.PublicSaleTier4
        );
    }

    /**
     * @notice Constructor
     * @dev Caveat emptor: this base contract is intended for inheritance by the Little Phil crowdsale only
     */
    constructor() public {
        // setup the map of bonus-rates for each SaleState tier
        createSalesTierConfigMap();
    }

    /**
     * @dev Overrides parent method taking into account variable rate (as a percentage).
     * @param _weiAmount The value in wei to be converted into tokens
     * @return The number of tokens _weiAmount wei will buy at present time.
     */
    function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) {
        uint256 currentTierRate = getCurrentTierRatePercentage();

        uint256 requestedTokenAmount = _weiAmount.mul(rate).mul(currentTierRate).div(100);

        uint256 remainingTokens = tokenCap.sub(tokensRaised);

        // Return number of LPC to provide
        if (requestedTokenAmount > remainingTokens) {
            return remainingTokens;
        }

        return requestedTokenAmount;
    }

    /**
     * @dev Setup the map of bonus-rates (as a percentage) and total hardCap for each SaleState tier
     * to be called by the constructor.
     */
    function createSalesTierConfigMap() private {

        tierConfigs [keccak256(SaleState.Initial)] = TierConfig({
            stateName: "Initial",
            tierRatePercentage: 0,
            hardCap: 0
        });
        tierConfigs [keccak256(SaleState.PrivateSale)] = TierConfig({
            stateName: "PrivateSale",
            tierRatePercentage: 100,
            hardCap: SafeMath.mul(400000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.FinalisedPrivateSale)] = TierConfig({
            stateName: "FinalisedPrivateSale",
            tierRatePercentage: 0,
            hardCap: 0
        });
        tierConfigs [keccak256(SaleState.PreSale)] = TierConfig({
            stateName: "PreSale",
            tierRatePercentage: 140,
            hardCap: SafeMath.mul(180000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.FinalisedPreSale)] = TierConfig({
            stateName: "FinalisedPreSale",
            tierRatePercentage: 0,
            hardCap: 0
        });
        tierConfigs [keccak256(SaleState.PublicSaleTier1)] = TierConfig({
            stateName: "PublicSaleTier1",
            tierRatePercentage: 130,
            hardCap: SafeMath.mul(265000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.PublicSaleTier2)] = TierConfig({
            stateName: "PublicSaleTier2",
            tierRatePercentage: 120,
            hardCap: SafeMath.mul(330000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.PublicSaleTier3)] = TierConfig({
            stateName: "PublicSaleTier3",
            tierRatePercentage: 110,
            hardCap: SafeMath.mul(375000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.PublicSaleTier4)] = TierConfig({
            stateName: "PublicSaleTier4",
            tierRatePercentage: 100,
            hardCap: SafeMath.mul(400000000, (10 ** 18))
        });
        tierConfigs [keccak256(SaleState.FinalisedPublicSale)] = TierConfig({
            stateName: "FinalisedPublicSale",
            tierRatePercentage: 0,
            hardCap: 0
        });
        tierConfigs [keccak256(SaleState.Closed)] = TierConfig({
            stateName: "Closed",
            tierRatePercentage: 0,
            hardCap: SafeMath.mul(400000000, (10 ** 18))
        });
        

    }

    /**
     * @dev get the current bonus-rate for the current SaleState
     * @return the current rate as a percentage (e.g. 140 = 140% bonus)
     */
    function getCurrentTierRatePercentage() public view returns (uint256) {
        return tierConfigs[keccak256(state)].tierRatePercentage;
    }

    /**
     * @dev Get the current hardCap for the current SaleState
     * @return The current hardCap
     */
    function getCurrentTierHardcap() public view returns (uint256) {
        return tierConfigs[keccak256(state)].hardCap;
    }

    /**
     * @dev Only allow the owner to set the state.
     */
    function setState(uint256 _state) onlyOwner public {
        state = SaleState(_state);

        // Update cap when state changes
        tokenCap = getCurrentTierHardcap();

        if (state == SaleState.Closed) {
            crowdsaleClosed();
        }
    }

    function getState() public view returns (string) {
        return tierConfigs[keccak256(state)].stateName;
    }

    /**
     * @dev Change the bonus tier after a purchase.
     */
    function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal {
        super._updatePurchasingState(_beneficiary, _weiAmount);

        if (capReached()) {
            if (state == SaleState.PrivateSale) {
                state = SaleState.FinalisedPrivateSale;
            }
            else if (state == SaleState.PreSale) {
                state = SaleState.FinalisedPreSale;
            }
            else if (state == SaleState.PublicSaleTier1) {
                state = SaleState.PublicSaleTier2;
            }
            else if (state == SaleState.PublicSaleTier2) {
                state = SaleState.PublicSaleTier3;
            }
            else if (state == SaleState.PublicSaleTier3) {
                state = SaleState.PublicSaleTier4;
            }
            else if (state == SaleState.PublicSaleTier4) {
                state = SaleState.FinalisedPublicSale;
            } else {
                return;
            }

            tokenCap = getCurrentTierHardcap();
            emit IncrementTieredState(getState());
        }

    }

    /**
     * Override for extensions that require an internal notification when the crowdsale has closed
     */
    function crowdsaleClosed() internal {
        // optional override
    }

}

/**
 * @title TokenTimelock
 * @dev TokenTimelock is a token holder contract that will allow a
 * beneficiary to extract the tokens after a given release time
 */
contract TokenTimelock {
  using SafeERC20 for ERC20Basic;

  // ERC20 basic token contract being held
  ERC20Basic public token;

  // beneficiary of tokens after they are released
  address public beneficiary;

  // timestamp when token release is enabled
  uint256 public releaseTime;

  constructor(
    ERC20Basic _token,
    address _beneficiary,
    uint256 _releaseTime
  )
    public
  {
    // solium-disable-next-line security/no-block-members
    require(_releaseTime > block.timestamp);
    token = _token;
    beneficiary = _beneficiary;
    releaseTime = _releaseTime;
  }

  /**
   * @notice Transfers tokens held by timelock to beneficiary.
   */
  function release() public {
    // solium-disable-next-line security/no-block-members
    require(block.timestamp >= releaseTime);

    uint256 amount = token.balanceOf(this);
    require(amount > 0);

    token.safeTransfer(beneficiary, amount);
  }
}

contract InitialSupplyCrowdsale is Crowdsale, Ownable {

    using SafeMath for uint256;

    uint256 public constant decimals = 18;

    // Wallet properties
    address public companyWallet;
    address public teamWallet;
    address public projectWallet;
    address public advisorWallet;
    address public bountyWallet;
    address public airdropWallet;

    // Team locked tokens
    TokenTimelock public teamTimeLock1;
    TokenTimelock public teamTimeLock2;

    // Reserved tokens
    uint256 public constant companyTokens    = SafeMath.mul(150000000, (10 ** decimals));
    uint256 public constant teamTokens       = SafeMath.mul(150000000, (10 ** decimals));
    uint256 public constant projectTokens    = SafeMath.mul(150000000, (10 ** decimals));
    uint256 public constant advisorTokens    = SafeMath.mul(100000000, (10 ** decimals));
    uint256 public constant bountyTokens     = SafeMath.mul(30000000, (10 ** decimals));
    uint256 public constant airdropTokens    = SafeMath.mul(20000000, (10 ** decimals));

    bool private isInitialised = false;

    constructor(
        address[6] _wallets
    ) public {
        address _companyWallet  = _wallets[0];
        address _teamWallet     = _wallets[1];
        address _projectWallet  = _wallets[2];
        address _advisorWallet  = _wallets[3];
        address _bountyWallet   = _wallets[4];
        address _airdropWallet  = _wallets[5];

        require(_companyWallet != address(0));
        require(_teamWallet != address(0));
        require(_projectWallet != address(0));
        require(_advisorWallet != address(0));
        require(_bountyWallet != address(0));
        require(_airdropWallet != address(0));

        // Set reserved wallets
        companyWallet = _companyWallet;
        teamWallet = _teamWallet;
        projectWallet = _projectWallet;
        advisorWallet = _advisorWallet;
        bountyWallet = _bountyWallet;
        airdropWallet = _airdropWallet;

        // Lock team tokens in wallet over time periods
        teamTimeLock1 = new TokenTimelock(token, teamWallet, uint64(now + 182 days));
        teamTimeLock2 = new TokenTimelock(token, teamWallet, uint64(now + 365 days));
    }

    /**
     * Function: Distribute initial token supply
     */
    function setupInitialSupply() internal onlyOwner {
        require(isInitialised == false);
        uint256 teamTokensSplit = teamTokens.mul(50).div(100);

        // Distribute tokens to reserved wallets
        LittlePhilCoin(token).mint(companyWallet, companyTokens);
        LittlePhilCoin(token).mint(projectWallet, projectTokens);
        LittlePhilCoin(token).mint(advisorWallet, advisorTokens);
        LittlePhilCoin(token).mint(bountyWallet, bountyTokens);
        LittlePhilCoin(token).mint(airdropWallet, airdropTokens);
        LittlePhilCoin(token).mint(address(teamTimeLock1), teamTokensSplit);
        LittlePhilCoin(token).mint(address(teamTimeLock2), teamTokensSplit);

        isInitialised = true;
    }

}

/**
 * @title TokenVesting
 * @dev A token holder contract that can release its token balance gradually like a
 * typical vesting scheme, with a cliff and vesting period. Optionally revocable by the
 * owner.
 */
contract TokenVesting is Ownable {
  using SafeMath for uint256;
  using SafeERC20 for ERC20Basic;

  event Released(uint256 amount);
  event Revoked();

  // beneficiary of tokens after they are released
  address public beneficiary;

  uint256 public cliff;
  uint256 public start;
  uint256 public duration;

  bool public revocable;

  mapping (address => uint256) public released;
  mapping (address => bool) public revoked;

  /**
   * @dev Creates a vesting contract that vests its balance of any ERC20 token to the
   * _beneficiary, gradually in a linear fashion until _start + _duration. By then all
   * of the balance will have vested.
   * @param _beneficiary address of the beneficiary to whom vested tokens are transferred
   * @param _cliff duration in seconds of the cliff in which tokens will begin to vest
   * @param _start the time (as Unix time) at which point vesting starts 
   * @param _duration duration in seconds of the period in which the tokens will vest
   * @param _revocable whether the vesting is revocable or not
   */
  constructor(
    address _beneficiary,
    uint256 _start,
    uint256 _cliff,
    uint256 _duration,
    bool _revocable
  )
    public
  {
    require(_beneficiary != address(0));
    require(_cliff <= _duration);

    beneficiary = _beneficiary;
    revocable = _revocable;
    duration = _duration;
    cliff = _start.add(_cliff);
    start = _start;
  }

  /**
   * @notice Transfers vested tokens to beneficiary.
   * @param token ERC20 token which is being vested
   */
  function release(ERC20Basic token) public {
    uint256 unreleased = releasableAmount(token);

    require(unreleased > 0);

    released[token] = released[token].add(unreleased);

    token.safeTransfer(beneficiary, unreleased);

    emit Released(unreleased);
  }

  /**
   * @notice Allows the owner to revoke the vesting. Tokens already vested
   * remain in the contract, the rest are returned to the owner.
   * @param token ERC20 token which is being vested
   */
  function revoke(ERC20Basic token) public onlyOwner {
    require(revocable);
    require(!revoked[token]);

    uint256 balance = token.balanceOf(this);

    uint256 unreleased = releasableAmount(token);
    uint256 refund = balance.sub(unreleased);

    revoked[token] = true;

    token.safeTransfer(owner, refund);

    emit Revoked();
  }

  /**
   * @dev Calculates the amount that has already vested but hasn't been released yet.
   * @param token ERC20 token which is being vested
   */
  function releasableAmount(ERC20Basic token) public view returns (uint256) {
    return vestedAmount(token).sub(released[token]);
  }

  /**
   * @dev Calculates the amount that has already vested.
   * @param token ERC20 token which is being vested
   */
  function vestedAmount(ERC20Basic token) public view returns (uint256) {
    uint256 currentBalance = token.balanceOf(this);
    uint256 totalBalance = currentBalance.add(released[token]);

    if (block.timestamp < cliff) {
      return 0;
    } else if (block.timestamp >= start.add(duration) || revoked[token]) {
      return totalBalance;
    } else {
      return totalBalance.mul(block.timestamp.sub(start)).div(duration);
    }
  }
}



contract TokenVestingCrowdsale is Crowdsale, Ownable {

    function addBeneficiaryVestor(
            address beneficiaryWallet, 
            uint256 tokenAmount, 
            uint256 vestingEpocStart, 
            uint256 cliffInSeconds, 
            uint256 vestingEpocEnd
        ) external onlyOwner {
        TokenVesting newVault = new TokenVesting(
            beneficiaryWallet, 
            vestingEpocStart, 
            cliffInSeconds, 
            vestingEpocEnd, 
            false
        );
        LittlePhilCoin(token).mint(address(newVault), tokenAmount);
    }

    function releaseVestingTokens(address vaultAddress) external onlyOwner {
        TokenVesting(vaultAddress).release(token);
    }

}


 
 

contract WhitelistedCrowdsale is Crowdsale, Ownable {

    address public whitelister;
    mapping(address => bool) public whitelist;

    constructor(address _whitelister) public {
        require(_whitelister != address(0));
        whitelister = _whitelister;
    }

    modifier isWhitelisted(address _beneficiary) {
        require(whitelist[_beneficiary]);
        _;
    }

    function addToWhitelist(address _beneficiary) public onlyOwnerOrWhitelister {
        whitelist[_beneficiary] = true;
    }

    function addManyToWhitelist(address[] _beneficiaries) public onlyOwnerOrWhitelister {
        for (uint256 i = 0; i < _beneficiaries.length; i++) {
            whitelist[_beneficiaries[i]] = true;
        }
    }

    function removeFromWhitelist(address _beneficiary) public onlyOwnerOrWhitelister {
        whitelist[_beneficiary] = false;
    }

    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal isWhitelisted(_beneficiary) {
        super._preValidatePurchase(_beneficiary, _weiAmount);
    }

    modifier onlyOwnerOrWhitelister() {
        require(msg.sender == owner || msg.sender == whitelister);
        _;
    }
}

/**
 * @title Little Phil Crowdsale
 */
contract LittlePhilCrowdsale is MintedCrowdsale, TieredCrowdsale, InitialSupplyCrowdsale, TokenVestingCrowdsale, WhitelistedCrowdsale {

    /**
     * @notice Event for rate-change logging
     * @param rate the new ETH-to_LPC exchange rate
     */
    event NewRate(uint256 rate);

    /**
     * @notice Constructor
     */
    constructor(
        uint256 _rate,
        address _fundsWallet,
        address[6] _wallets,
        LittlePhilCoin _token,
        address _whitelister
    ) public
    Crowdsale(_rate, _fundsWallet, _token)
    InitialSupplyCrowdsale(_wallets) 
    WhitelistedCrowdsale(_whitelister){}

    /**
     * @notice Sets up the initial balances
     * @dev This must be called after ownership of the token is transferred to the crowdsale
     */
    function setupInitialState() external onlyOwner {
        setupInitialSupply();
    }

    /**
     * @notice Ownership management
     */
    function transferTokenOwnership(address _newOwner) external onlyOwner {
        require(_newOwner != address(0));
        // I assume the crowdsale contract holds a reference to the token contract.
        LittlePhilCoin(token).transferOwnership(_newOwner);
    }

    /**
     * @notice Crowdsale Closed
     * @dev Called at the end of the crowdsale when it is ended
     */
    function crowdsaleClosed() internal {
        uint256 remainingTokens = tokenCap.sub(tokensRaised);
        _deliverTokens(airdropWallet, remainingTokens);
        LittlePhilCoin(token).finishMinting();
    }

    /**
     * @notice Checks the state when validating a purchase
     */
    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
        super._preValidatePurchase(_beneficiary, _weiAmount);
        require(_weiAmount >= 500000000000000000);
    }

    /**
     * @notice Update the ETH-to-LPC exchange rate
     * @param _rate The Rate that will applied to ETH to derive how many LPC to mint
     * does not affect, nor influenced by the bonus rates based on the current tier.
     */
    function setRate(uint256 _rate) public onlyOwner {
        require(_rate > 0);
        rate = _rate;
        emit NewRate(rate);
    }

     /**
      * @notice Mint for Private Fiat Transactions
      * @dev Allows for minting from owner account
      */
    function mintForPrivateFiat(address _beneficiary, uint256 _weiAmount) public onlyOwner {
        _preValidatePurchase(_beneficiary, _weiAmount);

        // calculate token amount to be created
        uint256 tokens = _getTokenAmount(_weiAmount);

        // update state
        weiRaised = weiRaised.add(_weiAmount);

        _processPurchase(_beneficiary, tokens);
        emit TokenPurchase(
            msg.sender,
            _beneficiary,
            _weiAmount,
            tokens
        );

        _updatePurchasingState(_beneficiary, _weiAmount);

        _forwardFunds();
        _postValidatePurchase(_beneficiary, _weiAmount);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","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"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

6003805460a060020a61ffff021916905560c0604052601060808190527f4c6974746c65205068696c20436f696e0000000000000000000000000000000060a090815262000051916004919062000174565b506040805180820190915260038082527f4c504300000000000000000000000000000000000000000000000000000000006020909201918252620000989160059162000174565b506006805460ff19166012179055348015620000b357600080fd5b5060038054600160a060020a03191633179055620000d9640100000000620000df810204565b62000219565b600354600160a060020a03163314620000f757600080fd5b6003547501000000000000000000000000000000000000000000900460ff16156200012157600080fd5b6003805460a860020a60ff02191675010000000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b757805160ff1916838001178555620001e7565b82800160010185558215620001e7579182015b82811115620001e7578251825591602001919060010190620001ca565b50620001f5929150620001f9565b5090565b6200021691905b80821115620001f5576000815560010162000200565b90565b610eb480620002296000396000f3006080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461011657806306fdde031461013f578063095ea7b3146101c957806318160ddd146101ed57806323b872dd14610214578063313ce5671461023e5780633f4ba83a1461026957806340c10f19146102805780635c975abb146102a457806366188463146102b957806370a08231146102dd578063715018a6146102fe5780637d64bcb4146103135780638456cb59146103285780638da5cb5b1461033d57806395d89b411461036e578063a9059cbb14610383578063d73dd623146103a7578063dd62ed3e146103cb578063f2fde38b146103f2575b600080fd5b34801561012257600080fd5b5061012b610413565b604080519115158252519081900360200190f35b34801561014b57600080fd5b50610154610434565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561018e578181015183820152602001610176565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101d557600080fd5b5061012b600160a060020a03600435166024356104c2565b3480156101f957600080fd5b506102026104ed565b60408051918252519081900360200190f35b34801561022057600080fd5b5061012b600160a060020a03600435811690602435166044356104f3565b34801561024a57600080fd5b50610253610520565b6040805160ff9092168252519081900360200190f35b34801561027557600080fd5b5061027e610529565b005b34801561028c57600080fd5b5061012b600160a060020a03600435166024356105a2565b3480156102b057600080fd5b5061012b6106bd565b3480156102c557600080fd5b5061012b600160a060020a03600435166024356106cd565b3480156102e957600080fd5b50610202600160a060020a03600435166106f1565b34801561030a57600080fd5b5061027e61070c565b34801561031f57600080fd5b5061012b61077a565b34801561033457600080fd5b5061027e610820565b34801561034957600080fd5b5061035261089e565b60408051600160a060020a039092168252519081900360200190f35b34801561037a57600080fd5b506101546108ad565b34801561038f57600080fd5b5061012b600160a060020a0360043516602435610908565b3480156103b357600080fd5b5061012b600160a060020a036004351660243561092c565b3480156103d757600080fd5b50610202600160a060020a0360043581169060243516610950565b3480156103fe57600080fd5b5061027e600160a060020a036004351661097b565b60035474010000000000000000000000000000000000000000900460ff1681565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60035460009060a860020a900460ff16156104dc57600080fd5b6104e6838361099e565b9392505050565b60015490565b60035460009060a860020a900460ff161561050d57600080fd5b610518848484610a04565b949350505050565b60065460ff1681565b600354600160a060020a0316331461054057600080fd5b60035460a860020a900460ff16151561055857600080fd5b6003805475ff000000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600354600090600160a060020a031633146105bc57600080fd5b60035474010000000000000000000000000000000000000000900460ff16156105e457600080fd5b6001546105f7908363ffffffff610b7b16565b600155600160a060020a038316600090815260208190526040902054610623908363ffffffff610b7b16565b600160a060020a03841660008181526020818152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600192915050565b60035460a860020a900460ff1681565b60035460009060a860020a900460ff16156106e757600080fd5b6104e68383610b8e565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a0316331461072357600080fd5b600354604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26003805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090600160a060020a0316331461079457600080fd5b60035474010000000000000000000000000000000000000000900460ff16156107bc57600080fd5b6003805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0890600090a150600190565b600354600160a060020a0316331461083757600080fd5b60035460a860020a900460ff161561084e57600080fd5b6003805475ff000000000000000000000000000000000000000000191660a860020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600354600160a060020a031681565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104ba5780601f1061048f576101008083540402835291602001916104ba565b60035460009060a860020a900460ff161561092257600080fd5b6104e68383610c7e565b60035460009060a860020a900460ff161561094657600080fd5b6104e68383610d5f565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600354600160a060020a0316331461099257600080fd5b61099b81610df8565b50565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6000600160a060020a0383161515610a1b57600080fd5b600160a060020a038416600090815260208190526040902054821115610a4057600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115610a7057600080fd5b600160a060020a038416600090815260208190526040902054610a99908363ffffffff610e7616565b600160a060020a038086166000908152602081905260408082209390935590851681522054610ace908363ffffffff610b7b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054610b10908363ffffffff610e7616565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b81810182811015610b8857fe5b92915050565b336000908152600260209081526040808320600160a060020a038616845290915281205480831115610be357336000908152600260209081526040808320600160a060020a0388168452909152812055610c18565b610bf3818463ffffffff610e7616565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000600160a060020a0383161515610c9557600080fd5b33600090815260208190526040902054821115610cb157600080fd5b33600090815260208190526040902054610cd1908363ffffffff610e7616565b3360009081526020819052604080822092909255600160a060020a03851681522054610d03908363ffffffff610b7b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b336000908152600260209081526040808320600160a060020a0386168452909152812054610d93908363ffffffff610b7b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0381161515610e0d57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600082821115610e8257fe5b509003905600a165627a7a723058206fd0ec478cffd3d0730fc792683b2f5b90a0e3b5db6a93348aea63060f268dbe0029

Deployed Bytecode

0x6080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461011657806306fdde031461013f578063095ea7b3146101c957806318160ddd146101ed57806323b872dd14610214578063313ce5671461023e5780633f4ba83a1461026957806340c10f19146102805780635c975abb146102a457806366188463146102b957806370a08231146102dd578063715018a6146102fe5780637d64bcb4146103135780638456cb59146103285780638da5cb5b1461033d57806395d89b411461036e578063a9059cbb14610383578063d73dd623146103a7578063dd62ed3e146103cb578063f2fde38b146103f2575b600080fd5b34801561012257600080fd5b5061012b610413565b604080519115158252519081900360200190f35b34801561014b57600080fd5b50610154610434565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561018e578181015183820152602001610176565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101d557600080fd5b5061012b600160a060020a03600435166024356104c2565b3480156101f957600080fd5b506102026104ed565b60408051918252519081900360200190f35b34801561022057600080fd5b5061012b600160a060020a03600435811690602435166044356104f3565b34801561024a57600080fd5b50610253610520565b6040805160ff9092168252519081900360200190f35b34801561027557600080fd5b5061027e610529565b005b34801561028c57600080fd5b5061012b600160a060020a03600435166024356105a2565b3480156102b057600080fd5b5061012b6106bd565b3480156102c557600080fd5b5061012b600160a060020a03600435166024356106cd565b3480156102e957600080fd5b50610202600160a060020a03600435166106f1565b34801561030a57600080fd5b5061027e61070c565b34801561031f57600080fd5b5061012b61077a565b34801561033457600080fd5b5061027e610820565b34801561034957600080fd5b5061035261089e565b60408051600160a060020a039092168252519081900360200190f35b34801561037a57600080fd5b506101546108ad565b34801561038f57600080fd5b5061012b600160a060020a0360043516602435610908565b3480156103b357600080fd5b5061012b600160a060020a036004351660243561092c565b3480156103d757600080fd5b50610202600160a060020a0360043581169060243516610950565b3480156103fe57600080fd5b5061027e600160a060020a036004351661097b565b60035474010000000000000000000000000000000000000000900460ff1681565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60035460009060a860020a900460ff16156104dc57600080fd5b6104e6838361099e565b9392505050565b60015490565b60035460009060a860020a900460ff161561050d57600080fd5b610518848484610a04565b949350505050565b60065460ff1681565b600354600160a060020a0316331461054057600080fd5b60035460a860020a900460ff16151561055857600080fd5b6003805475ff000000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600354600090600160a060020a031633146105bc57600080fd5b60035474010000000000000000000000000000000000000000900460ff16156105e457600080fd5b6001546105f7908363ffffffff610b7b16565b600155600160a060020a038316600090815260208190526040902054610623908363ffffffff610b7b16565b600160a060020a03841660008181526020818152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600192915050565b60035460a860020a900460ff1681565b60035460009060a860020a900460ff16156106e757600080fd5b6104e68383610b8e565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a0316331461072357600080fd5b600354604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26003805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090600160a060020a0316331461079457600080fd5b60035474010000000000000000000000000000000000000000900460ff16156107bc57600080fd5b6003805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0890600090a150600190565b600354600160a060020a0316331461083757600080fd5b60035460a860020a900460ff161561084e57600080fd5b6003805475ff000000000000000000000000000000000000000000191660a860020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600354600160a060020a031681565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104ba5780601f1061048f576101008083540402835291602001916104ba565b60035460009060a860020a900460ff161561092257600080fd5b6104e68383610c7e565b60035460009060a860020a900460ff161561094657600080fd5b6104e68383610d5f565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600354600160a060020a0316331461099257600080fd5b61099b81610df8565b50565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6000600160a060020a0383161515610a1b57600080fd5b600160a060020a038416600090815260208190526040902054821115610a4057600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115610a7057600080fd5b600160a060020a038416600090815260208190526040902054610a99908363ffffffff610e7616565b600160a060020a038086166000908152602081905260408082209390935590851681522054610ace908363ffffffff610b7b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054610b10908363ffffffff610e7616565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b81810182811015610b8857fe5b92915050565b336000908152600260209081526040808320600160a060020a038616845290915281205480831115610be357336000908152600260209081526040808320600160a060020a0388168452909152812055610c18565b610bf3818463ffffffff610e7616565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000600160a060020a0383161515610c9557600080fd5b33600090815260208190526040902054821115610cb157600080fd5b33600090815260208190526040902054610cd1908363ffffffff610e7616565b3360009081526020819052604080822092909255600160a060020a03851681522054610d03908363ffffffff610b7b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b336000908152600260209081526040808320600160a060020a0386168452909152812054610d93908363ffffffff610b7b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0381161515610e0d57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600082821115610e8257fe5b509003905600a165627a7a723058206fd0ec478cffd3d0730fc792683b2f5b90a0e3b5db6a93348aea63060f268dbe0029

Swarm Source

bzzr://6fd0ec478cffd3d0730fc792683b2f5b90a0e3b5db6a93348aea63060f268dbe

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.