ETH Price: $2,186.45 (+1.72%)

Contract

0x5DE9F32b2665bb2CDc23bfB51B03E2a2985ecc87
 

Overview

ETH Balance

15.43660000000000006 ETH

Eth Value

$33,751.34 (@ $2,186.45/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Collect Refund133716942021-10-07 11:58:321248 days ago1633607912IN
0x5DE9F32b...2985ecc87
0 ETH0.0027671584.97576988
Collect Refund132436872021-09-17 14:20:161268 days ago1631888416IN
0x5DE9F32b...2985ecc87
0 ETH0.0010990746.56098347
Collect Refund132436822021-09-17 14:19:021268 days ago1631888342IN
0x5DE9F32b...2985ecc87
0 ETH0.0013850142.53217151
Collect Refund72613022019-02-24 10:41:212204 days ago1551004881IN
0x5DE9F32b...2985ecc87
0 ETH0.0003286915
Collect Refund72612802019-02-24 10:31:002204 days ago1551004260IN
0x5DE9F32b...2985ecc87
0 ETH0.0003235815
Remove From Blac...71694772019-02-03 17:51:212225 days ago1549216281IN
0x5DE9F32b...2985ecc87
0 ETH0.0012016651
Collect Refund66744232018-11-09 20:37:142311 days ago1541795834IN
0x5DE9F32b...2985ecc87
0 ETH0.0008844541
Collect Refund66597152018-11-07 10:58:412313 days ago1541588321IN
0x5DE9F32b...2985ecc87
0 ETH0.0008844541
Collect Refund64886052018-10-10 11:15:352341 days ago1539170135IN
0x5DE9F32b...2985ecc87
0 ETH0.0008844541
Collect Refund63235872018-09-13 10:28:442368 days ago1536834524IN
0x5DE9F32b...2985ecc87
0 ETH0.000107865
Collect Refund62716722018-09-04 18:04:582377 days ago1536084298IN
0x5DE9F32b...2985ecc87
0 ETH0.000065733
Set Signer Addre...62716722018-09-04 18:04:582377 days ago1536084298IN
0x5DE9F32b...2985ecc87
0 ETH0.000069763
Set Signer Addre...62482112018-08-31 19:11:532381 days ago1535742713IN
0x5DE9F32b...2985ecc87
0 ETH0.000069763
Set Signer Addre...62482032018-08-31 19:09:422381 days ago1535742582IN
0x5DE9F32b...2985ecc87
0 ETH0.000069763
Refund Participa...62481882018-08-31 19:06:292381 days ago1535742389IN
0x5DE9F32b...2985ecc87
0 ETH0.000072173
Collect Refund62474432018-08-31 16:03:252381 days ago1535731405IN
0x5DE9F32b...2985ecc87
0 ETH0.00018918.63
Transfer Ownersh...62466712018-08-31 12:55:532381 days ago1535720153IN
0x5DE9F32b...2985ecc87
0 ETH0.000200868.3
Collect Refund62431092018-08-30 22:36:352382 days ago1535668595IN
0x5DE9F32b...2985ecc87
0 ETH0.000053022.42
Collect Refund62384582018-08-30 3:37:112383 days ago1535600231IN
0x5DE9F32b...2985ecc87
0 ETH0.000043822
Collect Refund62374652018-08-29 23:43:242383 days ago1535586204IN
0x5DE9F32b...2985ecc87
0 ETH0.000043822
Collect Refund62340832018-08-29 10:07:592383 days ago1535537279IN
0x5DE9F32b...2985ecc87
0 ETH0.000064162.9282
Collect Refund62297922018-08-28 16:37:032384 days ago1535474223IN
0x5DE9F32b...2985ecc87
0 ETH0.000065733
Collect Refund62297642018-08-28 16:29:012384 days ago1535473741IN
0x5DE9F32b...2985ecc87
0 ETH0.000043822
Collect Refund62294922018-08-28 15:22:552384 days ago1535469775IN
0x5DE9F32b...2985ecc87
0 ETH0.000064713
Collect Refund62278652018-08-28 8:38:092384 days ago1535445489IN
0x5DE9F32b...2985ecc87
0 ETH0.000064713
View all transactions

Latest 21 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-133716942021-10-07 11:58:321248 days ago1633607912
0x5DE9F32b...2985ecc87
0.15 ETH
-132436822021-09-17 14:19:021268 days ago1631888342
0x5DE9F32b...2985ecc87
0.6 ETH
-72612802019-02-24 10:31:002204 days ago1551004260
0x5DE9F32b...2985ecc87
1.39199999 ETH
Transfer66744232018-11-09 20:37:142311 days ago1541795834
0x5DE9F32b...2985ecc87
0.19 ETH
Transfer66597152018-11-07 10:58:412313 days ago1541588321
0x5DE9F32b...2985ecc87
1.44899999 ETH
Transfer64886052018-10-10 11:15:352341 days ago1539170135
0x5DE9F32b...2985ecc87
1.5 ETH
Transfer63235872018-09-13 10:28:442368 days ago1536834524
0x5DE9F32b...2985ecc87
0.21 ETH
Transfer62294922018-08-28 15:22:552384 days ago1535469775
0x5DE9F32b...2985ecc87
0.87 ETH
Transfer62278652018-08-28 8:38:092384 days ago1535445489
0x5DE9F32b...2985ecc87
0.98 ETH
Transfer62138572018-08-25 23:59:422387 days ago1535241582
0x5DE9F32b...2985ecc87
0.192 ETH
Transfer62052332018-08-24 13:07:542388 days ago1535116074
0x5DE9F32b...2985ecc87
1.26 ETH
Transfer62032812018-08-24 5:23:292388 days ago1535088209
0x5DE9F32b...2985ecc87
5.49 ETH
Transfer61976952018-08-23 6:17:552389 days ago1535005075
0x5DE9F32b...2985ecc87
0.126 ETH
Transfer61947502018-08-22 18:19:522390 days ago1534961992
0x5DE9F32b...2985ecc87
0.51799999 ETH
Transfer61916202018-08-22 5:38:432390 days ago1534916323
0x5DE9F32b...2985ecc87
0.021 ETH
Transfer61874322018-08-21 12:49:572391 days ago1534855797
0x5DE9F32b...2985ecc87
0.57999999 ETH
Transfer61868862018-08-21 10:41:002391 days ago1534848060
0x5DE9F32b...2985ecc87
1.55 ETH
Transfer61818452018-08-20 14:28:332392 days ago1534775313
0x5DE9F32b...2985ecc87
0.260622 ETH
Transfer61814512018-08-20 12:53:282392 days ago1534769608
0x5DE9F32b...2985ecc87
0.084 ETH
Transfer61802492018-08-20 7:52:342392 days ago1534751554
0x5DE9F32b...2985ecc87
2.4 ETH
Transfer61455622018-08-14 11:06:172398 days ago1534244777
0x5DE9F32b...2985ecc87
0.08 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KYCCrowdsale

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-04
*/

pragma solidity 0.4.21;

// File: contracts/BytesDeserializer.sol

/*
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */

/*
 * Deserialize bytes payloads.
 *
 * Values are in big-endian byte order.
 *
 */
library BytesDeserializer {

  /*
   * Extract 256-bit worth of data from the bytes stream.
   */
  function slice32(bytes b, uint offset) public pure returns (bytes32) {
    bytes32 out;

    for (uint i = 0; i < 32; i++) {
      out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
    }
    return out;
  }

  /*
   * Extract Ethereum address worth of data from the bytes stream.
   */
  function sliceAddress(bytes b, uint offset) public pure returns (address) {
    bytes32 out;

    for (uint i = 0; i < 20; i++) {
      out |= bytes32(b[offset + i] & 0xFF) >> ((i+12) * 8);
    }
    return address(uint(out));
  }

  /*
   * Extract 128-bit worth of data from the bytes stream.
   */
  function slice16(bytes b, uint offset) public pure returns (bytes16) {
    bytes16 out;

    for (uint i = 0; i < 16; i++) {
      out |= bytes16(b[offset + i] & 0xFF) >> (i * 8);
    }
    return out;
  }

  /*
   * Extract 32-bit worth of data from the bytes stream.
   */
  function slice4(bytes b, uint offset) public pure returns (bytes4) {
    bytes4 out;

    for (uint i = 0; i < 4; i++) {
      out |= bytes4(b[offset + i] & 0xFF) >> (i * 8);
    }
    return out;
  }

  /*
   * Extract 16-bit worth of data from the bytes stream.
   */
  function slice2(bytes b, uint offset) public pure returns (bytes2) {
    bytes2 out;

    for (uint i = 0; i < 2; i++) {
      out |= bytes2(b[offset + i] & 0xFF) >> (i * 8);
    }
    return out;
  }

}

// File: contracts/KYCPayloadDeserializer.sol

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */


/**
 * A mix-in contract to decode AML payloads.
 *
 * @notice This should be a library, but for the complexity and toolchain fragility risks involving of linking library inside library, we put this as a mix-in.
 */
contract KYCPayloadDeserializer {

  using BytesDeserializer for bytes;

  /**
   * This function takes the dataframe and unpacks it
   * We have the users ETH address for verification that they are using their own signature
   * CustomerID so we can track customer purchases
   * Min/Max ETH to invest for AML/CTF purposes - this can be supplied by the user OR by the back-end.
   */
  function getKYCPayload(bytes dataframe) public pure returns(address whitelistedAddress, uint128 customerId, uint32 minEth, uint32 maxEth) {
    address _whitelistedAddress = dataframe.sliceAddress(0);
    uint128 _customerId = uint128(dataframe.slice16(20));
    uint32 _minETH = uint32(dataframe.slice4(36));
    uint32 _maxETH = uint32(dataframe.slice4(40));
    return (_whitelistedAddress, _customerId, _minETH, _maxETH);
  }

}

// File: contracts/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/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/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/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/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/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];
  }

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

  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/ReleasableToken.sol

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 *
 * Some of this code has been updated by Pickeringware ltd to faciliatte the new solidity compilation requirements
 */

pragma solidity 0.4.21;




/**
 * Define interface for releasing the token transfer after a successful crowdsale.
 */
