Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 5 from a total of 5 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Change Rate | 6408326 | 2739 days ago | IN | 0 ETH | 0.00122909 | ||||
| Change Dates | 6245586 | 2766 days ago | IN | 0 ETH | 0.0014409 | ||||
| Mint And Create ... | 5577264 | 2881 days ago | IN | 0 ETH | 0.01204705 | ||||
| Transfer Owner S... | 5577244 | 2881 days ago | IN | 0 ETH | 0.00059672 | ||||
| Init Ico Control... | 5577172 | 2881 days ago | IN | 0 ETH | 0.00477333 |
Latest 3 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 5577264 | 2881 days ago | Contract Creation | 0 ETH | |||
| Transfer | 5577172 | 2881 days ago | Contract Creation | 0 ETH | |||
| Transfer | 5577172 | 2881 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
IcoController
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-05-08
*/
pragma solidity ^0.4.21;
// File: contracts/math/SafeMath.sol
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
// File: contracts/token/ERC20Basic.sol
/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/179
*/
contract ERC20Basic {
uint256 public totalSupply;
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
// File: contracts/token/BasicToken.sol
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
}
// File: contracts/token/BurnableToken.sol
/**
* @title Burnable Token
* @dev Token that can be irreversibly burned (destroyed).
*/
contract BurnableToken is BasicToken {
event Burn(address indexed burner, uint256 value);
/**
* @dev Burns a specific amount of tokens.
* @param _value The amount of token to be burned.
*/
function burn(uint256 _value) public {
require(_value <= balances[msg.sender]);
// no need to require value <= totalSupply, since that would imply the
// sender's balance is greater than the totalSupply, which *should* be an assertion failure
address burner = msg.sender;
balances[burner] = balances[burner].sub(_value);
totalSupply = totalSupply.sub(_value);
emit Burn(burner, _value);
}
}
// File: contracts/ownership/Ownable.sol
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
// File: contracts/token/ERC20.sol
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/token/StandardToken.sol
/**
* @title Standard ERC20 token
*
* @dev Implementation of the basic standard token.
* @dev https://github.com/ethereum/EIPs/issues/20
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
*/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
*/
function decreaseApproval(address _spender, 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);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
// File: contracts/token/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
*/
contract MintableToken is StandardToken, Ownable {
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);
emit Mint(_to, _amount);
emit Transfer(address(0), _to, _amount);
return true;
}
/**
* @dev Function to stop minting new tokens.
* @return True if the operation was successful.
*/
function finishMinting() onlyOwner canMint public returns (bool) {
mintingFinished = true;
emit MintFinished();
return true;
}
}
// File: contracts/token/SafeERC20.sol
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
assert(token.transfer(to, value));
}
function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
assert(token.transferFrom(from, to, value));
}
function safeApprove(ERC20 token, address spender, uint256 value) internal {
assert(token.approve(spender, value));
}
}
// File: contracts/BitexToken.sol
contract BitexToken is MintableToken, BurnableToken {
using SafeERC20 for ERC20;
string public constant name = "Bitex Coin";
string public constant symbol = "XBX";
uint8 public decimals = 18;
bool public tradingStarted = false;
// allow exceptional transfer fro sender address - this mapping can be modified only before the starting rounds
mapping (address => bool) public transferable;
/**
* @dev modifier that throws if spender address is not allowed to transfer
* and the trading is not enabled
*/
modifier allowTransfer(address _spender) {
require(tradingStarted || transferable[_spender]);
_;
}
/**
*
* Only the owner of the token smart contract can add allow token to be transfer before the trading has started
*
*/
function modifyTransferableHash(address _spender, bool value) onlyOwner public {
transferable[_spender] = value;
}
/**
* @dev Allows the owner to enable the trading.
*/
function startTrading() onlyOwner public {
tradingStarted = true;
}
/**
* @dev Allows anyone to transfer the tokens once trading has started
* @param _to the recipient address of the tokens.
* @param _value number of tokens to be transfered.
*/
function transfer(address _to, uint _value) allowTransfer(msg.sender) public returns (bool){
return super.transfer(_to, _value);
}
/**
* @dev Allows anyone to transfer the tokens once trading has started or if the spender is part of the mapping
* @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 uint the amout of tokens to be transfered
*/
function transferFrom(address _from, address _to, uint _value) allowTransfer(_from) public returns (bool){
return super.transferFrom(_from, _to, _value);
}
/**
* @dev Aprove the passed address to spend the specified amount of tokens on behalf of msg.sender when not paused.
* @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 allowTransfer(_spender) returns (bool) {
return super.approve(_spender, _value);
}
/**
* Adding whenNotPaused
*/
function increaseApproval(address _spender, uint _addedValue) public allowTransfer(_spender) returns (bool success) {
return super.increaseApproval(_spender, _addedValue);
}
/**
* Adding whenNotPaused
*/
function decreaseApproval(address _spender, uint _subtractedValue) public allowTransfer(_spender) returns (bool success) {
return super.decreaseApproval(_spender, _subtractedValue);
}
}
// File: contracts/KnowYourCustomer.sol
contract KnowYourCustomer is Ownable
{
//
// with this structure
//
struct Contributor {
// kyc cleared or not
bool cleared;
// % more for the contributor bring on board in 1/100 of %
// 2.51 % --> 251
// 100% --> 10000
uint16 contributor_get;
// eth address of the referer if any - the contributor address is the key of the hash
address ref;
// % more for the referrer
uint16 affiliate_get;
}
mapping (address => Contributor) public whitelist;
//address[] public whitelistArray;
/**
* @dev Populate the whitelist, only executed by whiteListingAdmin
* whiteListingAdmin /
*/
function setContributor(address _address, bool cleared, uint16 contributor_get, uint16 affiliate_get, address ref) onlyOwner public{
// not possible to give an exorbitant bonus to be more than 100% (100x100 = 10000)
require(contributor_get<10000);
require(affiliate_get<10000);
Contributor storage contributor = whitelist[_address];
contributor.cleared = cleared;
contributor.contributor_get = contributor_get;
contributor.ref = ref;
contributor.affiliate_get = affiliate_get;
}
function getContributor(address _address) view public returns (bool, uint16, address, uint16 ) {
return (whitelist[_address].cleared, whitelist[_address].contributor_get, whitelist[_address].ref, whitelist[_address].affiliate_get);
}
function getClearance(address _address) view public returns (bool) {
return whitelist[_address].cleared;
}
}
// File: contracts/crowdsale/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.
*/
contract Crowdsale {
using SafeMath for uint256;
// The token being sold
MintableToken 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;
// how many token units a buyer gets per wei
uint256 public rate;
// amount of raised money in wei
uint256 public weiRaised;
/**
* event for token purchase logging
* @param purchaser who paid for the tokens
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
*/
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) public {
require(_startTime >= now);
require(_endTime >= _startTime);
require(_rate > 0);
require(_wallet != address(0));
token = createTokenContract();
startTime = _startTime;
endTime = _endTime;
rate = _rate;
wallet = _wallet;
}
// creates the token to be sold.
// override this method to have crowdsale of a specific mintable token.
function createTokenContract() internal returns (MintableToken) {
return new MintableToken();
}
// fallback function can be used to buy tokens
function () external payable {
buyTokens(msg.sender);
}
// low level token purchase function
// overrided to create custom buy
function buyTokens(address beneficiary) public payable {
require(beneficiary != address(0));
require(validPurchase());
uint256 weiAmount = msg.value;
// calculate token amount to be created
uint256 tokens = weiAmount.mul(rate);
// update state
weiRaised = weiRaised.add(weiAmount);
token.mint(beneficiary, tokens);
emit TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
forwardFunds();
}
// send ether to the fund collection wallet
// overrided to create custom fund forwarding mechanisms
function forwardFunds() internal {
wallet.transfer(msg.value);
}
// @return true if the transaction can buy tokens
function validPurchase() 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/crowdsale/FinalizableCrowdsale.sol
/**
* @title FinalizableCrowdsale
* @dev Extension of Crowdsale where an owner can do extra work
* after finishing.
*/
contract FinalizableCrowdsale is Crowdsale, Ownable {
using SafeMath for uint256;
bool public isFinalized = false;
event Finalized();
/**
* @dev Must be called after crowdsale ends, to do some extra finalization
* work. Calls the contract's finalization function.
*/
function finalize() onlyOwner public {
require(!isFinalized);
require(hasEnded());
finalization();
emit Finalized();
isFinalized = true;
}
/**
* @dev Can be overridden to add finalization logic. The overriding function
* should call super.finalization() to ensure the chain of finalization is
* executed entirely.
*/
function finalization() internal{
}
}
// File: contracts/crowdsale/RefundVault.sol
/**
* @title RefundVault
* @dev This contract is used for storing funds while a crowdsale
* is in progress. Supports refunding the money if crowdsale fails,
* and forwarding it if crowdsale is successful.
*/
contract RefundVault is Ownable {
using SafeMath for uint256;
enum State { Active, Refunding, Closed }
mapping (address => uint256) public deposited;
address public wallet;
State public state;
event Closed();
event RefundsEnabled();
event Refunded(address indexed beneficiary, uint256 weiAmount);
function RefundVault(address _wallet) public {
require(_wallet != address(0));
wallet = _wallet;
state = State.Active;
}
function deposit(address investor) onlyOwner public payable {
require(state == State.Active);
deposited[investor] = deposited[investor].add(msg.value);
}
function close() onlyOwner public {
// this is this part that shall be removed, that way if called later it run the wallet transfer in any case
// require(state == State.Active);
state = State.Closed;
emit Closed();
wallet.transfer(address(this).balance);
}
function enableRefunds() onlyOwner public {
require(state == State.Active);
state = State.Refunding;
emit RefundsEnabled();
}
function refund(address investor) public {
require(state == State.Refunding);
uint256 depositedValue = deposited[investor];
deposited[investor] = 0;
investor.transfer(depositedValue);
emit Refunded(investor, depositedValue);
}
}
// File: contracts/crowdsale/RefundableCrowdsale.sol
/**
* @title RefundableCrowdsale
* @dev Extension of Crowdsale contract that adds a funding goal, and
* the possibility of users getting a refund if goal is not met.
* Uses a RefundVault as the crowdsale's vault.
*/
contract RefundableCrowdsale is FinalizableCrowdsale {
using SafeMath for uint256;
// minimum amount of funds to be raised in weis
uint256 public goal;
// refund vault used to hold funds while crowdsale is running
RefundVault public vault;
function RefundableCrowdsale(uint256 _goal) public {
require(_goal > 0);
vault = new RefundVault(wallet);
goal = _goal;
}
// We're overriding the fund forwarding from Crowdsale.
// In addition to sending the funds, we want to call
// the RefundVault deposit function
function forwardFunds() internal {
vault.deposit.value(msg.value)(msg.sender);
}
// if crowdsale is unsuccessful, investors can claim refunds here
function claimRefund() public {
require(isFinalized);
require(!goalReached());
vault.refund(msg.sender);
}
// vault finalization task, called when owner calls finalize()
function finalization() internal {
if (goalReached()) {
vault.close();
} else {
vault.enableRefunds();
}
super.finalization();
}
function goalReached() public view returns (bool) {
return weiRaised >= goal;
}
}
// File: contracts/BitexTokenCrowdSale.sol
contract BitexTokenCrowdSale is Crowdsale, RefundableCrowdsale {
using SafeMath for uint256;
// number of participants
uint256 public numberOfPurchasers = 0;
// maximum tokens that can be minted in this crowd sale - initialised later by the constructor
uint256 public maxTokenSupply = 0;
// amounts of tokens already minted at the begining of this crowd sale - initialised later by the constructor
uint256 public initialTokenAmount = 0;
// Minimum amount to been able to contribute - initialised later by the constructor
uint256 public minimumAmount = 0;
// to compute the bonus
bool public preICO;
// the token
BitexToken public token;
// the kyc and affiliation management
KnowYourCustomer public kyc;
// remaining token are sent to this address
address public walletRemaining;
// this is the owner of the token, when the finalize function is called
address public pendingOwner;
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount, uint256 rate, address indexed referral, uint256 referredBonus );
event TokenPurchaseAffiliate(address indexed ref, uint256 amount );
function BitexTokenCrowdSale(
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
uint256 _goal,
uint256 _minimumAmount,
uint256 _maxTokenSupply,
address _wallet,
BitexToken _token,
KnowYourCustomer _kyc,
bool _preICO,
address _walletRemaining,
address _pendingOwner
)
FinalizableCrowdsale()
RefundableCrowdsale(_goal)
Crowdsale(_startTime, _endTime, _rate, _wallet) public
{
require(_minimumAmount >= 0);
require(_maxTokenSupply > 0);
require(_walletRemaining != address(0));
minimumAmount = _minimumAmount;
maxTokenSupply = _maxTokenSupply;
preICO = _preICO;
walletRemaining = _walletRemaining;
pendingOwner = _pendingOwner;
kyc = _kyc;
token = _token;
//
// record the amount of already minted token to been able to compute the delta with the tokens
// minted during the pre sale, this is useful only for the pre - ico
//
if (preICO)
{
initialTokenAmount = token.totalSupply();
}
}
/**
*
* Create the token on the fly, owner is the contract, not the contract owner yet
*
**/
function createTokenContract() internal returns (MintableToken) {
return token;
}
/**
* @dev Calculates the amount of coins the buyer gets
* @param weiAmount uint the amount of wei send to the contract
* @return uint the amount of tokens the buyer gets
*/
function computeTokenWithBonus(uint256 weiAmount) public view returns(uint256) {
uint256 tokens_ = 0;
if (preICO)
{
if (weiAmount >= 50000 ether ) {
tokens_ = weiAmount.mul(34).div(100);
}
else if (weiAmount<50000 ether && weiAmount >= 10000 ether) {
tokens_ = weiAmount.mul(26).div(100);
} else if (weiAmount<10000 ether && weiAmount >= 5000 ether) {
tokens_ = weiAmount.mul(20).div(100);
} else if (weiAmount<5000 ether && weiAmount >= 1000 ether) {
tokens_ = weiAmount.mul(16).div(100);
}
}else{
if (weiAmount >= 50000 ether ) {
tokens_ = weiAmount.mul(17).div(100);
}
else if (weiAmount<50000 ether && weiAmount >= 10000 ether) {
tokens_ = weiAmount.mul(13).div(100);
} else if (weiAmount<10000 ether && weiAmount >= 5000 ether) {
tokens_ = weiAmount.mul(10).div(100);
} else if (weiAmount<5000 ether && weiAmount >= 1000 ether) {
tokens_ = weiAmount.mul(8).div(100);
}
}
return tokens_;
}
//
// override the claimRefund, so only user that have burn their token can claim for a refund
//
function claimRefund() public {
// get the number of token from this sender
uint256 tokenBalance = token.balanceOf(msg.sender);
// the refund can be run only if the tokens has been burn
require(tokenBalance == 0);
// run the refund
super.claimRefund();
}
// transfer the token owner ship to the crowdsale contract
// token.transferOwnership(currentIco);
function finalization() internal {
if (!preICO)
{
uint256 remainingTokens = maxTokenSupply.sub(token.totalSupply());
// mint the remaining amount and assign them to the beneficiary
// --> here we can manage the vesting of the remaining tokens
//
token.mint(walletRemaining, remainingTokens);
}
// finalize the refundable inherited contract
super.finalization();
if (!preICO)
{
// no more minting allowed - immutable
token.finishMinting();
}
// transfer the token owner ship from the contract address to the pendingOwner icoController
token.transferOwnership(pendingOwner);
}
// low level token purchase function
function buyTokens(address beneficiary) public payable {
require(beneficiary != address(0));
require(validPurchase());
// validate KYC here
// if not part of kyc then throw
bool cleared;
uint16 contributor_get;
address ref;
uint16 affiliate_get;
(cleared,contributor_get,ref,affiliate_get) = kyc.getContributor(beneficiary);
// Transaction do not happen if the contributor is not KYC cleared
require(cleared);
// how much the contributor sent in wei
uint256 weiAmount = msg.value;
// Compute the number of tokens per wei using the rate
uint256 tokens = weiAmount.mul(rate);
// compute the amount of bonus, from the contribution amount
uint256 bonus = computeTokenWithBonus(tokens);
// compute the amount of token bonus for the contributor thank to his referral
uint256 contributorGet = tokens.mul(contributor_get).div(100*100);
// Sum it all
tokens = tokens.add(bonus);
tokens = tokens.add(contributorGet);
// capped to a maxTokenSupply
// make sure we can not mint more token than expected
// require(((token.totalSupply()-initialTokenAmount) + tokens) <= maxTokenSupply);
require((minted().add(tokens)) <= maxTokenSupply);
// Mint the token
token.mint(beneficiary, tokens);
// log the event
emit TokenPurchase(msg.sender, beneficiary, weiAmount, tokens, rate, ref, contributorGet);
// update wei raised and number of purchasers
weiRaised = weiRaised.add(weiAmount);
numberOfPurchasers = numberOfPurchasers + 1;
forwardFunds();
// ------------------------------------------------------------------
// compute the amount of token bonus that the referral get :
// only if KYC cleared, only if enough tokens still available
// ------------------------------------------------------------------
bool refCleared;
(refCleared) = kyc.getClearance(ref);
if (refCleared && ref != beneficiary)
{
// recompute the tokens amount using only the rate
tokens = weiAmount.mul(rate);
// compute the amount of token for the affiliate
uint256 affiliateGet = tokens.mul(affiliate_get).div(100*100);
// capped to a maxTokenSupply
// make sure we can not mint more token than expected
// we do not throw here as if this edge case happens it can be dealt with of chain
// if ( (token.totalSupply()-initialTokenAmount) + affiliateGet <= maxTokenSupply)
if ( minted().add(affiliateGet) <= maxTokenSupply)
{
// Mint the token
token.mint(ref, affiliateGet);
emit TokenPurchaseAffiliate(ref, tokens );
}
}
}
// overriding Crowdsale#validPurchase to add extra cap logic
// @return true if investors can buy at the moment
function validPurchase() internal view returns (bool) {
// make sure we accept only the minimum contribution
bool minAmount = (msg.value >= minimumAmount);
// make sure that the purchase follow each rules to be valid
return super.validPurchase() && minAmount;
}
function minted() public view returns(uint256)
{
return token.totalSupply().sub(initialTokenAmount);
}
// overriding Crowdsale#hasEnded to add cap logic
// @return true if crowdsale event has ended
function hasEnded() public view returns (bool) {
// bool capReached = (token.totalSupply() - initialTokenAmount) >= maxTokenSupply;
// bool capReached = minted() >= maxTokenSupply;
return super.hasEnded() || (minted() >= maxTokenSupply);
}
/**
*
* Admin functions only executed by owner:
* Can change minimum amount
*
*/
function changeMinimumAmount(uint256 _minimumAmount) onlyOwner public {
require(_minimumAmount > 0);
minimumAmount = _minimumAmount;
}
/**
*
* Admin functions only executed by owner:
* Can change rate
*
* We do not use an oracle here as oracle need to be paid each time, and if the oracle is not responding
* or hacked the rate could be detrimentally modified from an contributor perspective.
*
*/
function changeRate(uint256 _rate) onlyOwner public {
require(_rate > 0);
rate = _rate;
}
/**
*
* Admin functions only called by owner:
* Can change events dates
*
*/
function changeDates(uint256 _startTime, uint256 _endTime) onlyOwner public {
require(_startTime >= now);
require(_endTime >= _startTime);
startTime = _startTime;
endTime = _endTime;
}
function modifyTransferableHash(address _spender, bool value) onlyOwner public {
token.modifyTransferableHash(_spender,value);
}
/**
*
* Admin functions only called by owner:
* Can transfer the owner ship of the vault, so a close can be called
* only by the owner ....
*
*/
function transferVault(address newOwner) onlyOwner public {
vault.transferOwnership(newOwner);
}
}
// File: contracts/IcoController.sol
contract IcoController is Ownable {
// ico phase : prepare / rounds
//enum State {CHANGEOWNER, PRESALE, PRE_ICO, ICO, TRADING}
// 0 - CHANGEOWNER
// 1 - PRESALE
// 2 - PRE_ICO
//State public state = 0;
uint8 public statePhase = 0;
// Pending owner
address public pendingOwner;
// white list admin
address public whiteListingAdmin;
// The token being sold
BitexToken public token;
// The pre ICO
BitexTokenCrowdSale public preICO;
// the main ICO
BitexTokenCrowdSale public currentIco;
// Kyc and affiliate management
KnowYourCustomer public kyc;
// last round
bool public lastRound = false;
address public walletRemaining;
// maximum tokens that can be minted in all the crowd sales
uint256 public maxTokenSupply = 0;
uint256 public finalizePreIcoDate;
uint256 public finalizeIcoDate;
// first function to be called
function InitIcoController(address _pendingOwner) onlyOwner public{
// require(_pendingOwner != address(0));
pendingOwner = _pendingOwner;
token = new BitexToken();
kyc = new KnowYourCustomer();
}
/**
*
* Prepare the events
* - set the max_supply
* - set the wallet for the remaining amount
* - move to phase 1
*
* --> only if the pendingOwner has been set
*/
function prepare(uint256 _maxTokenSupply,address _walletRemaining,address _whiteListingAdmin) onlyOwner public{
// only during the prepare phase
require(statePhase == 0);
// transfer of Owner ship need to have been done
require(owner == pendingOwner);
// avoid mistake
// require(_maxTokenSupply>0);
// avoid mistake
// require(_walletRemaining != address(0));
maxTokenSupply = _maxTokenSupply;
walletRemaining = _walletRemaining;
whiteListingAdmin = _whiteListingAdmin;
statePhase = 1;
}
/**
Allow minting during the PRE SALE ico phase
*/
function mint(uint256 tokens,address beneficiary) onlyOwner public{
// only during the prepare phase, can not mint after
require(statePhase == 1);
// avoid mistake
// require(tokens > 0);
// require(beneficiary != address(0));
// cap crowdsaled to a maxTokenSupply
// make sure we can not mint more token than expected
bool lessThanMaxSupply = (token.totalSupply() + tokens) <= maxTokenSupply;
require(lessThanMaxSupply);
// mint the tokens
token.mint(beneficiary, tokens);
}
/**
Simplify creation for Bitex team
*/
function mintAndCreatePreIcoBitex(address _walletRemaining,address _teamWallet) onlyOwner public
{
prepare(300000000000000000000000000,_walletRemaining, 0x43bAD62A4aD94c31C659D21be3E3A33FFc97c909);
// mint 63M reserved
mint(63000000000000000000000000,0xB52c45b43B5c2dC6928149C54A05bA3A91542060);
// mint 27M team
mint(27000000000000000000000000,_teamWallet);
// create the pre ico
createPreIco(1525791600,
1527606000,
1000,
1000000000000000000000,
100000000000000000,
30000000000000000000000000,
0x1eF0cAD0E9A12cf39494e7D40643985538E7e963);
// enable transfer from, for the following wallets
modifyTransferableHash(_walletRemaining,true);
modifyTransferableHash(_teamWallet,true);
modifyTransferableHash(0xB52c45b43B5c2dC6928149C54A05bA3A91542060,true);
}
/**
*
* Setup a new ICO event
*
*/
function createPreIco(
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
uint256 _goal,
uint256 _minimumAmount,
uint256 _maxTokenForThisRound,
address _wallet
) onlyOwner public
{
// only before rounds
require(statePhase<=1);
// need to check that the max token supply constraint is respected
currentIco = new BitexTokenCrowdSale(
_startTime,
_endTime,
_rate,
_goal,
_minimumAmount,
_maxTokenForThisRound,
_wallet,
token,
kyc,
true,
walletRemaining,
address(this)
);
// // keep track of the preICO
preICO = currentIco;
// transfer the token owner ship to the crowdsale contract
token.transferOwnership(currentIco);
// only at the end in case of not enough gas
statePhase = 2;
}
/**
*
* Setup a new ICO event
*
*/
function createIco(
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
uint256 _goal,
uint256 _minimumAmount,
address _wallet) onlyOwner public
{
require(statePhase==2); // only after pre ico
// need to check that the max token supply constraint is respected
currentIco = new BitexTokenCrowdSale(
_startTime,
_endTime,
_rate,
_goal,
_minimumAmount,
maxTokenSupply,
_wallet,
token,
kyc,
false,
walletRemaining,
pendingOwner // transfer the ownership to the actual pending owner
);
// transfer the token owner ship to the crowdsale contract
token.transferOwnership(currentIco);
// only if successful until that point
statePhase = 3;
}
function finalizeIco() onlyOwner public
{
if (statePhase==2)
{
finalizePreIcoDate = now;
}else{
finalizeIcoDate = now;
}
currentIco.finalize();
}
/**
*
* Token functions
* can be called only during the prepare phase, because the owner change after this to be own by the crowdsale,
* so nobody can do anything on the token at all from the controller perpective once rounds are started
*/
function modifyTransferableHash(address _spender, bool value) onlyOwner public
{
// require(statePhase <=1 ); // only before rounds - not for bitex
// owner is the icoController
// during the presale the token is own by 'this' so we can call it directly
if (statePhase<=1)
{
token.modifyTransferableHash(_spender,value);
}else{
// during the crowdsale, it shall not be allowed
// but if it is needed by the project owner it can by calling the crowdsale object
// own by 'this'
currentIco.modifyTransferableHash(_spender, value);
}
}
/**
*
* Admin functions only executed by owner:
* Can change minimum amount
*
*/
function changeMinimumAmount(uint256 _minimumAmount) onlyOwner public {
// avoid mistake
// require(statePhase >=2 );
// require(_minimumAmount > 0);
currentIco.changeMinimumAmount(_minimumAmount);
}
/**
*
* Admin functions only executed by owner:
* Can change rate
*
* We do not use an oracle here as oracle need to be paid each time, and if the oracle is not responding
* or hacked the rate could be detrimentally modified from an contributor perspective.
*
*/
function changeRate(uint256 _rate) onlyOwner public {
// avoid mistake
// require(statePhase >=2 );
currentIco.changeRate(_rate);
}
/**
*
* Admin functions only called by owner:
* Can change events dates
*
*/
function changeDates(uint256 _startTime, uint256 _endTime) onlyOwner public {
// avoid mistake
// require(statePhase >=2 );
currentIco.changeDates(_startTime, _endTime);
}
/**
*
* Admin functions only executed by pendingOwner
* Change the owner of the crowdsale
* --> thiscall shall be possible 15 days after the end of each of the event, and each of them would need to be finalized
* that way contributor have the time to get their refunds if needed.
*/
function transferCrowdSale(bool preIco) onlyOwner public {
if (preIco)
{
require(finalizePreIcoDate!=0);
require(now>=(finalizePreIcoDate+30 days));
preICO.transferOwnership(owner);
kyc.transferOwnership(owner);
}else{
require(finalizeIcoDate!=0);
require(now>=finalizeIcoDate+30 days);
currentIco.transferOwnership(owner);
}
}
/**
*
* Only by the whitelist admin
*
*/
function setContributor(address _address, bool cleared, uint16 contributor_get, uint16 affiliate_get, address ref) public{
require(msg.sender == whiteListingAdmin);
// this call is done under the icoController address the real owner of the kyc. It ensure that only the icoController can call the kyc smart contract
// until the end of the event, where the ownership is transfered back to the pendingOwner
kyc.setContributor(_address, cleared, contributor_get, affiliate_get, ref);
}
/**
*
* Admin functions only executed by pendingOwner
* Change the owner
*
*/
function transferOwnerShipToPendingOwner() public {
// only the pending owner can change the ownership
require(msg.sender == pendingOwner);
// // can only be changed one time - no impact removed
// require(owner != pendingOwner);
// raise the event
emit OwnershipTransferred(owner, pendingOwner);
// change the ownership
owner = pendingOwner;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"cleared","type":"bool"},{"name":"contributor_get","type":"uint16"},{"name":"affiliate_get","type":"uint16"},{"name":"ref","type":"address"}],"name":"setContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"statePhase","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"value","type":"bool"}],"name":"modifyTransferableHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"}],"name":"changeDates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"preIco","type":"bool"}],"name":"transferCrowdSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalizeIcoDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentIco","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTokenSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_goal","type":"uint256"},{"name":"_minimumAmount","type":"uint256"},{"name":"_wallet","type":"address"}],"name":"createIco","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_walletRemaining","type":"address"},{"name":"_teamWallet","type":"address"}],"name":"mintAndCreatePreIcoBitex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"preICO","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"changeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minimumAmount","type":"uint256"}],"name":"changeMinimumAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastRound","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeIco","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyc","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"},{"name":"beneficiary","type":"address"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_goal","type":"uint256"},{"name":"_minimumAmount","type":"uint256"},{"name":"_maxTokenForThisRound","type":"uint256"},{"name":"_wallet","type":"address"}],"name":"createPreIco","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"walletRemaining","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whiteListingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pendingOwner","type":"address"}],"name":"InitIcoController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxTokenSupply","type":"uint256"},{"name":"_walletRemaining","type":"address"},{"name":"_whiteListingAdmin","type":"address"}],"name":"prepare","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"transferOwnerShipToPendingOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalizePreIcoDate","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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
6060604052600080546006805460a060020a60ff02191690556008829055600160a060020a033316600160a860020a03199091161790556143e6806100456000396000f3006060604052600436106200016d5763ffffffff60e060020a6000350416630548e5a28114620001725780631a44731c14620001b25780632c9c0fb514620001de5780632efb77c414620002055780633292b71f146200022157806332f8e034146200023c57806341f48ebf146200026457806350f7c204146200029657806353c194af14620002ac578063675518b814620002dd57806368a6e74b146200030557806374e7493b146200031b57806377eab3e3146200033457806382bc07e6146200034d5780638da5cb5b1462000377578063903a3ef6146200038d57806390d6b45f14620003a357806394bf804d14620003b9578063960a48ae14620003de5780639d3e1ab81462000412578063aac4e3a81462000428578063ad7b09c5146200043e578063cc8b96e51462000460578063e30c3978146200048b578063efbc007514620004a1578063f2fde38b14620004b7578063f766658d14620004d9578063fc0c546a14620004ef575b600080fd5b34156200017e57600080fd5b620001b0600160a060020a0360043581169060243515159061ffff604435811691606435909116906084351662000505565b005b3415620001be57600080fd5b620001c8620005b0565b60405160ff909116815260200160405180910390f35b3415620001ea57600080fd5b620001b0600160a060020a03600435166024351515620005c0565b34156200021157600080fd5b620001b0600435602435620006d1565b34156200022d57600080fd5b620001b060043515156200073c565b34156200024857600080fd5b62000252620008ec565b60405190815260200160405180910390f35b34156200027057600080fd5b6200027a620008f2565b604051600160a060020a03909116815260200160405180910390f35b3415620002a257600080fd5b6200025262000901565b3415620002b857600080fd5b620001b0600435602435604435606435608435600160a060020a0360a4351662000907565b3415620002e957600080fd5b620001b0600160a060020a036004358116906024351662000ab4565b34156200031157600080fd5b6200027a62000bc4565b34156200032757600080fd5b620001b060043562000bd3565b34156200034057600080fd5b620001b060043562000c38565b34156200035957600080fd5b6200036362000c9d565b604051901515815260200160405180910390f35b34156200038357600080fd5b6200027a62000cad565b34156200039957600080fd5b620001b062000cbc565b3415620003af57600080fd5b6200027a62000d50565b3415620003c557600080fd5b620001b0600435600160a060020a036024351662000d5f565b3415620003ea57600080fd5b620001b060043560243560443560643560843560a435600160a060020a0360c4351662000e79565b34156200041e57600080fd5b6200027a62001033565b34156200043457600080fd5b6200027a62001042565b34156200044a57600080fd5b620001b0600160a060020a036004351662001051565b34156200046c57600080fd5b620001b0600435600160a060020a03602435811690604435166200110d565b34156200049757600080fd5b6200027a620011ba565b3415620004ad57600080fd5b620001b0620011c9565b3415620004c357600080fd5b620001b0600160a060020a036004351662001248565b3415620004e557600080fd5b62000252620012d8565b3415620004fb57600080fd5b6200027a620012de565b60025433600160a060020a039081169116146200052157600080fd5b600654600160a060020a0316630548e5a2868686868660405160e060020a63ffffffff8816028152600160a060020a039586166004820152931515602485015261ffff928316604485015291166064830152909116608482015260a401600060405180830381600087803b15156200059857600080fd5b5af11515620005a657600080fd5b5050505050505050565b60005460a060020a900460ff1681565b60005433600160a060020a03908116911614620005dc57600080fd5b600054600160a060020a90910460ff16116200066257600354600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156200064b57600080fd5b5af115156200065957600080fd5b505050620006cd565b600554600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515620006bb57600080fd5b5af11515620006c957600080fd5b5050505b5050565b60005433600160a060020a03908116911614620006ed57600080fd5b600554600160a060020a0316632efb77c4838360405160e060020a63ffffffff851602815260048101929092526024820152604401600060405180830381600087803b1515620006bb57600080fd5b60005433600160a060020a039081169116146200075857600080fd5b80156200085b5760095415156200076e57600080fd5b60095462278d00014210156200078357600080fd5b600454600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620007db57600080fd5b5af11515620007e957600080fd5b5050600654600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200084457600080fd5b5af115156200085257600080fd5b505050620008e9565b600a5415156200086a57600080fd5b600a5462278d00014210156200087f57600080fd5b600554600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620008d757600080fd5b5af11515620008e557600080fd5b5050505b50565b600a5481565b600554600160a060020a031681565b60085481565b60005433600160a060020a039081169116146200092357600080fd5b60005460a060020a900460ff166002146200093d57600080fd5b6008546003546006546007546001548a948a948a948a948a948a93600160a060020a0390811693811692600092908216911662000979620012ed565b9b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a0890193909352600160a060020a0391821660c0890152811660e08801529081166101008701529015156101208601529081166101408501529091166101608301526101809091019051809103906000f0801515620009fc57600080fd5b60058054600160a060020a031916600160a060020a03928316179081905560035482169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000a6657600080fd5b5af1151562000a7457600080fd5b50506000805474ff000000000000000000000000000000000000000019167403000000000000000000000000000000000000000017905550505050505050565b60005433600160a060020a0390811691161462000ad057600080fd5b62000afc6af8277896582678ac000000837343bad62a4ad94c31c659d21be3e3a33ffc97c9096200110d565b62000b276a341cc4d7e46e7a9f00000073b52c45b43b5c2dc6928149c54a05ba3a9154206062000d5f565b62000b3e6a165578eecf9d0ffb0000008262000d5f565b62000b89635af1bb70635b0d6af06103e8683635c9adc5dea0000067016345785d8a00006a18d0bf423c03d8de000000731ef0cad0e9a12cf39494e7d40643985538e7e96362000e79565b62000b96826001620005c0565b62000ba3816001620005c0565b620006cd73b52c45b43b5c2dc6928149c54a05ba3a915420606001620005c0565b600454600160a060020a031681565b60005433600160a060020a0390811691161462000bef57600080fd5b600554600160a060020a03166374e7493b8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515620008d757600080fd5b60005433600160a060020a0390811691161462000c5457600080fd5b600554600160a060020a03166377eab3e38260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515620008d757600080fd5b60065460a060020a900460ff1681565b600054600160a060020a031681565b60005433600160a060020a0390811691161462000cd857600080fd5b60005460a060020a900460ff166002141562000cf8574260095562000cfd565b42600a555b600554600160a060020a0316634bb278f36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151562000d3d57600080fd5b5af1151562000d4b57600080fd5b505050565b600654600160a060020a031681565b6000805433600160a060020a0390811691161462000d7c57600080fd5b60005460a060020a900460ff1660011462000d9657600080fd5b6008546003548490600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000ddb57600080fd5b5af1151562000de957600080fd5b50505060405180519050011115905080151562000e0557600080fd5b600354600160a060020a03166340c10f19838560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e5c57600080fd5b5af1151562000e6a57600080fd5b50505060405180515050505050565b60005433600160a060020a0390811691161462000e9557600080fd5b600054600160a060020a90910460ff16111562000eb157600080fd5b6003546006546007548992899289928992899289928992600160a060020a0390811692811691600191163062000ee6620012ed565b9b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a0890193909352600160a060020a0391821660c0890152811660e08801529081166101008701529015156101208601529081166101408501529091166101608301526101809091019051809103906000f080151562000f6957600080fd5b60058054600160a060020a03928316600160a060020a031991821617918290556004805490911691831691821790556003549091169063f2fde38b9060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000fe457600080fd5b5af1151562000ff257600080fd5b50506000805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790555050505050505050565b600754600160a060020a031681565b600254600160a060020a031681565b60005433600160a060020a039081169116146200106d57600080fd5b60018054600160a060020a031916600160a060020a03831617905562001092620012fe565b604051809103906000f0801515620010a957600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055620010d36200130f565b604051809103906000f0801515620010ea57600080fd5b60068054600160a060020a031916600160a060020a039290921691909117905550565b60005433600160a060020a039081169116146200112957600080fd5b60005460a060020a900460ff16156200114157600080fd5b600154600054600160a060020a039081169116146200115f57600080fd5b60089290925560078054600160a060020a03928316600160a060020a031991821617909155600280549390921692169190911790556000805474ff0000000000000000000000000000000000000000191660a060020a179055565b600154600160a060020a031681565b60015433600160a060020a03908116911614620011e557600080fd5b600154600054600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015460008054600160a060020a031916600160a060020a03909216919091179055565b60005433600160a060020a039081169116146200126457600080fd5b600160a060020a03811615156200127a57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b60095481565b600354600160a060020a031681565b604051611c71806200132183390190565b604051610fcb8062002f9283390190565b60405161045e8062003f5d83390190560060606040526006805460a060020a60ff021916905560006009819055600a819055600b819055600c5534156200003457600080fd5b6040516101808062001c7183398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191508990508c8c8c8942841015620000ad57600080fd5b83831015620000bb57600080fd5b60008211620000c957600080fd5b600160a060020a0381161515620000df57600080fd5b620000f764010000000062001332620002e582021704565b60008054600160a060020a0319908116600160a060020a0393841617825560019690965560029490945560049290925560038054851691831691909117905560068054909316339091161790915581116200015157600080fd5b600354600160a060020a031662000167620002f9565b600160a060020a039091168152602001604051809103906000f08015156200018e57600080fd5b60088054600160a060020a031916600160a060020a03929092169190911790556007556000881015620001c057600080fd5b60008711620001ce57600080fd5b600160a060020a0382161515620001e457600080fd5b600c889055600a879055600d8054600f8054600160a060020a0319908116600160a060020a0387811691909117909255601080548216868416179055600e805490911688831617905560ff199091168515151761010060a860020a03191661010091881691909102179081905560ff1615620002d357600d546101009004600160a060020a03166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620002b857600080fd5b5af11515620002c657600080fd5b5050506040518051600b55505b5050505050505050505050506200030a565b600d546101009004600160a060020a031690565b6040516105e5806200168c83390190565b611372806200031a6000396000f3006060604052600436106101715763ffffffff60e060020a6000350416632c4e722e811461017c5780632c9c0fb5146101a15780632efb77c4146101c55780633197cbb6146101de57806340193883146101f15780634042b66f146102045780634bb278f3146102175780634e5053671461022a5780634f02c4201461023d57806350f7c20414610250578063521eb27314610263578063580c2ae91461029257806368a6e74b146102a557806374e7493b146102cc57806377eab3e3146102e257806378e97925146102f85780637d3d65221461030b5780638d4e40831461031e5780638da5cb5b1461033157806390d6b45f146103445780639d3e1ab814610357578063b5545a3c1461036a578063bb0c82981461037d578063d2dd9f7914610390578063e30c3978146103af578063ec8ac4d8146103c2578063ecb70fb7146103d6578063f2fde38b146103e9578063f7f3291614610408578063fbfa77cf1461041e578063fc0c546a14610431575b61017a33610444565b005b341561018757600080fd5b61018f610835565b60405190815260200160405180910390f35b34156101ac57600080fd5b61017a600160a060020a0360043516602435151561083b565b34156101d057600080fd5b61017a6004356024356108c7565b34156101e957600080fd5b61018f610907565b34156101fc57600080fd5b61018f61090d565b341561020f57600080fd5b61018f610913565b341561022257600080fd5b61017a610919565b341561023557600080fd5b61018f6109da565b341561024857600080fd5b61018f6109e0565b341561025b57600080fd5b61018f610a56565b341561026e57600080fd5b610276610a5c565b604051600160a060020a03909116815260200160405180910390f35b341561029d57600080fd5b61018f610a6b565b34156102b057600080fd5b6102b8610a71565b604051901515815260200160405180910390f35b34156102d757600080fd5b61017a600435610a7a565b34156102ed57600080fd5b61017a600435610aa7565b341561030357600080fd5b61018f610ad4565b341561031657600080fd5b6102b8610ada565b341561032957600080fd5b6102b8610ae5565b341561033c57600080fd5b610276610b06565b341561034f57600080fd5b610276610b15565b341561036257600080fd5b610276610b24565b341561037557600080fd5b61017a610b33565b341561038857600080fd5b61018f610bb9565b341561039b57600080fd5b61017a600160a060020a0360043516610bbf565b34156103ba57600080fd5b610276610c3d565b61017a600160a060020a0360043516610444565b34156103e157600080fd5b6102b8610c4c565b34156103f457600080fd5b61017a600160a060020a0360043516610c6e565b341561041357600080fd5b61018f600435610d09565b341561042957600080fd5b610276610ef1565b341561043c57600080fd5b610276610f00565b6000808080808080808080600160a060020a038b16151561046457600080fd5b61046c610f14565b151561047757600080fd5b600e54600160a060020a0316633d8270f58c60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401608060405180830381600087803b15156104c757600080fd5b5af115156104d457600080fd5b5050506040518051906020018051906020018051906020018051939d50919b5099509097505089151561050657600080fd5b60045434965061051d90879063ffffffff610f3416565b945061052885610d09565b93506105506127106105448761ffff8d1663ffffffff610f3416565b9063ffffffff610f5d16565b9250610562858563ffffffff610f7216565b9450610574858463ffffffff610f7216565b9450600a54610591866105856109e0565b9063ffffffff610f7216565b111561059c57600080fd5b600d546101009004600160a060020a03166340c10f198c8760405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156105f757600080fd5b5af1151561060457600080fd5b505050604051805190505087600160a060020a03168b600160a060020a031633600160a060020a03167f355b943140b1c8c99b2758a4d21c8858e602443ed75603e2465689d647abf1548989600454896040518085815260200184815260200183815260200182815260200194505050505060405180910390a4600554610691908763ffffffff610f7216565b6005556009805460010190556106a5610f7f565b600e54600160a060020a0316634f3d520c8960405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156106f557600080fd5b5af1151561070257600080fd5b50505060405180519050915081801561072d57508a600160a060020a031688600160a060020a031614155b156108285760045461074690879063ffffffff610f3416565b94506107626127106105448761ffff8b1663ffffffff610f3416565b9050600a54610773826105856109e0565b1161082857600d546101009004600160a060020a03166340c10f19898360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156107d357600080fd5b5af115156107e057600080fd5b50505060405180515050600160a060020a0388167f2a8343b6f78db3d6fa59b4f584a77484bd2cb3e54720ca8066699b5094ebdfd48660405190815260200160405180910390a25b5050505050505050505050565b60045481565b60065433600160a060020a0390811691161461085657600080fd5b600d546101009004600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156108b357600080fd5b5af115156108c057600080fd5b5050505050565b60065433600160a060020a039081169116146108e257600080fd5b428210156108ef57600080fd5b818110156108fc57600080fd5b600191909155600255565b60025481565b60075481565b60055481565b60065433600160a060020a0390811691161461093457600080fd5b60065474010000000000000000000000000000000000000000900460ff161561095c57600080fd5b610964610c4c565b151561096f57600080fd5b610977610fcf565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a16006805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b600b5481565b600b54600d54600091610a51916101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a2e57600080fd5b5af11515610a3b57600080fd5b505050604051805191905063ffffffff61119416565b905090565b600a5481565b600354600160a060020a031681565b60095481565b600d5460ff1681565b60065433600160a060020a03908116911614610a9557600080fd5b60008111610aa257600080fd5b600455565b60065433600160a060020a03908116911614610ac257600080fd5b60008111610acf57600080fd5b600c55565b60015481565b600754600554101590565b60065474010000000000000000000000000000000000000000900460ff1681565b600654600160a060020a031681565b600e54600160a060020a031681565b600f54600160a060020a031681565b600d546000906101009004600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b8b57600080fd5b5af11515610b9857600080fd5b50505060405180519150508015610bae57600080fd5b610bb66111a6565b50565b600c5481565b60065433600160a060020a03908116911614610bda57600080fd5b600854600160a060020a031663f2fde38b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c2a57600080fd5b5af11515610c3757600080fd5b50505050565b601054600160a060020a031681565b6000610c56611243565b80610a515750600a54610c676109e0565b1015905090565b60065433600160a060020a03908116911614610c8957600080fd5b600160a060020a0381161515610c9e57600080fd5b600654600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600d54600090819060ff1615610e0857690a968163f0a57b4000008310610d4757610d40606461054485602263ffffffff610f3416565b9050610e03565b690a968163f0a57b40000083108015610d6a575069021e19e0c9bab24000008310155b15610d8557610d40606461054485601a63ffffffff610f3416565b69021e19e0c9bab240000083108015610da8575069010f0cf064dd592000008310155b15610dc357610d40606461054485601463ffffffff610f3416565b69010f0cf064dd5920000083108015610de55750683635c9adc5dea000008310155b15610e0357610e00606461054485601063ffffffff610f3416565b90505b610eeb565b690a968163f0a57b4000008310610e2f57610e00606461054485601163ffffffff610f3416565b690a968163f0a57b40000083108015610e52575069021e19e0c9bab24000008310155b15610e6d57610e00606461054485600d63ffffffff610f3416565b69021e19e0c9bab240000083108015610e90575069010f0cf064dd592000008310155b15610eab57610e00606461054485600a63ffffffff610f3416565b69010f0cf064dd5920000083108015610ecd5750683635c9adc5dea000008310155b15610eeb57610ee8606461054485600863ffffffff610f3416565b90505b92915050565b600854600160a060020a031681565b600d546101009004600160a060020a031681565b600c54600090341015610f2561124b565b8015610f2e5750805b91505090565b6000821515610f4557506000610eeb565b50818102818382811515610f5557fe5b0414610eeb57fe5b60008183811515610f6a57fe5b049392505050565b81810182811015610eeb57fe5b600854600160a060020a031663f340fa01343360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b1515610c2a57600080fd5b600d5460009060ff1615156110c857600d5461104b906101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561102657600080fd5b5af1151561103357600080fd5b5050506040518051600a54915063ffffffff61119416565b600d54600f54919250600160a060020a036101009091048116916340c10f1991168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156110b057600080fd5b5af115156110bd57600080fd5b505050604051805150505b6110d061127b565b600d5460ff16151561113857600d546101009004600160a060020a0316637d64bcb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561112057600080fd5b5af1151561112d57600080fd5b505050604051805150505b600d54601054600160a060020a0361010090920482169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c2a57600080fd5b6000828211156111a057fe5b50900390565b60065474010000000000000000000000000000000000000000900460ff1615156111cf57600080fd5b6111d7610ada565b156111e157600080fd5b600854600160a060020a031663fa89401a3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561123157600080fd5b5af1151561123e57600080fd5b505050565b600254421190565b6000806000600154421015801561126457506002544211155b9150503415158180156112745750805b9250505090565b611283610ada565b156112dc57600854600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156112c757600080fd5b5af115156112d457600080fd5b50505061132c565b600854600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561131b57600080fd5b5af1151561132857600080fd5b5050505b6113305b565b600d546101009004600160a060020a0316905600a165627a7a72305820f8419d0f1bfe3f64bdb5f9ae455e1f7539497782fc8945e65eacd674f6ca3eb000296060604052341561000f57600080fd5b6040516020806105e58339810160405280805160008054600160a060020a03191633600160a060020a039081169190911790915590925082161515905061005557600080fd5b60028054600160a060020a031916600160a060020a03929092169190911760a060020a60ff02191690556105578061008e6000396000f3006060604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166343d726d6811461009d578063521eb273146100b25780638c52dc41146100e15780638da5cb5b146100f4578063c19d93fb14610107578063cb13cddb1461013e578063f2fde38b1461016f578063f340fa011461018e578063fa89401a146101a2575b600080fd5b34156100a857600080fd5b6100b06101c1565b005b34156100bd57600080fd5b6100c5610278565b604051600160a060020a03909116815260200160405180910390f35b34156100ec57600080fd5b6100b0610287565b34156100ff57600080fd5b6100c5610318565b341561011257600080fd5b61011a610327565b6040518082600281111561012a57fe5b60ff16815260200191505060405180910390f35b341561014957600080fd5b61015d600160a060020a0360043516610337565b60405190815260200160405180910390f35b341561017a57600080fd5b6100b0600160a060020a0360043516610349565b6100b0600160a060020a03600435166103e4565b34156101ad57600080fd5b6100b0600160a060020a0360043516610468565b60005433600160a060020a039081169116146101dc57600080fd5b6002805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790557f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a60405160405180910390a1600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561027657600080fd5b565b600254600160a060020a031681565b60005433600160a060020a039081169116146102a257600080fd5b60006002805460a060020a900460ff16908111156102bc57fe5b146102c657600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790557f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8960405160405180910390a1565b600054600160a060020a031681565b60025460a060020a900460ff1681565b60016020526000908152604090205481565b60005433600160a060020a0390811691161461036457600080fd5b600160a060020a038116151561037957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146103ff57600080fd5b60006002805460a060020a900460ff169081111561041957fe5b1461042357600080fd5b600160a060020a03811660009081526001602052604090205461044c903463ffffffff61051816565b600160a060020a03909116600090815260016020526040902055565b600060016002805460a060020a900460ff169081111561048457fe5b1461048e57600080fd5b50600160a060020a038116600081815260016020526040808220805492905590919082156108fc0290839051600060405180830381858888f1935050505015156104d757600080fd5b81600160a060020a03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405190815260200160405180910390a25050565b8181018281101561052557fe5b929150505600a165627a7a72305820baff5c547d78d83d4a58e9748f9c4d6a66a1a851de72ca4c72af060ee2214da2002960606040526003805460a060020a61ffff0219167512000000000000000000000000000000000000000000177fffffffffffffffffff00ffff00000000000000000000000000000000000000001633600160a060020a0316179055610f62806100696000396000f30060606040526004361061011c5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461012157806306fdde0314610148578063095ea7b3146101d257806318160ddd146101f457806323b872dd14610219578063293230b8146102415780632c9c0fb514610256578063313ce5671461027a57806340c10f19146102a357806342966c68146102c55780635b4f472a146102db57806366188463146102ee57806370a08231146103105780637d64bcb41461032f5780638da5cb5b1461034257806395d89b4114610371578063a9059cbb14610384578063acb1e61f146103a6578063d73dd623146103c5578063dd62ed3e146103e7578063f2fde38b1461040c575b600080fd5b341561012c57600080fd5b61013461042b565b604051901515815260200160405180910390f35b341561015357600080fd5b61015b61044c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561019757808201518382015260200161017f565b50505050905090810190601f1680156101c45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dd57600080fd5b610134600160a060020a0360043516602435610483565b34156101ff57600080fd5b6102076104d5565b60405190815260200160405180910390f35b341561022457600080fd5b610134600160a060020a03600435811690602435166044356104db565b341561024c57600080fd5b61025461052f565b005b341561026157600080fd5b610254600160a060020a03600435166024351515610572565b341561028557600080fd5b61028d6105b8565b60405160ff909116815260200160405180910390f35b34156102ae57600080fd5b610134600160a060020a03600435166024356105da565b34156102d057600080fd5b6102546004356106f8565b34156102e657600080fd5b6101346107b3565b34156102f957600080fd5b610134600160a060020a03600435166024356107c3565b341561031b57600080fd5b610207600160a060020a036004351661080d565b341561033a57600080fd5b610134610828565b341561034d57600080fd5b6103556108d5565b604051600160a060020a03909116815260200160405180910390f35b341561037c57600080fd5b61015b6108e4565b341561038f57600080fd5b610134600160a060020a036004351660243561091b565b34156103b157600080fd5b610134600160a060020a0360043516610965565b34156103d057600080fd5b610134600160a060020a036004351660243561097a565b34156103f257600080fd5b610207600160a060020a03600435811690602435166109c4565b341561041757600080fd5b610254600160a060020a03600435166109ef565b60035474010000000000000000000000000000000000000000900460ff1681565b60408051908101604052600a81527f426974657820436f696e00000000000000000000000000000000000000000000602082015281565b600354600090839060b060020a900460ff16806104b85750600160a060020a03811660009081526004602052604090205460ff165b15156104c357600080fd5b6104cd8484610a8a565b949350505050565b60005481565b600354600090849060b060020a900460ff16806105105750600160a060020a03811660009081526004602052604090205460ff165b151561051b57600080fd5b610526858585610af6565b95945050505050565b60035433600160a060020a0390811691161461054a57600080fd5b6003805476ff00000000000000000000000000000000000000000000191660b060020a179055565b60035433600160a060020a0390811691161461058d57600080fd5b600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b6003547501000000000000000000000000000000000000000000900460ff1681565b60035460009033600160a060020a039081169116146105f857600080fd5b60035474010000000000000000000000000000000000000000900460ff161561062057600080fd5b600054610633908363ffffffff610c7816565b6000908155600160a060020a03841681526001602052604090205461065e908363ffffffff610c7816565b600160a060020a0384166000818152600160205260409081902092909255907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859084905190815260200160405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a03331660009081526001602052604081205482111561071d57600080fd5b5033600160a060020a0381166000908152600160205260409020546107429083610c8b565b600160a060020a0382166000908152600160205260408120919091555461076f908363ffffffff610c8b16565b600055600160a060020a0381167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405190815260200160405180910390a25050565b60035460b060020a900460ff1681565b600354600090839060b060020a900460ff16806107f85750600160a060020a03811660009081526004602052604090205460ff165b151561080357600080fd5b6104cd8484610c9d565b600160a060020a031660009081526001602052604090205490565b60035460009033600160a060020a0390811691161461084657600080fd5b60035474010000000000000000000000000000000000000000900460ff161561086e57600080fd5b6003805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790557fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a150600190565b600354600160a060020a031681565b60408051908101604052600381527f5842580000000000000000000000000000000000000000000000000000000000602082015281565b600354600090339060b060020a900460ff16806109505750600160a060020a03811660009081526004602052604090205460ff165b151561095b57600080fd5b6104cd8484610d97565b60046020526000908152604090205460ff1681565b600354600090839060b060020a900460ff16806109af5750600160a060020a03811660009081526004602052604090205460ff165b15156109ba57600080fd5b6104cd8484610e92565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610a0a57600080fd5b600160a060020a0381161515610a1f57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000600160a060020a0383161515610b0d57600080fd5b600160a060020a038416600090815260016020526040902054821115610b3257600080fd5b600160a060020a0380851660009081526002602090815260408083203390941683529290522054821115610b6557600080fd5b600160a060020a038416600090815260016020526040902054610b8e908363ffffffff610c8b16565b600160a060020a038086166000908152600160205260408082209390935590851681522054610bc3908363ffffffff610c7816565b600160a060020a03808516600090815260016020908152604080832094909455878316825260028152838220339093168252919091522054610c0b908363ffffffff610c8b16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b81810182811015610c8557fe5b92915050565b600082821115610c9757fe5b50900390565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205480831115610cfa57600160a060020a033381166000908152600260209081526040808320938816835292905290812055610d31565b610d0a818463ffffffff610c8b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b6000600160a060020a0383161515610dae57600080fd5b600160a060020a033316600090815260016020526040902054821115610dd357600080fd5b600160a060020a033316600090815260016020526040902054610dfc908363ffffffff610c8b16565b600160a060020a033381166000908152600160205260408082209390935590851681522054610e31908363ffffffff610c7816565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610eca908363ffffffff610c7816565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a3506001929150505600a165627a7a723058200efd0781f4c658cb7ff11b8836b3d1d1427b8d3eac4d0e0c5594a36772d4a8aa0029606060405260008054600160a060020a033316600160a060020a031990911617905561042e806100306000396000f3006060604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630548e5a2811461007c5780633d8270f5146100b95780634f3d520c146101135780638da5cb5b146101465780639b19251a14610175578063f2fde38b14610194575b600080fd5b341561008757600080fd5b6100b7600160a060020a0360043581169060243515159061ffff60443581169160643590911690608435166101b3565b005b34156100c457600080fd5b6100d8600160a060020a0360043516610298565b604051931515845261ffff9283166020850152600160a060020a03909116604080850191909152911660608301526080909101905180910390f35b341561011e57600080fd5b610132600160a060020a03600435166102ea565b604051901515815260200160405180910390f35b341561015157600080fd5b610159610308565b604051600160a060020a03909116815260200160405180910390f35b341561018057600080fd5b6100d8600160a060020a0360043516610317565b341561019f57600080fd5b6100b7600160a060020a0360043516610367565b6000805433600160a060020a039081169116146101cf57600080fd5b61271061ffff8516106101e157600080fd5b61271061ffff8416106101f357600080fd5b50600160a060020a039485166000908152600160205260409020805460ff19169415159490941762ffff00191661010061ffff948516021776ffffffffffffffffffffffffffffffffffffffff0000001916630100000091909516029390931778ffff00000000000000000000000000000000000000000000001916770100000000000000000000000000000000000000000000009390911692909202919091179055565b600160a060020a0390811660009081526001602052604090205460ff81169261ffff61010083048116936301000000840416927701000000000000000000000000000000000000000000000090041690565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a031681565b60016020526000908152604090205460ff81169061ffff6101008204811691600160a060020a03630100000082041691770100000000000000000000000000000000000000000000009091041684565b60005433600160a060020a0390811691161461038257600080fd5b600160a060020a038116151561039757600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a723058207bcf3c60cd38a4758b5d02e7a04f9b910a85a7c9b92823136e686d0f6b8f345f0029a165627a7a723058209a6e246ad122cb86394438f311a76d1c6ff50a2d16772c0688dd1d4fd7e7c3360029
Deployed Bytecode
0x6060604052600436106200016d5763ffffffff60e060020a6000350416630548e5a28114620001725780631a44731c14620001b25780632c9c0fb514620001de5780632efb77c414620002055780633292b71f146200022157806332f8e034146200023c57806341f48ebf146200026457806350f7c204146200029657806353c194af14620002ac578063675518b814620002dd57806368a6e74b146200030557806374e7493b146200031b57806377eab3e3146200033457806382bc07e6146200034d5780638da5cb5b1462000377578063903a3ef6146200038d57806390d6b45f14620003a357806394bf804d14620003b9578063960a48ae14620003de5780639d3e1ab81462000412578063aac4e3a81462000428578063ad7b09c5146200043e578063cc8b96e51462000460578063e30c3978146200048b578063efbc007514620004a1578063f2fde38b14620004b7578063f766658d14620004d9578063fc0c546a14620004ef575b600080fd5b34156200017e57600080fd5b620001b0600160a060020a0360043581169060243515159061ffff604435811691606435909116906084351662000505565b005b3415620001be57600080fd5b620001c8620005b0565b60405160ff909116815260200160405180910390f35b3415620001ea57600080fd5b620001b0600160a060020a03600435166024351515620005c0565b34156200021157600080fd5b620001b0600435602435620006d1565b34156200022d57600080fd5b620001b060043515156200073c565b34156200024857600080fd5b62000252620008ec565b60405190815260200160405180910390f35b34156200027057600080fd5b6200027a620008f2565b604051600160a060020a03909116815260200160405180910390f35b3415620002a257600080fd5b6200025262000901565b3415620002b857600080fd5b620001b0600435602435604435606435608435600160a060020a0360a4351662000907565b3415620002e957600080fd5b620001b0600160a060020a036004358116906024351662000ab4565b34156200031157600080fd5b6200027a62000bc4565b34156200032757600080fd5b620001b060043562000bd3565b34156200034057600080fd5b620001b060043562000c38565b34156200035957600080fd5b6200036362000c9d565b604051901515815260200160405180910390f35b34156200038357600080fd5b6200027a62000cad565b34156200039957600080fd5b620001b062000cbc565b3415620003af57600080fd5b6200027a62000d50565b3415620003c557600080fd5b620001b0600435600160a060020a036024351662000d5f565b3415620003ea57600080fd5b620001b060043560243560443560643560843560a435600160a060020a0360c4351662000e79565b34156200041e57600080fd5b6200027a62001033565b34156200043457600080fd5b6200027a62001042565b34156200044a57600080fd5b620001b0600160a060020a036004351662001051565b34156200046c57600080fd5b620001b0600435600160a060020a03602435811690604435166200110d565b34156200049757600080fd5b6200027a620011ba565b3415620004ad57600080fd5b620001b0620011c9565b3415620004c357600080fd5b620001b0600160a060020a036004351662001248565b3415620004e557600080fd5b62000252620012d8565b3415620004fb57600080fd5b6200027a620012de565b60025433600160a060020a039081169116146200052157600080fd5b600654600160a060020a0316630548e5a2868686868660405160e060020a63ffffffff8816028152600160a060020a039586166004820152931515602485015261ffff928316604485015291166064830152909116608482015260a401600060405180830381600087803b15156200059857600080fd5b5af11515620005a657600080fd5b5050505050505050565b60005460a060020a900460ff1681565b60005433600160a060020a03908116911614620005dc57600080fd5b600054600160a060020a90910460ff16116200066257600354600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156200064b57600080fd5b5af115156200065957600080fd5b505050620006cd565b600554600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515620006bb57600080fd5b5af11515620006c957600080fd5b5050505b5050565b60005433600160a060020a03908116911614620006ed57600080fd5b600554600160a060020a0316632efb77c4838360405160e060020a63ffffffff851602815260048101929092526024820152604401600060405180830381600087803b1515620006bb57600080fd5b60005433600160a060020a039081169116146200075857600080fd5b80156200085b5760095415156200076e57600080fd5b60095462278d00014210156200078357600080fd5b600454600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620007db57600080fd5b5af11515620007e957600080fd5b5050600654600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200084457600080fd5b5af115156200085257600080fd5b505050620008e9565b600a5415156200086a57600080fd5b600a5462278d00014210156200087f57600080fd5b600554600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620008d757600080fd5b5af11515620008e557600080fd5b5050505b50565b600a5481565b600554600160a060020a031681565b60085481565b60005433600160a060020a039081169116146200092357600080fd5b60005460a060020a900460ff166002146200093d57600080fd5b6008546003546006546007546001548a948a948a948a948a948a93600160a060020a0390811693811692600092908216911662000979620012ed565b9b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a0890193909352600160a060020a0391821660c0890152811660e08801529081166101008701529015156101208601529081166101408501529091166101608301526101809091019051809103906000f0801515620009fc57600080fd5b60058054600160a060020a031916600160a060020a03928316179081905560035482169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000a6657600080fd5b5af1151562000a7457600080fd5b50506000805474ff000000000000000000000000000000000000000019167403000000000000000000000000000000000000000017905550505050505050565b60005433600160a060020a0390811691161462000ad057600080fd5b62000afc6af8277896582678ac000000837343bad62a4ad94c31c659d21be3e3a33ffc97c9096200110d565b62000b276a341cc4d7e46e7a9f00000073b52c45b43b5c2dc6928149c54a05ba3a9154206062000d5f565b62000b3e6a165578eecf9d0ffb0000008262000d5f565b62000b89635af1bb70635b0d6af06103e8683635c9adc5dea0000067016345785d8a00006a18d0bf423c03d8de000000731ef0cad0e9a12cf39494e7d40643985538e7e96362000e79565b62000b96826001620005c0565b62000ba3816001620005c0565b620006cd73b52c45b43b5c2dc6928149c54a05ba3a915420606001620005c0565b600454600160a060020a031681565b60005433600160a060020a0390811691161462000bef57600080fd5b600554600160a060020a03166374e7493b8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515620008d757600080fd5b60005433600160a060020a0390811691161462000c5457600080fd5b600554600160a060020a03166377eab3e38260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515620008d757600080fd5b60065460a060020a900460ff1681565b600054600160a060020a031681565b60005433600160a060020a0390811691161462000cd857600080fd5b60005460a060020a900460ff166002141562000cf8574260095562000cfd565b42600a555b600554600160a060020a0316634bb278f36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151562000d3d57600080fd5b5af1151562000d4b57600080fd5b505050565b600654600160a060020a031681565b6000805433600160a060020a0390811691161462000d7c57600080fd5b60005460a060020a900460ff1660011462000d9657600080fd5b6008546003548490600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000ddb57600080fd5b5af1151562000de957600080fd5b50505060405180519050011115905080151562000e0557600080fd5b600354600160a060020a03166340c10f19838560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e5c57600080fd5b5af1151562000e6a57600080fd5b50505060405180515050505050565b60005433600160a060020a0390811691161462000e9557600080fd5b600054600160a060020a90910460ff16111562000eb157600080fd5b6003546006546007548992899289928992899289928992600160a060020a0390811692811691600191163062000ee6620012ed565b9b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a0890193909352600160a060020a0391821660c0890152811660e08801529081166101008701529015156101208601529081166101408501529091166101608301526101809091019051809103906000f080151562000f6957600080fd5b60058054600160a060020a03928316600160a060020a031991821617918290556004805490911691831691821790556003549091169063f2fde38b9060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000fe457600080fd5b5af1151562000ff257600080fd5b50506000805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790555050505050505050565b600754600160a060020a031681565b600254600160a060020a031681565b60005433600160a060020a039081169116146200106d57600080fd5b60018054600160a060020a031916600160a060020a03831617905562001092620012fe565b604051809103906000f0801515620010a957600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055620010d36200130f565b604051809103906000f0801515620010ea57600080fd5b60068054600160a060020a031916600160a060020a039290921691909117905550565b60005433600160a060020a039081169116146200112957600080fd5b60005460a060020a900460ff16156200114157600080fd5b600154600054600160a060020a039081169116146200115f57600080fd5b60089290925560078054600160a060020a03928316600160a060020a031991821617909155600280549390921692169190911790556000805474ff0000000000000000000000000000000000000000191660a060020a179055565b600154600160a060020a031681565b60015433600160a060020a03908116911614620011e557600080fd5b600154600054600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015460008054600160a060020a031916600160a060020a03909216919091179055565b60005433600160a060020a039081169116146200126457600080fd5b600160a060020a03811615156200127a57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b60095481565b600354600160a060020a031681565b604051611c71806200132183390190565b604051610fcb8062002f9283390190565b60405161045e8062003f5d83390190560060606040526006805460a060020a60ff021916905560006009819055600a819055600b819055600c5534156200003457600080fd5b6040516101808062001c7183398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191508990508c8c8c8942841015620000ad57600080fd5b83831015620000bb57600080fd5b60008211620000c957600080fd5b600160a060020a0381161515620000df57600080fd5b620000f764010000000062001332620002e582021704565b60008054600160a060020a0319908116600160a060020a0393841617825560019690965560029490945560049290925560038054851691831691909117905560068054909316339091161790915581116200015157600080fd5b600354600160a060020a031662000167620002f9565b600160a060020a039091168152602001604051809103906000f08015156200018e57600080fd5b60088054600160a060020a031916600160a060020a03929092169190911790556007556000881015620001c057600080fd5b60008711620001ce57600080fd5b600160a060020a0382161515620001e457600080fd5b600c889055600a879055600d8054600f8054600160a060020a0319908116600160a060020a0387811691909117909255601080548216868416179055600e805490911688831617905560ff199091168515151761010060a860020a03191661010091881691909102179081905560ff1615620002d357600d546101009004600160a060020a03166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620002b857600080fd5b5af11515620002c657600080fd5b5050506040518051600b55505b5050505050505050505050506200030a565b600d546101009004600160a060020a031690565b6040516105e5806200168c83390190565b611372806200031a6000396000f3006060604052600436106101715763ffffffff60e060020a6000350416632c4e722e811461017c5780632c9c0fb5146101a15780632efb77c4146101c55780633197cbb6146101de57806340193883146101f15780634042b66f146102045780634bb278f3146102175780634e5053671461022a5780634f02c4201461023d57806350f7c20414610250578063521eb27314610263578063580c2ae91461029257806368a6e74b146102a557806374e7493b146102cc57806377eab3e3146102e257806378e97925146102f85780637d3d65221461030b5780638d4e40831461031e5780638da5cb5b1461033157806390d6b45f146103445780639d3e1ab814610357578063b5545a3c1461036a578063bb0c82981461037d578063d2dd9f7914610390578063e30c3978146103af578063ec8ac4d8146103c2578063ecb70fb7146103d6578063f2fde38b146103e9578063f7f3291614610408578063fbfa77cf1461041e578063fc0c546a14610431575b61017a33610444565b005b341561018757600080fd5b61018f610835565b60405190815260200160405180910390f35b34156101ac57600080fd5b61017a600160a060020a0360043516602435151561083b565b34156101d057600080fd5b61017a6004356024356108c7565b34156101e957600080fd5b61018f610907565b34156101fc57600080fd5b61018f61090d565b341561020f57600080fd5b61018f610913565b341561022257600080fd5b61017a610919565b341561023557600080fd5b61018f6109da565b341561024857600080fd5b61018f6109e0565b341561025b57600080fd5b61018f610a56565b341561026e57600080fd5b610276610a5c565b604051600160a060020a03909116815260200160405180910390f35b341561029d57600080fd5b61018f610a6b565b34156102b057600080fd5b6102b8610a71565b604051901515815260200160405180910390f35b34156102d757600080fd5b61017a600435610a7a565b34156102ed57600080fd5b61017a600435610aa7565b341561030357600080fd5b61018f610ad4565b341561031657600080fd5b6102b8610ada565b341561032957600080fd5b6102b8610ae5565b341561033c57600080fd5b610276610b06565b341561034f57600080fd5b610276610b15565b341561036257600080fd5b610276610b24565b341561037557600080fd5b61017a610b33565b341561038857600080fd5b61018f610bb9565b341561039b57600080fd5b61017a600160a060020a0360043516610bbf565b34156103ba57600080fd5b610276610c3d565b61017a600160a060020a0360043516610444565b34156103e157600080fd5b6102b8610c4c565b34156103f457600080fd5b61017a600160a060020a0360043516610c6e565b341561041357600080fd5b61018f600435610d09565b341561042957600080fd5b610276610ef1565b341561043c57600080fd5b610276610f00565b6000808080808080808080600160a060020a038b16151561046457600080fd5b61046c610f14565b151561047757600080fd5b600e54600160a060020a0316633d8270f58c60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401608060405180830381600087803b15156104c757600080fd5b5af115156104d457600080fd5b5050506040518051906020018051906020018051906020018051939d50919b5099509097505089151561050657600080fd5b60045434965061051d90879063ffffffff610f3416565b945061052885610d09565b93506105506127106105448761ffff8d1663ffffffff610f3416565b9063ffffffff610f5d16565b9250610562858563ffffffff610f7216565b9450610574858463ffffffff610f7216565b9450600a54610591866105856109e0565b9063ffffffff610f7216565b111561059c57600080fd5b600d546101009004600160a060020a03166340c10f198c8760405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156105f757600080fd5b5af1151561060457600080fd5b505050604051805190505087600160a060020a03168b600160a060020a031633600160a060020a03167f355b943140b1c8c99b2758a4d21c8858e602443ed75603e2465689d647abf1548989600454896040518085815260200184815260200183815260200182815260200194505050505060405180910390a4600554610691908763ffffffff610f7216565b6005556009805460010190556106a5610f7f565b600e54600160a060020a0316634f3d520c8960405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156106f557600080fd5b5af1151561070257600080fd5b50505060405180519050915081801561072d57508a600160a060020a031688600160a060020a031614155b156108285760045461074690879063ffffffff610f3416565b94506107626127106105448761ffff8b1663ffffffff610f3416565b9050600a54610773826105856109e0565b1161082857600d546101009004600160a060020a03166340c10f19898360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156107d357600080fd5b5af115156107e057600080fd5b50505060405180515050600160a060020a0388167f2a8343b6f78db3d6fa59b4f584a77484bd2cb3e54720ca8066699b5094ebdfd48660405190815260200160405180910390a25b5050505050505050505050565b60045481565b60065433600160a060020a0390811691161461085657600080fd5b600d546101009004600160a060020a0316632c9c0fb5838360405160e060020a63ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156108b357600080fd5b5af115156108c057600080fd5b5050505050565b60065433600160a060020a039081169116146108e257600080fd5b428210156108ef57600080fd5b818110156108fc57600080fd5b600191909155600255565b60025481565b60075481565b60055481565b60065433600160a060020a0390811691161461093457600080fd5b60065474010000000000000000000000000000000000000000900460ff161561095c57600080fd5b610964610c4c565b151561096f57600080fd5b610977610fcf565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a16006805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b600b5481565b600b54600d54600091610a51916101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a2e57600080fd5b5af11515610a3b57600080fd5b505050604051805191905063ffffffff61119416565b905090565b600a5481565b600354600160a060020a031681565b60095481565b600d5460ff1681565b60065433600160a060020a03908116911614610a9557600080fd5b60008111610aa257600080fd5b600455565b60065433600160a060020a03908116911614610ac257600080fd5b60008111610acf57600080fd5b600c55565b60015481565b600754600554101590565b60065474010000000000000000000000000000000000000000900460ff1681565b600654600160a060020a031681565b600e54600160a060020a031681565b600f54600160a060020a031681565b600d546000906101009004600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b8b57600080fd5b5af11515610b9857600080fd5b50505060405180519150508015610bae57600080fd5b610bb66111a6565b50565b600c5481565b60065433600160a060020a03908116911614610bda57600080fd5b600854600160a060020a031663f2fde38b8260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c2a57600080fd5b5af11515610c3757600080fd5b50505050565b601054600160a060020a031681565b6000610c56611243565b80610a515750600a54610c676109e0565b1015905090565b60065433600160a060020a03908116911614610c8957600080fd5b600160a060020a0381161515610c9e57600080fd5b600654600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600d54600090819060ff1615610e0857690a968163f0a57b4000008310610d4757610d40606461054485602263ffffffff610f3416565b9050610e03565b690a968163f0a57b40000083108015610d6a575069021e19e0c9bab24000008310155b15610d8557610d40606461054485601a63ffffffff610f3416565b69021e19e0c9bab240000083108015610da8575069010f0cf064dd592000008310155b15610dc357610d40606461054485601463ffffffff610f3416565b69010f0cf064dd5920000083108015610de55750683635c9adc5dea000008310155b15610e0357610e00606461054485601063ffffffff610f3416565b90505b610eeb565b690a968163f0a57b4000008310610e2f57610e00606461054485601163ffffffff610f3416565b690a968163f0a57b40000083108015610e52575069021e19e0c9bab24000008310155b15610e6d57610e00606461054485600d63ffffffff610f3416565b69021e19e0c9bab240000083108015610e90575069010f0cf064dd592000008310155b15610eab57610e00606461054485600a63ffffffff610f3416565b69010f0cf064dd5920000083108015610ecd5750683635c9adc5dea000008310155b15610eeb57610ee8606461054485600863ffffffff610f3416565b90505b92915050565b600854600160a060020a031681565b600d546101009004600160a060020a031681565b600c54600090341015610f2561124b565b8015610f2e5750805b91505090565b6000821515610f4557506000610eeb565b50818102818382811515610f5557fe5b0414610eeb57fe5b60008183811515610f6a57fe5b049392505050565b81810182811015610eeb57fe5b600854600160a060020a031663f340fa01343360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b1515610c2a57600080fd5b600d5460009060ff1615156110c857600d5461104b906101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561102657600080fd5b5af1151561103357600080fd5b5050506040518051600a54915063ffffffff61119416565b600d54600f54919250600160a060020a036101009091048116916340c10f1991168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156110b057600080fd5b5af115156110bd57600080fd5b505050604051805150505b6110d061127b565b600d5460ff16151561113857600d546101009004600160a060020a0316637d64bcb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561112057600080fd5b5af1151561112d57600080fd5b505050604051805150505b600d54601054600160a060020a0361010090920482169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c2a57600080fd5b6000828211156111a057fe5b50900390565b60065474010000000000000000000000000000000000000000900460ff1615156111cf57600080fd5b6111d7610ada565b156111e157600080fd5b600854600160a060020a031663fa89401a3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561123157600080fd5b5af1151561123e57600080fd5b505050565b600254421190565b6000806000600154421015801561126457506002544211155b9150503415158180156112745750805b9250505090565b611283610ada565b156112dc57600854600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156112c757600080fd5b5af115156112d457600080fd5b50505061132c565b600854600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561131b57600080fd5b5af1151561132857600080fd5b5050505b6113305b565b600d546101009004600160a060020a0316905600a165627a7a72305820f8419d0f1bfe3f64bdb5f9ae455e1f7539497782fc8945e65eacd674f6ca3eb000296060604052341561000f57600080fd5b6040516020806105e58339810160405280805160008054600160a060020a03191633600160a060020a039081169190911790915590925082161515905061005557600080fd5b60028054600160a060020a031916600160a060020a03929092169190911760a060020a60ff02191690556105578061008e6000396000f3006060604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166343d726d6811461009d578063521eb273146100b25780638c52dc41146100e15780638da5cb5b146100f4578063c19d93fb14610107578063cb13cddb1461013e578063f2fde38b1461016f578063f340fa011461018e578063fa89401a146101a2575b600080fd5b34156100a857600080fd5b6100b06101c1565b005b34156100bd57600080fd5b6100c5610278565b604051600160a060020a03909116815260200160405180910390f35b34156100ec57600080fd5b6100b0610287565b34156100ff57600080fd5b6100c5610318565b341561011257600080fd5b61011a610327565b6040518082600281111561012a57fe5b60ff16815260200191505060405180910390f35b341561014957600080fd5b61015d600160a060020a0360043516610337565b60405190815260200160405180910390f35b341561017a57600080fd5b6100b0600160a060020a0360043516610349565b6100b0600160a060020a03600435166103e4565b34156101ad57600080fd5b6100b0600160a060020a0360043516610468565b60005433600160a060020a039081169116146101dc57600080fd5b6002805474ff00000000000000000000000000000000000000001916740200000000000000000000000000000000000000001790557f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a60405160405180910390a1600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561027657600080fd5b565b600254600160a060020a031681565b60005433600160a060020a039081169116146102a257600080fd5b60006002805460a060020a900460ff16908111156102bc57fe5b146102c657600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790557f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8960405160405180910390a1565b600054600160a060020a031681565b60025460a060020a900460ff1681565b60016020526000908152604090205481565b60005433600160a060020a0390811691161461036457600080fd5b600160a060020a038116151561037957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146103ff57600080fd5b60006002805460a060020a900460ff169081111561041957fe5b1461042357600080fd5b600160a060020a03811660009081526001602052604090205461044c903463ffffffff61051816565b600160a060020a03909116600090815260016020526040902055565b600060016002805460a060020a900460ff169081111561048457fe5b1461048e57600080fd5b50600160a060020a038116600081815260016020526040808220805492905590919082156108fc0290839051600060405180830381858888f1935050505015156104d757600080fd5b81600160a060020a03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405190815260200160405180910390a25050565b8181018281101561052557fe5b929150505600a165627a7a72305820baff5c547d78d83d4a58e9748f9c4d6a66a1a851de72ca4c72af060ee2214da2002960606040526003805460a060020a61ffff0219167512000000000000000000000000000000000000000000177fffffffffffffffffff00ffff00000000000000000000000000000000000000001633600160a060020a0316179055610f62806100696000396000f30060606040526004361061011c5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461012157806306fdde0314610148578063095ea7b3146101d257806318160ddd146101f457806323b872dd14610219578063293230b8146102415780632c9c0fb514610256578063313ce5671461027a57806340c10f19146102a357806342966c68146102c55780635b4f472a146102db57806366188463146102ee57806370a08231146103105780637d64bcb41461032f5780638da5cb5b1461034257806395d89b4114610371578063a9059cbb14610384578063acb1e61f146103a6578063d73dd623146103c5578063dd62ed3e146103e7578063f2fde38b1461040c575b600080fd5b341561012c57600080fd5b61013461042b565b604051901515815260200160405180910390f35b341561015357600080fd5b61015b61044c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561019757808201518382015260200161017f565b50505050905090810190601f1680156101c45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dd57600080fd5b610134600160a060020a0360043516602435610483565b34156101ff57600080fd5b6102076104d5565b60405190815260200160405180910390f35b341561022457600080fd5b610134600160a060020a03600435811690602435166044356104db565b341561024c57600080fd5b61025461052f565b005b341561026157600080fd5b610254600160a060020a03600435166024351515610572565b341561028557600080fd5b61028d6105b8565b60405160ff909116815260200160405180910390f35b34156102ae57600080fd5b610134600160a060020a03600435166024356105da565b34156102d057600080fd5b6102546004356106f8565b34156102e657600080fd5b6101346107b3565b34156102f957600080fd5b610134600160a060020a03600435166024356107c3565b341561031b57600080fd5b610207600160a060020a036004351661080d565b341561033a57600080fd5b610134610828565b341561034d57600080fd5b6103556108d5565b604051600160a060020a03909116815260200160405180910390f35b341561037c57600080fd5b61015b6108e4565b341561038f57600080fd5b610134600160a060020a036004351660243561091b565b34156103b157600080fd5b610134600160a060020a0360043516610965565b34156103d057600080fd5b610134600160a060020a036004351660243561097a565b34156103f257600080fd5b610207600160a060020a03600435811690602435166109c4565b341561041757600080fd5b610254600160a060020a03600435166109ef565b60035474010000000000000000000000000000000000000000900460ff1681565b60408051908101604052600a81527f426974657820436f696e00000000000000000000000000000000000000000000602082015281565b600354600090839060b060020a900460ff16806104b85750600160a060020a03811660009081526004602052604090205460ff165b15156104c357600080fd5b6104cd8484610a8a565b949350505050565b60005481565b600354600090849060b060020a900460ff16806105105750600160a060020a03811660009081526004602052604090205460ff165b151561051b57600080fd5b610526858585610af6565b95945050505050565b60035433600160a060020a0390811691161461054a57600080fd5b6003805476ff00000000000000000000000000000000000000000000191660b060020a179055565b60035433600160a060020a0390811691161461058d57600080fd5b600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b6003547501000000000000000000000000000000000000000000900460ff1681565b60035460009033600160a060020a039081169116146105f857600080fd5b60035474010000000000000000000000000000000000000000900460ff161561062057600080fd5b600054610633908363ffffffff610c7816565b6000908155600160a060020a03841681526001602052604090205461065e908363ffffffff610c7816565b600160a060020a0384166000818152600160205260409081902092909255907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859084905190815260200160405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a03331660009081526001602052604081205482111561071d57600080fd5b5033600160a060020a0381166000908152600160205260409020546107429083610c8b565b600160a060020a0382166000908152600160205260408120919091555461076f908363ffffffff610c8b16565b600055600160a060020a0381167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405190815260200160405180910390a25050565b60035460b060020a900460ff1681565b600354600090839060b060020a900460ff16806107f85750600160a060020a03811660009081526004602052604090205460ff165b151561080357600080fd5b6104cd8484610c9d565b600160a060020a031660009081526001602052604090205490565b60035460009033600160a060020a0390811691161461084657600080fd5b60035474010000000000000000000000000000000000000000900460ff161561086e57600080fd5b6003805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790557fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a150600190565b600354600160a060020a031681565b60408051908101604052600381527f5842580000000000000000000000000000000000000000000000000000000000602082015281565b600354600090339060b060020a900460ff16806109505750600160a060020a03811660009081526004602052604090205460ff165b151561095b57600080fd5b6104cd8484610d97565b60046020526000908152604090205460ff1681565b600354600090839060b060020a900460ff16806109af5750600160a060020a03811660009081526004602052604090205460ff165b15156109ba57600080fd5b6104cd8484610e92565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610a0a57600080fd5b600160a060020a0381161515610a1f57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000600160a060020a0383161515610b0d57600080fd5b600160a060020a038416600090815260016020526040902054821115610b3257600080fd5b600160a060020a0380851660009081526002602090815260408083203390941683529290522054821115610b6557600080fd5b600160a060020a038416600090815260016020526040902054610b8e908363ffffffff610c8b16565b600160a060020a038086166000908152600160205260408082209390935590851681522054610bc3908363ffffffff610c7816565b600160a060020a03808516600090815260016020908152604080832094909455878316825260028152838220339093168252919091522054610c0b908363ffffffff610c8b16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b81810182811015610c8557fe5b92915050565b600082821115610c9757fe5b50900390565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205480831115610cfa57600160a060020a033381166000908152600260209081526040808320938816835292905290812055610d31565b610d0a818463ffffffff610c8b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b6000600160a060020a0383161515610dae57600080fd5b600160a060020a033316600090815260016020526040902054821115610dd357600080fd5b600160a060020a033316600090815260016020526040902054610dfc908363ffffffff610c8b16565b600160a060020a033381166000908152600160205260408082209390935590851681522054610e31908363ffffffff610c7816565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610eca908363ffffffff610c7816565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a3506001929150505600a165627a7a723058200efd0781f4c658cb7ff11b8836b3d1d1427b8d3eac4d0e0c5594a36772d4a8aa0029606060405260008054600160a060020a033316600160a060020a031990911617905561042e806100306000396000f3006060604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630548e5a2811461007c5780633d8270f5146100b95780634f3d520c146101135780638da5cb5b146101465780639b19251a14610175578063f2fde38b14610194575b600080fd5b341561008757600080fd5b6100b7600160a060020a0360043581169060243515159061ffff60443581169160643590911690608435166101b3565b005b34156100c457600080fd5b6100d8600160a060020a0360043516610298565b604051931515845261ffff9283166020850152600160a060020a03909116604080850191909152911660608301526080909101905180910390f35b341561011e57600080fd5b610132600160a060020a03600435166102ea565b604051901515815260200160405180910390f35b341561015157600080fd5b610159610308565b604051600160a060020a03909116815260200160405180910390f35b341561018057600080fd5b6100d8600160a060020a0360043516610317565b341561019f57600080fd5b6100b7600160a060020a0360043516610367565b6000805433600160a060020a039081169116146101cf57600080fd5b61271061ffff8516106101e157600080fd5b61271061ffff8416106101f357600080fd5b50600160a060020a039485166000908152600160205260409020805460ff19169415159490941762ffff00191661010061ffff948516021776ffffffffffffffffffffffffffffffffffffffff0000001916630100000091909516029390931778ffff00000000000000000000000000000000000000000000001916770100000000000000000000000000000000000000000000009390911692909202919091179055565b600160a060020a0390811660009081526001602052604090205460ff81169261ffff61010083048116936301000000840416927701000000000000000000000000000000000000000000000090041690565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a031681565b60016020526000908152604090205460ff81169061ffff6101008204811691600160a060020a03630100000082041691770100000000000000000000000000000000000000000000009091041684565b60005433600160a060020a0390811691161461038257600080fd5b600160a060020a038116151561039757600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a723058207bcf3c60cd38a4758b5d02e7a04f9b910a85a7c9b92823136e686d0f6b8f345f0029a165627a7a723058209a6e246ad122cb86394438f311a76d1c6ff50a2d16772c0688dd1d4fd7e7c3360029
Swarm Source
bzzr://9a6e246ad122cb86394438f311a76d1c6ff50a2d16772c0688dd1d4fd7e7c336
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.