contract ReleasableToken is StandardToken, Ownable {

  /* The finalizer contract that allows unlift the transfer limits on this token */
  address public releaseAgent;

  /** A crowdsale contract can release us to the wild if ICO success. If false we are are in transfer lock up period.*/
  bool public released = false;

  /** Map of agents that are allowed to transfer tokens regardless of the lock down period. These are crowdsale contracts and possible the team multisig itself. */
  mapping (address => bool) public transferAgents;

  /**
   * Limit token transfer until the crowdsale is over.
   *
   */
  modifier canTransfer(address _sender) {
    if(!released) {
        if(!transferAgents[_sender]) {
            revert();
        }
    }
    _;
  }

  /**
   * Set the contract that can call release and make the token transferable.
   *
   * Design choice. Allow reset the release agent to fix fat finger mistakes.
   */
  function setReleaseAgent() onlyOwner inReleaseState(false) public {

    // We don't do interface check here as we might want to a normal wallet address to act as a release agent
    releaseAgent = owner;
  }

  /**
   * Owner can allow a particular address (a crowdsale contract) to transfer tokens despite the lock up period.
   */
  function setTransferAgent(address addr, bool state) onlyReleaseAgent inReleaseState(false) public {
    transferAgents[addr] = state;
  }

  /**
   * One way function to release the tokens to the wild.
   *
   * Can be called only from the release agent that is the final ICO contract. It is only called if the crowdsale has been success (first milestone reached).
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    released = true;
  }

  /** The function can be called only before or after the tokens have been releasesd */
  modifier inReleaseState(bool releaseState) {
    if(releaseState != released) {
        revert();
    }
    _;
  }

  /** The function can be called only by a whitelisted release agent. */
  modifier onlyReleaseAgent() {
    if(msg.sender != releaseAgent) {
        revert();
    }
    _;
  }

  function transfer(address _to, uint _value) canTransfer(msg.sender) public returns (bool success) {
    // Call StandardToken.transfer()
   return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint _value) canTransfer(_from) public returns (bool success) {
    // Call StandardToken.transferForm()
    return super.transferFrom(_from, _to, _value);
  }

}

// File: contracts/MintableToken.sol

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 * 
 * Some of this code has been changed by Pickeringware ltd to facilitate solidities new compilation requirements
 */

contract MintableToken is ReleasableToken {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;

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

  /**
   * @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) onlyOwner canMint public returns (bool) {
    totalSupply = totalSupply.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    Mint(_to, _amount);
    Transfer(address(0), _to, _amount);
    return true;
  }

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

// File: contracts/AMLToken.sol

/**
 * This contract has been written by Pickeringware ltd in some areas to facilitate custom crwodsale features
 */

pragma solidity 0.4.21;



/**
 * The AML Token
 *
 * This subset of MintableCrowdsaleToken gives the Owner a possibility to
 * reclaim tokens from a participant before the token is released
 * after a participant has failed a prolonged AML process.
 *
 * It is assumed that the anti-money laundering process depends on blockchain data.
 * The data is not available before the transaction and not for the smart contract.
 * Thus, we need to implement logic to handle AML failure cases post payment.
 * We give a time window before the token release for the token sale owners to
 * complete the AML and claw back all token transactions that were
 * caused by rejected purchases.
 */
contract AMLToken is MintableToken {

  // An event when the owner has reclaimed non-released tokens
  event ReclaimedAllAndBurned(address claimedBy, address fromWhom, uint amount);

    // An event when the owner has reclaimed non-released tokens
  event ReclaimAndBurned(address claimedBy, address fromWhom, uint amount);

  /// @dev Here the owner can reclaim the tokens from a participant if
  ///      the token is not released yet. Refund will be handled in sale contract.
  /// We also burn the tokens in the interest of economic value to the token holder
  /// @param fromWhom address of the participant whose tokens we want to claim
  function reclaimAllAndBurn(address fromWhom) public onlyReleaseAgent inReleaseState(false) {
    uint amount = balanceOf(fromWhom);    
    balances[fromWhom] = 0;
    totalSupply = totalSupply.sub(amount);
    
    ReclaimedAllAndBurned(msg.sender, fromWhom, amount);
  }

  /// @dev Here the owner can reclaim the tokens from a participant if
  ///      the token is not released yet. Refund will be handled in sale contract.
  /// We also burn the tokens in the interest of economic value to the token holder
  /// @param fromWhom address of the participant whose tokens we want to claim
  function reclaimAndBurn(address fromWhom, uint256 amount) public onlyReleaseAgent inReleaseState(false) {       
    balances[fromWhom] = balances[fromWhom].sub(amount);
    totalSupply = totalSupply.sub(amount);
    
    ReclaimAndBurned(msg.sender, fromWhom, amount);
  }
}

// File: contracts/PickToken.sol

/*
 * This token is part of Pickeringware ltds smart contracts
 * It is used to specify certain details about the token upon release
 */


contract PickToken is AMLToken {
  string public name = "AX1 Mining token";
  string public symbol = "AX1";
  uint8 public decimals = 5;
}

// File: contracts/Stoppable.sol

contract Stoppable is Ownable {
  bool public halted;

  event SaleStopped(address owner, uint256 datetime);

  modifier stopInEmergency {
    require(!halted);
    _;
  }

  function hasHalted() internal view returns (bool isHalted) {
  	return halted;
  }

   // called by the owner on emergency, triggers stopped state
  function stopICO() external onlyOwner {
    halted = true;
    SaleStopped(msg.sender, now);
  }
}

// File: contracts/Crowdsale.sol

/**
 * @title Crowdsale
 * @dev Crowdsale is a base contract for managing a token crowdsale.
 * Crowdsales have a start and end timestamps, where investors can make
 * token purchases and the crowdsale will assign them tokens based
 * on a token per ETH rate. Funds collected are forwarded to a wallet
 * as they arrive.
 *
 * This base contract has been changed in certain areas by Pickeringware ltd to facilitate extra functionality
 */
contract Crowdsale is Stoppable {
  using SafeMath for uint256;

  // The token being sold
  PickToken public token;

  // start and end timestamps where investments are allowed (both inclusive)
  uint256 public startTime;
  uint256 public endTime;

  // address where funds are collected
  address public wallet;
  address public contractAddr;
  
  // how many token units a buyer gets per wei
  uint256 public rate;

  // amount of raised money in wei
  uint256 public weiRaised;
  uint256 public presaleWeiRaised;

  // amount of tokens sent
  uint256 public tokensSent;

  // These store balances of participants by ID, address and in wei, pre-sale wei and tokens
  mapping(uint128 => uint256) public balancePerID;
  mapping(address => uint256) public balanceOf;
  mapping(address => uint256) public presaleBalanceOf;
  mapping(address => uint256) public tokenBalanceOf;

  /**
   * 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, uint256 datetime);

  /*
   * Contructor
   * This initialises the basic crowdsale data
   * It transfers ownership of this token to the chosen beneficiary 
  */
  function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, PickToken _token) public {
    require(_startTime >= now);
    require(_endTime >= _startTime);
    require(_rate > 0);
    require(_wallet != address(0));

    token = _token;
    startTime = _startTime;
    endTime = _endTime;
    rate = _rate;
    wallet = _wallet;
    transferOwnership(_wallet);
  }

  /*
   * This method has been changed by Pickeringware ltd
   * We have split this method down into overidable functions which may affect how users purchase tokens
   * We also take in a customerID (UUiD v4) which we store in our back-end in order to track users participation
  */ 
  function buyTokens(uint128 buyer) internal stopInEmergency {
    require(buyer != 0);

    uint256 weiAmount = msg.value;

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

    // MUST DO REQUIRE AFTER tokens are calculated to check for cap restrictions in stages
    require(validPurchase(tokens));

    // We move the participants sliders before we mint the tokens to prevent re-entrancy
    finalizeSale(weiAmount, tokens, buyer);
    produceTokens(msg.sender, weiAmount, tokens);
  }

  // This function was created to be overridden by a parent contract
  function produceTokens(address buyer, uint256 weiAmount, uint256 tokens) internal {
    token.mint(buyer, tokens);
    TokenPurchase(msg.sender, buyer, weiAmount, tokens, now);
  }

  // This was created to be overriden by stages implementation
  // It will adjust the stage sliders accordingly if needed
  function finalizeSale(uint256 _weiAmount, uint256 _tokens, uint128 _buyer) internal {
    // Collect ETH and send them a token in return
    balanceOf[msg.sender] = balanceOf[msg.sender].add(_weiAmount);
    tokenBalanceOf[msg.sender] = tokenBalanceOf[msg.sender].add(_tokens);
    balancePerID[_buyer] = balancePerID[_buyer].add(_weiAmount);

    // update state
    weiRaised = weiRaised.add(_weiAmount);
    tokensSent = tokensSent.add(_tokens);
  }
  
  // This was created to be overridden by the stages implementation
  // Again, this is dependent on the price of tokens which may or may not be collected in stages
  function tokensToRecieve(uint256 _wei) internal view returns (uint256 tokens) {
    return _wei.div(rate);
  }

  // send ether to the fund collection wallet
  // override to create custom fund forwarding mechanisms
  function successfulWithdraw() external onlyOwner stopInEmergency {
    require(hasEnded());

    owner.transfer(weiRaised);
  }

  // @return true if the transaction can buy tokens
  // Receives tokens to send as variable for custom stage implementation
  // Has an unused variable _tokens which is necessary for capped sale implementation
  function validPurchase(uint256 _tokens) internal view returns (bool) {
    bool withinPeriod = now >= startTime && now <= endTime;
    bool nonZeroPurchase = msg.value != 0;
    return withinPeriod && nonZeroPurchase;
  }

  // @return true if crowdsale event has ended
  function hasEnded() public view returns (bool) {
    return now > endTime;
  }
}

// File: contracts/CappedCrowdsale.sol

/**
 * @title CappedCrowdsale
 * @dev Extension of Crowdsale with a max amount of funds raised
 */
contract CappedCrowdsale is Crowdsale {
  using SafeMath for uint256;

  uint256 public softCap;
  uint256 public hardCap;
  uint256 public withdrawn;
  bool public canWithdraw;
  address public beneficiary;

  event BeneficiaryWithdrawal(address admin, uint256 amount, uint256 datetime);

  // Changed implentation to include soft/hard caps
  function CappedCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, address _beneficiary, uint256 _softCap, uint256 _hardCap, PickToken _token) 
    Crowdsale(_startTime, _endTime, _rate, _wallet, _token)
      public {

    require(_hardCap > 0 && _softCap > 0 && _softCap < _hardCap);

    softCap = _softCap;
    hardCap = _hardCap;
    withdrawn = 0;
    canWithdraw = false;
    beneficiary = _beneficiary;
  }

  // overriding Crowdsale#validPurchase to add extra cap logic
  // @return true if investors can buy at the moment
  function validPurchase(uint256 _tokens) internal view returns (bool) {
    bool withinCap = tokensSent.add(_tokens) <= hardCap;
    return super.validPurchase(_tokens) && withinCap;
  }
  
  // overriding Crowdsale#hasEnded to add cap logic
  // @return true if crowdsale event has ended
  function hasEnded() public view returns (bool) {
    bool capReached = tokensSent >= hardCap;
    return super.hasEnded() || capReached;
  }

  // overriding Crowdsale#successfulWithdraw to add cap logic
  // only allow beneficiary to withdraw if softcap has been reached
  // Uses withdrawn incase a parent contract requires withdrawing softcap early
  function successfulWithdraw() external onlyOwner stopInEmergency {
    require(hasEnded());
    // This is used for extra functionality if necessary, i.e. KYC checks
    require(canWithdraw);
    require(tokensSent > softCap);

    uint256 withdrawalAmount = weiRaised.sub(withdrawn);

    withdrawn = withdrawn.add(withdrawalAmount);

    beneficiary.transfer(withdrawalAmount);

    BeneficiaryWithdrawal(msg.sender, withdrawalAmount, now);
  }

}

// File: contracts/SaleStagesLib.sol

/*
 * SaleStagesLib is a part of Pickeringware ltd's smart contracts
 * Its intended use is to abstract the implementation of stages away from a contract to ease deployment and codel length
 * It uses a stage struct to store specific details about each stage
 * It has several functions which are used to get/change this data
*/

library SaleStagesLib {
	using SafeMath for uint256;

	// Stores Stage implementation
	struct Stage{
        uint256 deadline;
        uint256 tokenPrice;
        uint256 tokensSold;
        uint256 minimumBuy;
        uint256 cap;
	}

	// The struct that is stored by the contract
	// Contains counter to iterate through map of stages
	struct StageStorage {
 		mapping(uint8 => Stage) stages;
 		uint8 stageCount;
	}

	// Initiliase the stagecount to 0
	function init(StageStorage storage self) public {
		self.stageCount = 0;
	}

	// Create stage adds new stage to stages map and increments stage count
	function createStage(
		StageStorage storage self, 
		uint8 _stage, 
		uint256 _deadline, 
		uint256 _price,
		uint256 _minimum,
		uint256 _cap
	) internal {
        // Ensures stages cannot overlap each other
        uint8 prevStage = _stage - 1;
        require(self.stages[prevStage].deadline < _deadline);
		
        self.stages[_stage].deadline = _deadline;
		self.stages[_stage].tokenPrice = _price;
		self.stages[_stage].tokensSold = 0;
		self.stages[_stage].minimumBuy = _minimum;
		self.stages[_stage].cap = _cap;
		self.stageCount = self.stageCount + 1;
	}

   /*
    * Crowdfund state machine management.
    *
    * We make it a function and do not assign the result to a variable, so there is no chance of the variable being stale.
    * Each one of these conditions checks if the time has passed into another stage and therefore, act as appropriate
    */
    function getStage(StageStorage storage self) public view returns (uint8 stage) {
        uint8 thisStage = self.stageCount + 1;

        for (uint8 i = 0; i < thisStage; i++) {
            if(now <= self.stages[i].deadline){
                return i;
            }
        }

        return thisStage;
    }

    // Both of the below are checked on the overridden validPurchase() function
    // Check to see if the tokens they're about to purchase is above the minimum for this stage
    function checkMinimum(StageStorage storage self, uint8 _stage, uint256 _tokens) internal view returns (bool isValid) {
    	if(_tokens < self.stages[_stage].minimumBuy){
    		return false;
    	} else {
    		return true;
    	}
    }

    // Both of the below are checked on the overridden validPurchase() function
    // Check to see if the tokens they're about to purchase is above the minimum for this stage
    function changeDeadline(StageStorage storage self, uint8 _stage, uint256 _deadline) internal {
        require(self.stages[_stage].deadline > now);
        self.stages[_stage].deadline = _deadline;
    }

    // Checks to see if the tokens they're about to purchase is below the cap for this stage
    function checkCap(StageStorage storage self, uint8 _stage, uint256 _tokens) internal view returns (bool isValid) {
    	uint256 totalTokens = self.stages[_stage].tokensSold.add(_tokens);

    	if(totalTokens > self.stages[_stage].cap){
    		return false;
    	} else {
    		return true;
    	}
    }

    // Refund a particular participant, by moving the sliders of stages he participated in
    function refundParticipant(StageStorage storage self, uint256 stage1, uint256 stage2, uint256 stage3, uint256 stage4) internal {
        self.stages[1].tokensSold = self.stages[1].tokensSold.sub(stage1);
        self.stages[2].tokensSold = self.stages[2].tokensSold.sub(stage2);
        self.stages[3].tokensSold = self.stages[3].tokensSold.sub(stage3);
        self.stages[4].tokensSold = self.stages[4].tokensSold.sub(stage4);
    }
    
	// Both of the below are checked on the overridden validPurchase() function
    // Check to see if the tokens they're about to purchase is above the minimum for this stage
    function changePrice(StageStorage storage self, uint8 _stage, uint256 _tokenPrice) internal {
        require(self.stages[_stage].deadline > now);

        self.stages[_stage].tokenPrice = _tokenPrice;
    }
}

// File: contracts/PickCrowdsale.sol

/*
 * PickCrowdsale and PickToken are a part of Pickeringware ltd's smart contracts
 * This uses the SaleStageLib which is also a part of Pickeringware ltd's smart contracts
 * We create the stages initially in the constructor such that stages cannot be added after the sale has started
 * We then pre-allocate necessary accounts prior to the sale starting
 * This contract implements the stages lib functionality with overriding functions for stages implementation
*/
contract PickCrowdsale is CappedCrowdsale {

  using SaleStagesLib for SaleStagesLib.StageStorage;
  using SafeMath for uint256;

  SaleStagesLib.StageStorage public stages;

  bool preallocated = false;
  bool stagesSet = false;
  address private founders;
  address private bounty;
  address private buyer;
  uint256 public burntBounty;
  uint256 public burntFounder;

  event ParticipantWithdrawal(address participant, uint256 amount, uint256 datetime);
  event StagePriceChanged(address admin, uint8 stage, uint256 price);
  event ExtendedStart(uint256 oldStart, uint256 newStart);

  modifier onlyOnce(bool _check) {
    if(_check) {
      revert();
    }
    _;
  }

  function PickCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, address _beneficiary, address _buyer, address _founders, address _bounty, uint256 _softCap, uint256 _hardCap, PickToken _token)
  	CappedCrowdsale(_startTime, _endTime, _rate, _wallet, _beneficiary, _softCap, _hardCap, _token)
     public { 
    stages.init();
    stages.createStage(0, _startTime, 0, 0, 0);
    founders = _founders;
    bounty = _bounty;
    buyer = _buyer;
  }

  function setPreallocations() external onlyOwner onlyOnce(preallocated) {
    preallocate(buyer, 1250000, 10000000000);
    preallocate(founders, 1777777, 0);
    preallocate(bounty, 444445, 0);
    preallocated = true;
  }

  function setStages() external onlyOwner onlyOnce(stagesSet) {
    stages.createStage(1, startTime.add(1 weeks), 10000000000, 10000000, 175000000000);  //Deadline 1 day (86400)  after start - price: 0.001  - min: 90 - cap: 1,250,000
    stages.createStage(2, startTime.add(2 weeks), 11000000000, 5000000, 300000000000); //Deadline 2 days (172800) after start - price: 0.0011 - min: 60 - cap: 3,000,000 
    stages.createStage(3, startTime.add(4 weeks), 12000000000, 2500000, 575000000000);  //Deadline 4 days (345600) after start - price: 0.0012 - cap: 5,750,000 
    stages.createStage(4, endTime, 15000000000, 1000000, 2000000000000);               //Deadline 1 week after start - price: 0.0015 - cap: 20,000,000 
    stagesSet = true;
  }

  // Creates new stage for the crowdsale
  // Can ONLY be called by the owner of the contract as should never change after creating them on initialisation
  function createStage(uint8 _stage, uint256 _deadline, uint256 _price, uint256 _minimum, uint256 _cap ) internal onlyOwner {
    stages.createStage(_stage, _deadline, _price, _minimum, _cap);
  }

  // Creates new stage for the crowdsale
  // Can ONLY be called by the owner of the contract as should never change after creating them on initialisation
  function changePrice(uint8 _stage, uint256 _price) public onlyOwner {
    stages.changePrice(_stage, _price);
    StagePriceChanged(msg.sender, _stage, _price);
  }

  // Get stage is required to rethen the stage we are currently in
  // This is necessary to check the stage details listed in the below functions
  function getStage() public view returns (uint8 stage) {
    return stages.getStage();
  }

  function getStageDeadline(uint8 _stage) public view returns (uint256 deadline) { 
    return stages.stages[_stage].deadline;
  }

  function getStageTokensSold(uint8 _stage) public view returns (uint256 sold) { 
    return stages.stages[_stage].tokensSold;
  }

  function getStageCap(uint8 _stage) public view returns (uint256 cap) { 
    return stages.stages[_stage].cap;
  }

  function getStageMinimum(uint8 _stage) public view returns (uint256 min) { 
    return stages.stages[_stage].minimumBuy;
  }

  function getStagePrice(uint8 _stage) public view returns (uint256 price) { 
    return stages.stages[_stage].tokenPrice;
  }

  // This is used for extending the sales start time (and the deadlines of each stage) accordingly
  function extendStart(uint256 _newStart) external onlyOwner {
    require(_newStart > startTime);
    require(_newStart > now); 
    require(now < startTime);

    uint256 difference = _newStart - startTime;
    uint256 oldStart = startTime;
    startTime = _newStart;
    endTime = endTime + difference;

    // Loop through every stage in the sale
    for (uint8 i = 0; i < 4; i++) {
      // Extend that stages deadline accordingly
      uint256 temp = stages.stages[i].deadline;
      temp = temp + difference;

      stages.changeDeadline(i, temp);
    }

    ExtendedStart(oldStart, _newStart);
  }

  // @Override crowdsale contract to check the current stage price
  // @return tokens investors are due to recieve
  function tokensToRecieve(uint256 _wei) internal view returns (uint256 tokens) {
    uint8 stage = getStage();
    uint256 price = getStagePrice(stage);

    return _wei.div(price);
  }

  // overriding Crowdsale validPurchase to add extra stage logic
  // @return true if investors can buy at the moment
  function validPurchase(uint256 _tokens) internal view returns (bool) {
    bool isValid = false;
    uint8 stage = getStage();

    if(stages.checkMinimum(stage, _tokens) && stages.checkCap(stage, _tokens)){
      isValid = true;
    }

    return super.validPurchase(_tokens) && isValid;
  }

  // Override crowdsale finalizeSale function to log balance change plus tokens sold in that stage
  function finalizeSale(uint256 _weiAmount, uint256 _tokens, uint128 _buyer) internal {
    // Collect ETH and send them a token in return
    balanceOf[msg.sender] = balanceOf[msg.sender].add(_weiAmount);
    tokenBalanceOf[msg.sender] = tokenBalanceOf[msg.sender].add(_tokens);
    balancePerID[_buyer] = balancePerID[_buyer].add(_weiAmount);

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

    uint8 stage = getStage();
    stages.stages[stage].tokensSold = stages.stages[stage].tokensSold.add(_tokens);
  }

  /**
   * Preallocate tokens for the early investors.
   */
  function preallocate(address receiver, uint tokens, uint weiPrice) internal {
    uint decimals = token.decimals();
    uint tokenAmount = tokens * 10 ** decimals;
    uint weiAmount = weiPrice * tokens; 

    presaleWeiRaised = presaleWeiRaised.add(weiAmount);
    tokensSent = tokensSent.add(tokenAmount);
    tokenBalanceOf[receiver] = tokenBalanceOf[receiver].add(tokenAmount);

    presaleBalanceOf[receiver] = presaleBalanceOf[receiver].add(weiAmount);

    produceTokens(receiver, weiAmount, tokenAmount);
  }

  // If the sale is unsuccessful (has halted or reached deadline and didnt reach softcap)
  // Allows participants to withdraw their balance
  function unsuccessfulWithdrawal() external {
      require(balanceOf[msg.sender] > 0);
      require(hasEnded() && tokensSent < softCap || hasHalted());
      uint256 withdrawalAmount;

      withdrawalAmount = balanceOf[msg.sender];
      balanceOf[msg.sender] = 0; 

      msg.sender.transfer(withdrawalAmount);
      assert(balanceOf[msg.sender] == 0);

      ParticipantWithdrawal(msg.sender, withdrawalAmount, now);
  }

  // Burn the percentage of tokens not sold from the founders and bounty wallets
  // Must do it this way as solidity doesnt deal with decimals
  function burnFoundersTokens(uint256 _bounty, uint256 _founders) internal {
      require(_founders < 177777700000);
      require(_bounty < 44444500000);

      // Calculate the number of tokens to burn from founders and bounty wallet
      burntFounder = _founders;
      burntBounty = _bounty;

      token.reclaimAndBurn(founders, burntFounder);
      token.reclaimAndBurn(bounty, burntBounty);
  }
}

// File: contracts/KYCCrowdsale.sol

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 *
 * Some implementation has been changed by Pickeringware ltd to achieve custom features
 */



/*
 * A crowdsale that allows only signed payload with server-side specified buy in limits.
 *
 * The token distribution happens as in the allocated crowdsale contract
 */
contract KYCCrowdsale is KYCPayloadDeserializer, PickCrowdsale {

  /* Server holds the private key to this address to decide if the AML payload is valid or not. */
  address public signerAddress;
  mapping(address => uint256) public refundable;
  mapping(address => bool) public refunded;
  mapping(address => bool) public blacklist;

  /* A new server-side signer key was set to be effective */
  event SignerChanged(address signer);
  event TokensReclaimed(address user, uint256 amount, uint256 datetime);
  event AddedToBlacklist(address user, uint256 datetime);
  event RemovedFromBlacklist(address user, uint256 datetime);
  event RefundCollected(address user, uint256 datetime);
  event TokensReleased(address agent, uint256 datetime, uint256 bounty, uint256 founders);

  /*
   * Constructor.
   */
  function KYCCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, address _beneficiary, address _buyer, address _founders, address _bounty, uint256 _softCap, uint256 _hardCap, PickToken _token) public
  PickCrowdsale(_startTime, _endTime, _rate, _wallet, _beneficiary, _buyer, _founders, _bounty, _softCap, _hardCap, _token)
  {}

  // This sets the token agent to the contract, allowing the contract to reclaim and burn tokens if necessary
  function setTokenAgent() external onlyOwner {
    // contractAddr = token.owner();
    // Give the sale contract rights to reclaim tokens
    token.setReleaseAgent();
  }

 /* 
  * This function was written by Pickeringware ltd to facilitate a refund action upon failure of KYC analysis
  * 
  * It simply allows the participant to withdraw his ether from the sale
  * Moves the crowdsale sliders accordingly
  * Reclaims the users tokens and burns them
  * Blacklists the user to prevent them from buying any more tokens
  *
  * Stage 1, 2, 3, & 4 are all collected from the database prior to calling this function
  * It allows us to calculate how many tokens need to be taken from each individual stage
  */
  function refundParticipant(address participant, uint256 _stage1, uint256 _stage2, uint256 _stage3, uint256 _stage4) external onlyOwner {
    require(balanceOf[participant] > 0);

    uint256 balance = balanceOf[participant];
    uint256 tokens = tokenBalanceOf[participant];

    balanceOf[participant] = 0;
    tokenBalanceOf[participant] = 0;

    // Refund the participant
    refundable[participant] = balance;

    // Move the crowdsale sliders
    weiRaised = weiRaised.sub(balance);
    tokensSent = tokensSent.sub(tokens);

    // Reclaim the participants tokens and burn them
    token.reclaimAllAndBurn(participant);

    // Blacklist participant so they cannot make further purchases
    blacklist[participant] = true;
    AddedToBlacklist(participant, now);

    stages.refundParticipant(_stage1, _stage2, _stage3, _stage4);

    TokensReclaimed(participant, tokens, now);
  }

  // Allows only the beneficiary to release tokens to people
  // This is needed as the token is owned by the contract, in order to mint tokens
  // therefore, the owner essentially gives permission for the contract to release tokens
  function releaseTokens(uint256 _bounty, uint256 _founders) onlyOwner external {
      // Unless the hardcap was reached, theremust be tokens to burn
      require(_bounty > 0 || tokensSent == hardCap);
      require(_founders > 0 || tokensSent == hardCap);

      burnFoundersTokens(_bounty, _founders);

      token.releaseTokenTransfer();

      canWithdraw = true;

      TokensReleased(msg.sender, now, _bounty, _founders);
  }
  
  // overriding Crowdsale#validPurchase to add extra KYC blacklist logic
  // @return true if investors can buy at the moment
  function validPurchase(uint256 _tokens) internal view returns (bool) {
    bool onBlackList;

    if(blacklist[msg.sender] == true){
      onBlackList = true;
    } else {
      onBlackList = false;
    }
    return super.validPurchase(_tokens) && !onBlackList;
  }

  // This is necessary for the blacklisted user to pull his ether from the contract upon being refunded
  function collectRefund() external {
    require(refundable[msg.sender] > 0);
    require(refunded[msg.sender] == false);

    uint256 theirwei = refundable[msg.sender];
    refundable[msg.sender] = 0;
    refunded[msg.sender] == true;

    msg.sender.transfer(theirwei);

    RefundCollected(msg.sender, now);
  }

  /*
   * A token purchase with anti-money laundering and KYC checks
   * This function takes in a dataframe and EC signature to verify if the purchaser has been verified
   * on the server side of our application and has therefore, participated in KYC. 
   * Upon registering to the site, users are supplied with a signature allowing them to purchase tokens, 
   * which can be revoked at any time, this containst their ETH address, a unique ID and the min and max 
   * ETH that user has stated they will purchase. (Any more than the max may be subject to AML checks).
   */
  function buyWithKYCData(bytes dataframe, uint8 v, bytes32 r, bytes32 s) public payable {

      bytes32 hash = sha256(dataframe);

      address whitelistedAddress;
      uint128 customerId;
      uint32 minETH;
      uint32 maxETH;
      
      (whitelistedAddress, customerId, minETH, maxETH) = getKYCPayload(dataframe);

      // Check that the KYC data is signed by our server
      require(ecrecover(hash, v, r, s) == signerAddress);

      // Check that the user is using his own signature
      require(whitelistedAddress == msg.sender);

      // Check they are buying within their limits - THIS IS ONLY NEEDED IF SPECIFIED BY REGULATORS
      uint256 weiAmount = msg.value;
      uint256 max = maxETH;
      uint256 min = minETH;

      require(weiAmount < (max * 1 ether));
      require(weiAmount > (min * 1 ether));

      buyTokens(customerId);
  }  

  /// @dev This function can set the server side address
  /// @param _signerAddress The address derived from server's private key
  function setSignerAddress(address _signerAddress) external onlyOwner {
    // EC rcover returns 0 in case of error therefore, this CANNOT be 0.
    require(_signerAddress != 0);
    signerAddress = _signerAddress;
    SignerChanged(signerAddress);
  }

  function removeFromBlacklist(address _blacklisted) external onlyOwner {
    require(blacklist[_blacklisted] == true);
    blacklist[_blacklisted] = false;
    RemovedFromBlacklist(_blacklisted, now);
  }

}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractAddr","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensSent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"participant","type":"address"},{"name":"_stage1","type":"uint256"},{"name":"_stage2","type":"uint256"},{"name":"_stage3","type":"uint256"},{"name":"_stage4","type":"uint256"}],"name":"refundParticipant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"collectRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stage","type":"uint8"}],"name":"getStageCap","outputs":[{"name":"cap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bounty","type":"uint256"},{"name":"_founders","type":"uint256"}],"name":"releaseTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setPreallocations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stages","outputs":[{"name":"stageCount","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_blacklisted","type":"address"}],"name":"removeFromBlacklist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"signerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unsuccessfulWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"refundable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burntFounder","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataframe","type":"bytes"}],"name":"getKYCPayload","outputs":[{"name":"whitelistedAddress","type":"address"},{"name":"customerId","type":"uint128"},{"name":"minEth","type":"uint32"},{"name":"maxEth","type":"uint32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_stage","type":"uint8"}],"name":"getStageTokensSold","outputs":[{"name":"sold","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newStart","type":"uint256"}],"name":"extendStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint128"}],"name":"balancePerID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stage","type":"uint8"}],"name":"getStageDeadline","outputs":[{"name":"deadline","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"softCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stage","type":"uint8"},{"name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burntBounty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setTokenAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stage","type":"uint8"}],"name":"getStageMinimum","outputs":[{"name":"min","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"successfulWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"refunded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"stopICO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dataframe","type":"bytes"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"buyWithKYCData","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"presaleBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setStages","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"presaleWeiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blacklist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stage","type":"uint8"}],"name":"getStagePrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStage","outputs":[{"name":"stage","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_wallet","type":"address"},{"name":"_beneficiary","type":"address"},{"name":"_buyer","type":"address"},{"name":"_founders","type":"address"},{"name":"_bounty","type":"address"},{"name":"_softCap","type":"uint256"},{"name":"_hardCap","type":"uint256"},{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signer","type":"address"}],"name":"SignerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"TokensReclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"AddedToBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"RemovedFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"RefundCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agent","type":"address"},{"indexed":false,"name":"datetime","type":"uint256"},{"indexed":false,"name":"bounty","type":"uint256"},{"indexed":false,"name":"founders","type":"uint256"}],"name":"TokensReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"participant","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"ParticipantWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"admin","type":"address"},{"indexed":false,"name":"stage","type":"uint8"},{"indexed":false,"name":"price","type":"uint256"}],"name":"StagePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldStart","type":"uint256"},{"indexed":false,"name":"newStart","type":"uint256"}],"name":"ExtendedStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"admin","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"BeneficiaryWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"datetime","type":"uint256"}],"name":"SaleStopped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526014805461ffff1916905534156200001b57600080fd5b604051610160806200280b833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a031617905591508b90508a8a8a8a8a8a8a8a8a8a8a8a8a8a8a878787878787878442851015620000bb57600080fd5b84841015620000c957600080fd5b60008311620000d757600080fd5b600160a060020a0382161515620000ed57600080fd5b60018054600160a060020a03808416600160a060020a0319928316179092556002879055600386905560068590556004805492851692909116919091179055620001458264010000000062001a31620002b082021704565b50505050506000821180156200015b5750600083115b80156200016757508183105b15156200017357600080fd5b50600e91909155600f55600060105560118054600160a060020a0390921661010002600160a860020a03199092169190911790555073b555eb5b08cd524bd8f5fe82ed514f752a885e29925063965f01e79150601290506040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600481019190915260240160006040518083038186803b15156200021857600080fd5b5af415156200022657600080fd5b506200024b91506012905060008d81808064010000000062001fad6200034082021704565b505060148054600160a060020a0394851662010000026201000060b060020a03199091161790555060158054918316600160a060020a03199283161790556016805493909216921691909117905550620003b69e505050505050505050505050505050565b60005433600160a060020a03908116911614620002cc57600080fd5b600160a060020a0381161515620002e257600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b600019850160ff81166000908152602088905260409020548590106200036557600080fd5b5060ff948516600090815260208790526040812094855560018086019490945560028501556003840191909155600490920191909155918201805460ff198116908316909301909116919091179055565b61244580620003c66000396000f3006060604052600436106102425763ffffffff60e060020a600035041663046dc166811461024757806315a5d9d8146102685780631f1307611461029757806326654d57146102bc57806326ce3da0146102e75780632c4e722e146102fa5780633197cbb61461030d57806338af3eed146103205780633c20d1a5146103335780633f4dd2681461034c5780634042b66f146103655780634413a6881461037857806347d203731461038b578063521eb273146103b4578063537df3b6146103c75780635b7633d0146103e65780635edca2b4146103f957806368ec0d991461040c578063693e22791461042b57806370a082311461043e57806373752db41461045d578063756a288e146104fc57806378e97925146105155780637c6bd96d146105285780637db71fc41461053e57806388426aec146105665780638da5cb5b1461057f578063906a26e01461059257806391778b9c146105a55780639944d5e7146105c1578063b0891f4f146105d4578063b51459fe146105e7578063b9b8af0b1461060e578063bcdea6f914610621578063bdd304061461063a578063c033a4901461064d578063c80ec5221461066c578063c8e569a81461067f578063d7c7159c14610692578063dfc6fbaa146106e8578063e42c08f214610707578063e6ca0f4714610726578063ecb70fb714610739578063f2fde38b1461074c578063f7c00e2f1461076b578063f9f92be41461077e578063fb0cf7ab1461079d578063fb86a404146107b6578063fc0c546a146107c9578063fcaa7664146107dc575b600080fd5b341561025257600080fd5b610266600160a060020a03600435166107ef565b005b341561027357600080fd5b61027b61088e565b604051600160a060020a03909116815260200160405180910390f35b34156102a257600080fd5b6102aa61089d565b60405190815260200160405180910390f35b34156102c757600080fd5b610266600160a060020a03600435166024356044356064356084356108a3565b34156102f257600080fd5b610266610a8c565b341561030557600080fd5b6102aa610b6e565b341561031857600080fd5b6102aa610b74565b341561032b57600080fd5b61027b610b7a565b341561033e57600080fd5b6102aa60ff60043516610b8e565b341561035757600080fd5b610266600435602435610ba6565b341561037057600080fd5b6102aa610cc6565b341561038357600080fd5b610266610ccc565b341561039657600080fd5b61039e610d63565b60405160ff909116815260200160405180910390f35b34156103bf57600080fd5b61027b610d6c565b34156103d257600080fd5b610266600160a060020a0360043516610d7b565b34156103f157600080fd5b61027b610e2a565b341561040457600080fd5b610266610e39565b341561041757600080fd5b6102aa600160a060020a0360043516610f53565b341561043657600080fd5b6102aa610f65565b341561044957600080fd5b6102aa600160a060020a0360043516610f6b565b341561046857600080fd5b6104ae60046024813581810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610f7d95505050505050565b604051600160a060020a0390941684526fffffffffffffffffffffffffffffffff909216602084015263ffffffff908116604080850191909152911660608301526080909101905180910390f35b341561050757600080fd5b6102aa60ff60043516611309565b341561052057600080fd5b6102aa611321565b341561053357600080fd5b610266600435611327565b341561054957600080fd5b6102aa6fffffffffffffffffffffffffffffffff60043516611412565b341561057157600080fd5b6102aa60ff60043516611424565b341561058a57600080fd5b61027b611439565b341561059d57600080fd5b6102aa611448565b34156105b057600080fd5b61026660ff6004351660243561144e565b34156105cc57600080fd5b6102aa6114d2565b34156105df57600080fd5b6102666114d8565b34156105f257600080fd5b6105fa611544565b604051901515815260200160405180910390f35b341561061957600080fd5b6105fa61154d565b341561062c57600080fd5b6102aa60ff6004351661155d565b341561064557600080fd5b610266611575565b341561065857600080fd5b6105fa600160a060020a036004351661169e565b341561067757600080fd5b6102aa6116b3565b341561068a57600080fd5b6102666116b9565b61026660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496505060ff853516946020810135945060400135925061173e915050565b34156106f357600080fd5b6102aa600160a060020a03600435166118cb565b341561071257600080fd5b6102aa600160a060020a03600435166118dd565b341561073157600080fd5b6102666118ef565b341561074457600080fd5b6105fa611a0f565b341561075757600080fd5b610266600160a060020a0360043516611a31565b341561077657600080fd5b6102aa611acc565b341561078957600080fd5b6105fa600160a060020a0360043516611ad2565b34156107a857600080fd5b6102aa60ff60043516611ae7565b34156107c157600080fd5b6102aa611aff565b34156107d457600080fd5b61027b611b05565b34156107e757600080fd5b61039e611b14565b60005433600160a060020a0390811691161461080a57600080fd5b600160a060020a038116151561081f57600080fd5b6019805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290557f5719a5656c5cfdaafa148ecf366fd3b0a7fae06449ce2a46225977fb7417e29d9116604051600160a060020a03909116815260200160405180910390a150565b600554600160a060020a031681565b60095481565b60008054819033600160a060020a039081169116146108c157600080fd5b600160a060020a0387166000908152600b6020526040812054116108e457600080fd5b5050600160a060020a0385166000908152600b602090815260408083208054600d8452828520805492869055859055601a9093529220819055600754909190610933908363ffffffff611b8116565b600755600954610949908263ffffffff611b8116565b600955600154600160a060020a0316632a724f2a8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561099c57600080fd5b5af115156109a957600080fd5b505050600160a060020a0387166000908152601c602052604090819020805460ff191660011790557fc11da825993c0394a75762588c54907093a1361e6d6cb67950b28ba0010b8f39908890429051600160a060020a03909216825260208201526040908101905180910390a1610a2a60128787878763ffffffff611b9316565b7fa06cc0a3867aea08c9e799994171a2eaa01b0db6891bff21ff54cc2639d3e6788782426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150505050505050565b600160a060020a0333166000908152601a6020526040812054819011610ab157600080fd5b600160a060020a0333166000908152601b602052604090205460ff1615610ad757600080fd5b50600160a060020a0333166000818152601a602090815260408083208054939055601b90915290919082156108fc0290839051600060405180830381858888f193505050501515610b2757600080fd5b7f1e62ddfe8c731f66f6b6294434d45407c080972bd05b50d1745257de2220a4e43342604051600160a060020a03909216825260208201526040908101905180910390a150565b60065481565b60035481565b6011546101009004600160a060020a031681565b60ff1660009081526012602052604090206004015490565b60005433600160a060020a03908116911614610bc157600080fd5b6000821180610bd35750600f54600954145b1515610bde57600080fd5b6000811180610bf05750600f54600954145b1515610bfb57600080fd5b610c058282611c6a565b600154600160a060020a0316635f412d4f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c4457600080fd5b5af11515610c5157600080fd5b50506011805460ff19166001179055507f8b81fe67377346f7a0a4a369e94f00c5ae54efa1ff15df40b4d54554e164525a334284846040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15050565b60075481565b60005433600160a060020a03908116911614610ce757600080fd5b60145460ff168015610cf857600080fd5b601654610d1790600160a060020a0316621312d06402540be400611d7f565b601454610d3890620100009004600160a060020a0316621b20716000611d7f565b601554610d5390600160a060020a03166206c81d6000611d7f565b506014805460ff19166001179055565b60135460ff1681565b600454600160a060020a031681565b60005433600160a060020a03908116911614610d9657600080fd5b600160a060020a0381166000908152601c602052604090205460ff161515600114610dc057600080fd5b600160a060020a0381166000908152601c602052604090819020805460ff191690557fa231666d2d1aeb79bb1f0db1a8c9bfc28af2eed3f0a9b68ed157c46ba782c3eb908290429051600160a060020a03909216825260208201526040908101905180910390a150565b601954600160a060020a031681565b600160a060020a0333166000908152600b6020526040812054819011610e5e57600080fd5b610e66611a0f565b8015610e755750600e54600954105b80610e835750610e83611ea6565b1515610e8e57600080fd5b50600160a060020a0333166000818152600b6020526040808220805492905590919082156108fc0290839051600060405180830381858888f193505050501515610ed757600080fd5b600160a060020a0333166000908152600b602052604090205415610ef757fe5b7f399cf6f6b4834b62adc1e73a85b69f3eea1c55f32d09057693655aab33e8b5423382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b601a6020526000908152604090205481565b60185481565b600b6020526000908152604090205481565b600080808080808080730838ae8262bdc0779cbfbeef8811f2abf51c1c7a63b655e1388a836040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610ff7578082015183820152602001610fdf565b50505050905090810190601f1680156110245780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b151561104157600080fd5b5af4151561104e57600080fd5b50505060405180519450730838ae8262bdc0779cbfbeef8811f2abf51c1c7a90506316419aa78a60146040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156110cc5780820151838201526020016110b4565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b151561111657600080fd5b5af4151561112357600080fd5b505050604051805170010000000000000000000000000000000090049350730838ae8262bdc0779cbfbeef8811f2abf51c1c7a905063d54dd8f98a60246040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111b557808201518382015260200161119d565b50505050905090810190601f1680156111e25780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15156111ff57600080fd5b5af4151561120c57600080fd5b505050604051805160e060020a90049250730838ae8262bdc0779cbfbeef8811f2abf51c1c7a905063d54dd8f98a60286040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611291578082015183820152602001611279565b50505050905090810190601f1680156112be5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15156112db57600080fd5b5af415156112e857600080fd5b5050506040518051949a9399509197505060e060020a909204945092505050565b60ff1660009081526012602052604090206002015490565b60025481565b6000805481908190819033600160a060020a0390811691161461134957600080fd5b600254851161135757600080fd5b42851161136357600080fd5b600254421061137157600080fd5b60028054908690556003805482880390810190915594509250600091505b60048260ff1610156113d1575060ff81166000908152601260208190526040909120548401906113c690838363ffffffff611eb616565b60019091019061138f565b7fb03c6e4d98649731c861f3ac1560370eb9b13fe3950dbe318f413df44aecc1fd838660405191825260208201526040908101905180910390a15050505050565b600a6020526000908152604090205481565b60ff1660009081526012602052604090205490565b600054600160a060020a031681565b600e5481565b60005433600160a060020a0390811691161461146957600080fd5b61147b6012838363ffffffff611eed16565b7f3c943c1401d461f1e9a9793a341ba4f600dc3643686cb337621026d523049715338383604051600160a060020a03909316835260ff90911660208301526040808301919091526060909101905180910390a15050565b60175481565b60005433600160a060020a039081169116146114f357600080fd5b600154600160a060020a0316633e96d28e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561153257600080fd5b5af1151561153f57600080fd5b505050565b60115460ff1681565b60005460a060020a900460ff1681565b60ff1660009081526012602052604090206003015490565b6000805433600160a060020a0390811691161461159157600080fd5b60005460a060020a900460ff16156115a857600080fd5b6115b0611a0f565b15156115bb57600080fd5b60115460ff1615156115cc57600080fd5b600e54600954116115dc57600080fd5b6010546007546115f19163ffffffff611b8116565b601054909150611607908263ffffffff611f2716565b6010556011546101009004600160a060020a03166108fc82150282604051600060405180830381858888f19350505050151561164257600080fd5b7f9f7cbddba892cf26a7cd63d61d3c8d085df04bbbe7601e53311038ca6dab196b3382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b601b6020526000908152604090205460ff1681565b60105481565b60005433600160a060020a039081169116146116d457600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f4898556e3bd8b06263e50e938f30f736c1fd2030390474dd6bc0b28d8c5450373342604051600160a060020a03909216825260208201526040908101905180910390a1565b60008060008060008060008060028c6040518082805190602001908083835b6020831061177c5780518252601f19909201916020918201910161175d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506020604051808303816000865af115156117ba57600080fd5b50506040518051905097506117ce8c610f7d565b601954939a5091985096509450600160a060020a03166001898d8d8d6040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561183c57600080fd5b505060206040510351600160a060020a03161461185857600080fd5b33600160a060020a031687600160a060020a031614151561187857600080fd5b503491505063ffffffff808316908416670de0b6b3a76400008202831061189e57600080fd5b670de0b6b3a7640000810283116118b457600080fd5b6118bd86611f3d565b505050505050505050505050565b600c6020526000908152604090205481565b600d6020526000908152604090205481565b60005433600160a060020a0390811691161461190a57600080fd5b601454610100900460ff16801561192057600080fd5b61195c600161193d62093a80600254611f2790919063ffffffff16565b601291906402540be400629896806428bed0160063ffffffff611fad16565b611998600261197962127500600254611f2790919063ffffffff16565b6012919064028fa6ae00624c4b406445d964b80063ffffffff611fad16565b6119d460036119b56224ea00600254611f2790919063ffffffff16565b601291906402cb417800622625a06485e0abb60063ffffffff611fad16565b6003546119fd9060129060049064037e11d600620f42406501d1a94a200063ffffffff611fad16565b506014805461ff001916610100179055565b600f54600954600091901015611a23612022565b80611a2b5750805b91505090565b60005433600160a060020a03908116911614611a4c57600080fd5b600160a060020a0381161515611a6157600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60085481565b601c6020526000908152604090205460ff1681565b60ff1660009081526012602052604090206001015490565b600f5481565b600154600160a060020a031681565b600073b555eb5b08cd524bd8f5fe82ed514f752a885e2963922d38be601260405160e060020a63ffffffff8416028152600481019190915260240160206040518083038186803b1515611b6657600080fd5b5af41515611b7357600080fd5b505050604051805191505090565b600082821115611b8d57fe5b50900390565b6001600090815260208690526040902060020154611bb7908563ffffffff611b8116565b600160009081526020879052604080822060029081019390935582825290200154611be8908463ffffffff611b8116565b600260008181526020889052604080822083019390935560038152919091200154611c19908363ffffffff611b8116565b60036000908152602087905260408082206002908101939093556004825290200154611c4b908263ffffffff611b8116565b6004600090815260209690965260409095206002019490945550505050565b642964606ca08110611c7b57600080fd5b640a591940208210611c8c57600080fd5b60188190556017829055600154601454600160a060020a039182169163fb920ad191620100009004168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611cf957600080fd5b5af11515611d0657600080fd5b5050600154601554601754600160a060020a03928316935063fb920ad1929091169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611d6b57600080fd5b5af11515611d7857600080fd5b5050505050565b60015460009081908190600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611dc557600080fd5b5af11515611dd257600080fd5b5050506040518051905060ff16925082600a0a850291508484029050611e0381600854611f2790919063ffffffff16565b600855600954611e19908363ffffffff611f2716565b600955600160a060020a0386166000908152600d6020526040902054611e45908363ffffffff611f2716565b600160a060020a0387166000908152600d6020908152604080832093909355600c90522054611e7a908263ffffffff611f2716565b600160a060020a0387166000908152600c6020526040902055611e9e86828461202a565b505050505050565b60005460a060020a900460ff1690565b60ff8216600090815260208490526040902054429011611ed557600080fd5b60ff9091166000908152602092909252604090912055565b60ff8216600090815260208490526040902054429011611f0c57600080fd5b60ff9091166000908152602092909252604090912060010155565b600082820183811015611f3657fe5b9392505050565b60008054819060a060020a900460ff1615611f5757600080fd5b6fffffffffffffffffffffffffffffffff83161515611f7557600080fd5b349150611f81826120f7565b9050611f8c81612129565b1515611f9757600080fd5b611fa2828285612174565b61153f33838361202a565b600019850160ff8116600090815260208890526040902054859010611fd157600080fd5b5060ff948516600090815260208790526040812094855560018086019490945560028501556003840191909155600490920191909155918201805460ff198116908316909301909116919091179055565b600354421190565b600154600160a060020a03166340c10f19848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561208057600080fd5b5af1151561208d57600080fd5b505050604051805190505082600160a060020a031633600160a060020a03167efe0e12b43090c1fc19a34aefa5cc138a4eeafc60ab800f855c730b3fb9480e84844260405180848152602001838152602001828152602001935050505060405180910390a3505050565b6000806000612104611b14565b915061210f82611ae7565b9050612121848263ffffffff6122b716565b949350505050565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114156121595750600161215d565b5060005b612166836122ce565b8015611f3657501592915050565b600160a060020a0333166000908152600b602052604081205461219d908563ffffffff611f2716565b600160a060020a0333166000908152600b6020908152604080832093909355600d905220546121d2908463ffffffff611f2716565b600160a060020a0333166000908152600d60209081526040808320939093556fffffffffffffffffffffffffffffffff85168252600a9052205461221c908563ffffffff611f2716565b6fffffffffffffffffffffffffffffffff83166000908152600a6020526040902055600754612251908563ffffffff611f2716565b600755600954612267908463ffffffff611f2716565b600955612272611b14565b60ff811660009081526012602052604090206002015490915061229b908463ffffffff611f2716565b60ff909116600090815260126020526040902060020155505050565b60008082848115156122c557fe5b04949350505050565b600080806122da611b14565b90506122ee6012828663ffffffff61232916565b801561230757506123076012828663ffffffff61235816565b1561231157600191505b61231a846123b6565b80156121215750909392505050565b60ff821660009081526020849052604081206003015482101561234e57506000611f36565b5060019392505050565b60ff82166000908152602084905260408120600201548190612380908463ffffffff611f2716565b60ff85166000908152602087905260409020600401549091508111156123a957600091506123ae565b600191505b509392505050565b600080600f546123d184600954611f2790919063ffffffff16565b111590506123de836123eb565b8015611f36575092915050565b6000806000600254421015801561240457506003544211155b915050341515818015612121575093925050505600a165627a7a72305820c79d86a5bb04977f88ff03df265432d906df72c3ba4cb77d280e71bef8c565190029000000000000000000000000000000000000000000000000000000005ad4c880000000000000000000000000000000000000000000000000000000005b1e9c8000000000000000000000000000000000000000000000000000000002540be40000000000000000000000000034858c5a5759bfdb47edcaa944bf7f26413968d4000000000000000000000000dc10f70413479fa6527a671b3a94486eb03b7772000000000000000000000000bfea5adf3943355f92424c96e9731ffcc4b726110000000000000000000000009b2483e25b80405087b857b083cfa8838a446f7e0000000000000000000000003ee655f28abc26ee5ea9d2406e386d22982659f8000000000000000000000000000000000000000000000000000000174876e8000000000000000000000000000000000000000000000000000000020566c3ccc0000000000000000000000000cd4b4b0f3284a33ac49c67961ec6e111708318cf

Deployed Bytecode

0x6060604052600436106102425763ffffffff60e060020a600035041663046dc166811461024757806315a5d9d8146102685780631f1307611461029757806326654d57146102bc57806326ce3da0146102e75780632c4e722e146102fa5780633197cbb61461030d57806338af3eed146103205780633c20d1a5146103335780633f4dd2681461034c5780634042b66f146103655780634413a6881461037857806347d203731461038b578063521eb273146103b4578063537df3b6146103c75780635b7633d0146103e65780635edca2b4146103f957806368ec0d991461040c578063693e22791461042b57806370a082311461043e57806373752db41461045d578063756a288e146104fc57806378e97925146105155780637c6bd96d146105285780637db71fc41461053e57806388426aec146105665780638da5cb5b1461057f578063906a26e01461059257806391778b9c146105a55780639944d5e7146105c1578063b0891f4f146105d4578063b51459fe146105e7578063b9b8af0b1461060e578063bcdea6f914610621578063bdd304061461063a578063c033a4901461064d578063c80ec5221461066c578063c8e569a81461067f578063d7c7159c14610692578063dfc6fbaa146106e8578063e42c08f214610707578063e6ca0f4714610726578063ecb70fb714610739578063f2fde38b1461074c578063f7c00e2f1461076b578063f9f92be41461077e578063fb0cf7ab1461079d578063fb86a404146107b6578063fc0c546a146107c9578063fcaa7664146107dc575b600080fd5b341561025257600080fd5b610266600160a060020a03600435166107ef565b005b341561027357600080fd5b61027b61088e565b604051600160a060020a03909116815260200160405180910390f35b34156102a257600080fd5b6102aa61089d565b60405190815260200160405180910390f35b34156102c757600080fd5b610266600160a060020a03600435166024356044356064356084356108a3565b34156102f257600080fd5b610266610a8c565b341561030557600080fd5b6102aa610b6e565b341561031857600080fd5b6102aa610b74565b341561032b57600080fd5b61027b610b7a565b341561033e57600080fd5b6102aa60ff60043516610b8e565b341561035757600080fd5b610266600435602435610ba6565b341561037057600080fd5b6102aa610cc6565b341561038357600080fd5b610266610ccc565b341561039657600080fd5b61039e610d63565b60405160ff909116815260200160405180910390f35b34156103bf57600080fd5b61027b610d6c565b34156103d257600080fd5b610266600160a060020a0360043516610d7b565b34156103f157600080fd5b61027b610e2a565b341561040457600080fd5b610266610e39565b341561041757600080fd5b6102aa600160a060020a0360043516610f53565b341561043657600080fd5b6102aa610f65565b341561044957600080fd5b6102aa600160a060020a0360043516610f6b565b341561046857600080fd5b6104ae60046024813581810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610f7d95505050505050565b604051600160a060020a0390941684526fffffffffffffffffffffffffffffffff909216602084015263ffffffff908116604080850191909152911660608301526080909101905180910390f35b341561050757600080fd5b6102aa60ff60043516611309565b341561052057600080fd5b6102aa611321565b341561053357600080fd5b610266600435611327565b341561054957600080fd5b6102aa6fffffffffffffffffffffffffffffffff60043516611412565b341561057157600080fd5b6102aa60ff60043516611424565b341561058a57600080fd5b61027b611439565b341561059d57600080fd5b6102aa611448565b34156105b057600080fd5b61026660ff6004351660243561144e565b34156105cc57600080fd5b6102aa6114d2565b34156105df57600080fd5b6102666114d8565b34156105f257600080fd5b6105fa611544565b604051901515815260200160405180910390f35b341561061957600080fd5b6105fa61154d565b341561062c57600080fd5b6102aa60ff6004351661155d565b341561064557600080fd5b610266611575565b341561065857600080fd5b6105fa600160a060020a036004351661169e565b341561067757600080fd5b6102aa6116b3565b341561068a57600080fd5b6102666116b9565b61026660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496505060ff853516946020810135945060400135925061173e915050565b34156106f357600080fd5b6102aa600160a060020a03600435166118cb565b341561071257600080fd5b6102aa600160a060020a03600435166118dd565b341561073157600080fd5b6102666118ef565b341561074457600080fd5b6105fa611a0f565b341561075757600080fd5b610266600160a060020a0360043516611a31565b341561077657600080fd5b6102aa611acc565b341561078957600080fd5b6105fa600160a060020a0360043516611ad2565b34156107a857600080fd5b6102aa60ff60043516611ae7565b34156107c157600080fd5b6102aa611aff565b34156107d457600080fd5b61027b611b05565b34156107e757600080fd5b61039e611b14565b60005433600160a060020a0390811691161461080a57600080fd5b600160a060020a038116151561081f57600080fd5b6019805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290557f5719a5656c5cfdaafa148ecf366fd3b0a7fae06449ce2a46225977fb7417e29d9116604051600160a060020a03909116815260200160405180910390a150565b600554600160a060020a031681565b60095481565b60008054819033600160a060020a039081169116146108c157600080fd5b600160a060020a0387166000908152600b6020526040812054116108e457600080fd5b5050600160a060020a0385166000908152600b602090815260408083208054600d8452828520805492869055859055601a9093529220819055600754909190610933908363ffffffff611b8116565b600755600954610949908263ffffffff611b8116565b600955600154600160a060020a0316632a724f2a8860405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561099c57600080fd5b5af115156109a957600080fd5b505050600160a060020a0387166000908152601c602052604090819020805460ff191660011790557fc11da825993c0394a75762588c54907093a1361e6d6cb67950b28ba0010b8f39908890429051600160a060020a03909216825260208201526040908101905180910390a1610a2a60128787878763ffffffff611b9316565b7fa06cc0a3867aea08c9e799994171a2eaa01b0db6891bff21ff54cc2639d3e6788782426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150505050505050565b600160a060020a0333166000908152601a6020526040812054819011610ab157600080fd5b600160a060020a0333166000908152601b602052604090205460ff1615610ad757600080fd5b50600160a060020a0333166000818152601a602090815260408083208054939055601b90915290919082156108fc0290839051600060405180830381858888f193505050501515610b2757600080fd5b7f1e62ddfe8c731f66f6b6294434d45407c080972bd05b50d1745257de2220a4e43342604051600160a060020a03909216825260208201526040908101905180910390a150565b60065481565b60035481565b6011546101009004600160a060020a031681565b60ff1660009081526012602052604090206004015490565b60005433600160a060020a03908116911614610bc157600080fd5b6000821180610bd35750600f54600954145b1515610bde57600080fd5b6000811180610bf05750600f54600954145b1515610bfb57600080fd5b610c058282611c6a565b600154600160a060020a0316635f412d4f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610c4457600080fd5b5af11515610c5157600080fd5b50506011805460ff19166001179055507f8b81fe67377346f7a0a4a369e94f00c5ae54efa1ff15df40b4d54554e164525a334284846040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15050565b60075481565b60005433600160a060020a03908116911614610ce757600080fd5b60145460ff168015610cf857600080fd5b601654610d1790600160a060020a0316621312d06402540be400611d7f565b601454610d3890620100009004600160a060020a0316621b20716000611d7f565b601554610d5390600160a060020a03166206c81d6000611d7f565b506014805460ff19166001179055565b60135460ff1681565b600454600160a060020a031681565b60005433600160a060020a03908116911614610d9657600080fd5b600160a060020a0381166000908152601c602052604090205460ff161515600114610dc057600080fd5b600160a060020a0381166000908152601c602052604090819020805460ff191690557fa231666d2d1aeb79bb1f0db1a8c9bfc28af2eed3f0a9b68ed157c46ba782c3eb908290429051600160a060020a03909216825260208201526040908101905180910390a150565b601954600160a060020a031681565b600160a060020a0333166000908152600b6020526040812054819011610e5e57600080fd5b610e66611a0f565b8015610e755750600e54600954105b80610e835750610e83611ea6565b1515610e8e57600080fd5b50600160a060020a0333166000818152600b6020526040808220805492905590919082156108fc0290839051600060405180830381858888f193505050501515610ed757600080fd5b600160a060020a0333166000908152600b602052604090205415610ef757fe5b7f399cf6f6b4834b62adc1e73a85b69f3eea1c55f32d09057693655aab33e8b5423382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b601a6020526000908152604090205481565b60185481565b600b6020526000908152604090205481565b600080808080808080730838ae8262bdc0779cbfbeef8811f2abf51c1c7a63b655e1388a836040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610ff7578082015183820152602001610fdf565b50505050905090810190601f1680156110245780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b151561104157600080fd5b5af4151561104e57600080fd5b50505060405180519450730838ae8262bdc0779cbfbeef8811f2abf51c1c7a90506316419aa78a60146040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156110cc5780820151838201526020016110b4565b50505050905090810190601f1680156110f95780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b151561111657600080fd5b5af4151561112357600080fd5b505050604051805170010000000000000000000000000000000090049350730838ae8262bdc0779cbfbeef8811f2abf51c1c7a905063d54dd8f98a60246040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111b557808201518382015260200161119d565b50505050905090810190601f1680156111e25780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15156111ff57600080fd5b5af4151561120c57600080fd5b505050604051805160e060020a90049250730838ae8262bdc0779cbfbeef8811f2abf51c1c7a905063d54dd8f98a60286040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611291578082015183820152602001611279565b50505050905090810190601f1680156112be5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15156112db57600080fd5b5af415156112e857600080fd5b5050506040518051949a9399509197505060e060020a909204945092505050565b60ff1660009081526012602052604090206002015490565b60025481565b6000805481908190819033600160a060020a0390811691161461134957600080fd5b600254851161135757600080fd5b42851161136357600080fd5b600254421061137157600080fd5b60028054908690556003805482880390810190915594509250600091505b60048260ff1610156113d1575060ff81166000908152601260208190526040909120548401906113c690838363ffffffff611eb616565b60019091019061138f565b7fb03c6e4d98649731c861f3ac1560370eb9b13fe3950dbe318f413df44aecc1fd838660405191825260208201526040908101905180910390a15050505050565b600a6020526000908152604090205481565b60ff1660009081526012602052604090205490565b600054600160a060020a031681565b600e5481565b60005433600160a060020a0390811691161461146957600080fd5b61147b6012838363ffffffff611eed16565b7f3c943c1401d461f1e9a9793a341ba4f600dc3643686cb337621026d523049715338383604051600160a060020a03909316835260ff90911660208301526040808301919091526060909101905180910390a15050565b60175481565b60005433600160a060020a039081169116146114f357600080fd5b600154600160a060020a0316633e96d28e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561153257600080fd5b5af1151561153f57600080fd5b505050565b60115460ff1681565b60005460a060020a900460ff1681565b60ff1660009081526012602052604090206003015490565b6000805433600160a060020a0390811691161461159157600080fd5b60005460a060020a900460ff16156115a857600080fd5b6115b0611a0f565b15156115bb57600080fd5b60115460ff1615156115cc57600080fd5b600e54600954116115dc57600080fd5b6010546007546115f19163ffffffff611b8116565b601054909150611607908263ffffffff611f2716565b6010556011546101009004600160a060020a03166108fc82150282604051600060405180830381858888f19350505050151561164257600080fd5b7f9f7cbddba892cf26a7cd63d61d3c8d085df04bbbe7601e53311038ca6dab196b3382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b601b6020526000908152604090205460ff1681565b60105481565b60005433600160a060020a039081169116146116d457600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f4898556e3bd8b06263e50e938f30f736c1fd2030390474dd6bc0b28d8c5450373342604051600160a060020a03909216825260208201526040908101905180910390a1565b60008060008060008060008060028c6040518082805190602001908083835b6020831061177c5780518252601f19909201916020918201910161175d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506020604051808303816000865af115156117ba57600080fd5b50506040518051905097506117ce8c610f7d565b601954939a5091985096509450600160a060020a03166001898d8d8d6040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af1151561183c57600080fd5b505060206040510351600160a060020a03161461185857600080fd5b33600160a060020a031687600160a060020a031614151561187857600080fd5b503491505063ffffffff808316908416670de0b6b3a76400008202831061189e57600080fd5b670de0b6b3a7640000810283116118b457600080fd5b6118bd86611f3d565b505050505050505050505050565b600c6020526000908152604090205481565b600d6020526000908152604090205481565b60005433600160a060020a0390811691161461190a57600080fd5b601454610100900460ff16801561192057600080fd5b61195c600161193d62093a80600254611f2790919063ffffffff16565b601291906402540be400629896806428bed0160063ffffffff611fad16565b611998600261197962127500600254611f2790919063ffffffff16565b6012919064028fa6ae00624c4b406445d964b80063ffffffff611fad16565b6119d460036119b56224ea00600254611f2790919063ffffffff16565b601291906402cb417800622625a06485e0abb60063ffffffff611fad16565b6003546119fd9060129060049064037e11d600620f42406501d1a94a200063ffffffff611fad16565b506014805461ff001916610100179055565b600f54600954600091901015611a23612022565b80611a2b5750805b91505090565b60005433600160a060020a03908116911614611a4c57600080fd5b600160a060020a0381161515611a6157600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60085481565b601c6020526000908152604090205460ff1681565b60ff1660009081526012602052604090206001015490565b600f5481565b600154600160a060020a031681565b600073b555eb5b08cd524bd8f5fe82ed514f752a885e2963922d38be601260405160e060020a63ffffffff8416028152600481019190915260240160206040518083038186803b1515611b6657600080fd5b5af41515611b7357600080fd5b505050604051805191505090565b600082821115611b8d57fe5b50900390565b6001600090815260208690526040902060020154611bb7908563ffffffff611b8116565b600160009081526020879052604080822060029081019390935582825290200154611be8908463ffffffff611b8116565b600260008181526020889052604080822083019390935560038152919091200154611c19908363ffffffff611b8116565b60036000908152602087905260408082206002908101939093556004825290200154611c4b908263ffffffff611b8116565b6004600090815260209690965260409095206002019490945550505050565b642964606ca08110611c7b57600080fd5b640a591940208210611c8c57600080fd5b60188190556017829055600154601454600160a060020a039182169163fb920ad191620100009004168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611cf957600080fd5b5af11515611d0657600080fd5b5050600154601554601754600160a060020a03928316935063fb920ad1929091169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611d6b57600080fd5b5af11515611d7857600080fd5b5050505050565b60015460009081908190600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611dc557600080fd5b5af11515611dd257600080fd5b5050506040518051905060ff16925082600a0a850291508484029050611e0381600854611f2790919063ffffffff16565b600855600954611e19908363ffffffff611f2716565b600955600160a060020a0386166000908152600d6020526040902054611e45908363ffffffff611f2716565b600160a060020a0387166000908152600d6020908152604080832093909355600c90522054611e7a908263ffffffff611f2716565b600160a060020a0387166000908152600c6020526040902055611e9e86828461202a565b505050505050565b60005460a060020a900460ff1690565b60ff8216600090815260208490526040902054429011611ed557600080fd5b60ff9091166000908152602092909252604090912055565b60ff8216600090815260208490526040902054429011611f0c57600080fd5b60ff9091166000908152602092909252604090912060010155565b600082820183811015611f3657fe5b9392505050565b60008054819060a060020a900460ff1615611f5757600080fd5b6fffffffffffffffffffffffffffffffff83161515611f7557600080fd5b349150611f81826120f7565b9050611f8c81612129565b1515611f9757600080fd5b611fa2828285612174565b61153f33838361202a565b600019850160ff8116600090815260208890526040902054859010611fd157600080fd5b5060ff948516600090815260208790526040812094855560018086019490945560028501556003840191909155600490920191909155918201805460ff198116908316909301909116919091179055565b600354421190565b600154600160a060020a03166340c10f19848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561208057600080fd5b5af1151561208d57600080fd5b505050604051805190505082600160a060020a031633600160a060020a03167efe0e12b43090c1fc19a34aefa5cc138a4eeafc60ab800f855c730b3fb9480e84844260405180848152602001838152602001828152602001935050505060405180910390a3505050565b6000806000612104611b14565b915061210f82611ae7565b9050612121848263ffffffff6122b716565b949350505050565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114156121595750600161215d565b5060005b612166836122ce565b8015611f3657501592915050565b600160a060020a0333166000908152600b602052604081205461219d908563ffffffff611f2716565b600160a060020a0333166000908152600b6020908152604080832093909355600d905220546121d2908463ffffffff611f2716565b600160a060020a0333166000908152600d60209081526040808320939093556fffffffffffffffffffffffffffffffff85168252600a9052205461221c908563ffffffff611f2716565b6fffffffffffffffffffffffffffffffff83166000908152600a6020526040902055600754612251908563ffffffff611f2716565b600755600954612267908463ffffffff611f2716565b600955612272611b14565b60ff811660009081526012602052604090206002015490915061229b908463ffffffff611f2716565b60ff909116600090815260126020526040902060020155505050565b60008082848115156122c557fe5b04949350505050565b600080806122da611b14565b90506122ee6012828663ffffffff61232916565b801561230757506123076012828663ffffffff61235816565b1561231157600191505b61231a846123b6565b80156121215750909392505050565b60ff821660009081526020849052604081206003015482101561234e57506000611f36565b5060019392505050565b60ff82166000908152602084905260408120600201548190612380908463ffffffff611f2716565b60ff85166000908152602087905260409020600401549091508111156123a957600091506123ae565b600191505b509392505050565b600080600f546123d184600954611f2790919063ffffffff16565b111590506123de836123eb565b8015611f36575092915050565b6000806000600254421015801561240457506003544211155b915050341515818015612121575093925050505600a165627a7a72305820c79d86a5bb04977f88ff03df265432d906df72c3ba4cb77d280e71bef8c565190029

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

000000000000000000000000000000000000000000000000000000005ad4c880000000000000000000000000000000000000000000000000000000005b1e9c8000000000000000000000000000000000000000000000000000000002540be40000000000000000000000000034858c5a5759bfdb47edcaa944bf7f26413968d4000000000000000000000000dc10f70413479fa6527a671b3a94486eb03b7772000000000000000000000000bfea5adf3943355f92424c96e9731ffcc4b726110000000000000000000000009b2483e25b80405087b857b083cfa8838a446f7e0000000000000000000000003ee655f28abc26ee5ea9d2406e386d22982659f8000000000000000000000000000000000000000000000000000000174876e8000000000000000000000000000000000000000000000000000000020566c3ccc0000000000000000000000000cd4b4b0f3284a33ac49c67961ec6e111708318cf

-----Decoded View---------------
Arg [0] : _startTime (uint256): 1523894400
Arg [1] : _endTime (uint256): 1528732800
Arg [2] : _rate (uint256): 10000000000
Arg [3] : _wallet (address): 0x34858C5A5759bFDb47EdCaA944bF7f26413968D4
Arg [4] : _beneficiary (address): 0xdC10F70413479FA6527A671b3A94486Eb03B7772
Arg [5] : _buyer (address): 0xbfEa5aDF3943355f92424C96E9731FfCC4B72611
Arg [6] : _founders (address): 0x9b2483E25b80405087B857b083Cfa8838A446f7e
Arg [7] : _bounty (address): 0x3eE655f28ABC26eE5ea9d2406e386d22982659f8
Arg [8] : _softCap (uint256): 100000000000
Arg [9] : _hardCap (uint256): 2222222200000
Arg [10] : _token (address): 0xCd4b4b0F3284a33AC49C67961EC6e111708318Cf

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000005ad4c880
Arg [1] : 000000000000000000000000000000000000000000000000000000005b1e9c80
Arg [2] : 00000000000000000000000000000000000000000000000000000002540be400
Arg [3] : 00000000000000000000000034858c5a5759bfdb47edcaa944bf7f26413968d4
Arg [4] : 000000000000000000000000dc10f70413479fa6527a671b3a94486eb03b7772
Arg [5] : 000000000000000000000000bfea5adf3943355f92424c96e9731ffcc4b72611
Arg [6] : 0000000000000000000000009b2483e25b80405087b857b083cfa8838a446f7e
Arg [7] : 0000000000000000000000003ee655f28abc26ee5ea9d2406e386d22982659f8
Arg [8] : 000000000000000000000000000000000000000000000000000000174876e800
Arg [9] : 0000000000000000000000000000000000000000000000000000020566c3ccc0
Arg [10] : 000000000000000000000000cd4b4b0f3284a33ac49c67961ec6e111708318cf


Libraries Used

BytesDeserializer : 0x0838ae8262bdc0779cbfbeef8811f2abf51c1c7aUnverified

Swarm Source

bzzr://c79d86a5bb04977f88ff03df265432d906df72c3ba4cb77d280e71bef8c56519

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.