More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,072 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 4283891 | 2583 days ago | IN | 1.685 ETH | 0.0075 | ||||
Buy | 4256854 | 2590 days ago | IN | 0.16 ETH | 0.0063 | ||||
Buy | 4256822 | 2590 days ago | IN | 0.16615841 ETH | 0.0063 | ||||
Finalize | 4254341 | 2591 days ago | IN | 0 ETH | 0.00057293 | ||||
Finalize | 4254209 | 2591 days ago | IN | 0 ETH | 0.0005 | ||||
Finalize | 4254208 | 2591 days ago | IN | 0 ETH | 0.0005 | ||||
Buy | 4254091 | 2591 days ago | IN | 4 ETH | 0.00346325 | ||||
Buy | 4254058 | 2591 days ago | IN | 14.8 ETH | 0.00220787 | ||||
Buy | 4253871 | 2591 days ago | IN | 20 ETH | 0.00346325 | ||||
Buy | 4253819 | 2591 days ago | IN | 100 ETH | 0.00346325 | ||||
Buy | 4253810 | 2591 days ago | IN | 0.05 ETH | 0.00290913 | ||||
Buy | 4253599 | 2591 days ago | IN | 16.8 ETH | 0.00346325 | ||||
Buy | 4253465 | 2591 days ago | IN | 0.04 ETH | 0 | ||||
Buy | 4253297 | 2591 days ago | IN | 3.185 ETH | 0.00185461 | ||||
Buy | 4253285 | 2591 days ago | IN | 1 ETH | 0.00346325 | ||||
Buy | 4253242 | 2591 days ago | IN | 1 ETH | 0.00290913 | ||||
Buy | 4253176 | 2591 days ago | IN | 2 ETH | 0.00290913 | ||||
Transfer | 4253123 | 2591 days ago | IN | 2 ETH | 0.00063 | ||||
Transfer | 4253102 | 2591 days ago | IN | 2 ETH | 0.00063 | ||||
Buy | 4253047 | 2591 days ago | IN | 0.322879 ETH | 0.00290913 | ||||
Buy | 4252962 | 2591 days ago | IN | 1 ETH | 0.00346325 | ||||
Buy | 4252812 | 2591 days ago | IN | 1.47 ETH | 0.00290913 | ||||
Buy | 4252725 | 2591 days ago | IN | 2 ETH | 0.00346325 | ||||
Buy | 4252606 | 2592 days ago | IN | 1.2 ETH | 0.00220787 | ||||
Buy | 4252432 | 2592 days ago | IN | 3.4 ETH | 0.00220787 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4254091 | 2591 days ago | 4 ETH | ||||
4254058 | 2591 days ago | 14.8 ETH | ||||
4253871 | 2591 days ago | 20 ETH | ||||
4253819 | 2591 days ago | 100 ETH | ||||
4253810 | 2591 days ago | 0.05 ETH | ||||
4253599 | 2591 days ago | 16.8 ETH | ||||
4253465 | 2591 days ago | 0.04 ETH | ||||
4253297 | 2591 days ago | 3.185 ETH | ||||
4253285 | 2591 days ago | 1 ETH | ||||
4253242 | 2591 days ago | 1 ETH | ||||
4253176 | 2591 days ago | 2 ETH | ||||
4253047 | 2591 days ago | 0.322879 ETH | ||||
4252962 | 2591 days ago | 1 ETH | ||||
4252812 | 2591 days ago | 1.47 ETH | ||||
4252725 | 2591 days ago | 2 ETH | ||||
4252606 | 2592 days ago | 1.2 ETH | ||||
4252432 | 2592 days ago | 3.4 ETH | ||||
4252377 | 2592 days ago | 2 ETH | ||||
4252131 | 2592 days ago | 5 ETH | ||||
4252108 | 2592 days ago | 1 ETH | ||||
4252082 | 2592 days ago | 0.42 ETH | ||||
4251979 | 2592 days ago | 2 ETH | ||||
4251860 | 2592 days ago | 21.4937 ETH | ||||
4251820 | 2592 days ago | 29.5 ETH | ||||
4251817 | 2592 days ago | 0.43 ETH |
Loading...
Loading
Contract Name:
HubiiCrowdsale
Compiler Version
v0.4.13+commit.fb4cb1a
Optimization Enabled:
Yes with 0 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2017-08-22 */ pragma solidity ^0.4.13; /** * @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; /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() { 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) onlyOwner { require(newOwner != address(0)); owner = newOwner; } } /** * Abstract contract that allows children to implement an * emergency stop mechanism. Differs from Pausable by causing a throw when in halt mode. * */ contract Haltable is Ownable { bool public halted; event Halted(bool halted); modifier stopInEmergency { require(!halted); _; } modifier onlyInEmergency { require(halted); _; } // called by the owner on emergency, triggers stopped state function halt() external onlyOwner { halted = true; Halted(true); } // called by the owner on end of emergency, returns to normal state function unhalt() external onlyOwner onlyInEmergency { halted = false; Halted(false); } } /** * Math operations with safety checks */ library SafeMath { function mul(uint a, uint b) internal returns (uint) { uint c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint a, uint b) internal returns (uint) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint a, uint b) internal returns (uint) { assert(b <= a); return a - b; } function add(uint a, uint b) internal returns (uint) { uint c = a + b; assert(c >= a); return c; } function max64(uint64 a, uint64 b) internal constant returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal constant returns (uint64) { return a < b ? a : b; } function max256(uint a, uint b) internal constant returns (uint) { return a >= b ? a : b; } function min256(uint a, uint b) internal constant returns (uint) { return a < b ? a : b; } } /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20Basic { uint public totalSupply; function balanceOf(address who) public constant returns (uint); function transfer(address to, uint value) public returns (bool ok); event Transfer(address indexed from, address indexed to, uint value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public constant returns (uint); function transferFrom(address from, address to, uint value) public returns (bool ok); function approve(address spender, uint value) public returns (bool ok); event Approval(address indexed owner, address indexed spender, uint value); } /** * A token that defines fractional units as decimals. */ contract FractionalERC20 is ERC20 { uint8 public decimals; } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint; mapping(address => uint) balances; /** * Obsolete. Removed this check based on: * https://blog.coinfabrik.com/smart-contract-short-address-attack-mitigation-failure/ * @dev Fix for the ERC20 short address attack. * * modifier onlyPayloadSize(uint size) { * require(msg.data.length >= size + 4); * _; * } */ /** * @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, uint _value) public returns (bool success) { balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint representing the amount owned by the passed address. */ function balanceOf(address _owner) public constant returns (uint balance) { return balances[_owner]; } } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 */ contract StandardToken is BasicToken, ERC20 { /* Token supply got increased and a new owner received these tokens */ event Minted(address receiver, uint amount); mapping (address => mapping (address => uint)) allowed; /* Interface declaration */ function isToken() public constant returns (bool weAre) { return true; } /** * @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 uint the amout of tokens to be transfered */ function transferFrom(address _from, address _to, uint _value) public returns (bool success) { uint _allowance = allowed[_from][msg.sender]; // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met // require(_value <= _allowance); // SafeMath uses assert instead of require though, beware when using an analysis tool balances[_to] = balances[_to].add(_value); balances[_from] = balances[_from].sub(_value); allowed[_from][msg.sender] = _allowance.sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Aprove the passed address to spend the specified amount of tokens on behalf of msg.sender. * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint _value) public returns (bool success) { // To change the approve amount you first have to reduce the addresses' // allowance to zero by calling `approve(_spender, 0)` if it is not // already 0 to mitigate the race condition described here: // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 require (_value == 0 || allowed[msg.sender][_spender] == 0); allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens than 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 uint specifing the amount of tokens still avaible for the spender. */ function allowance(address _owner, address _spender) public constant returns (uint remaining) { return allowed[_owner][_spender]; } /** * Atomic increment of approved spending * * Works around https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * */ function addApproval(address _spender, uint _addedValue) public returns (bool success) { uint oldValue = allowed[msg.sender][_spender]; allowed[msg.sender][_spender] = oldValue.add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * Atomic decrement of approved spending. * * Works around https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 */ function subApproval(address _spender, uint _subtractedValue) public returns (bool success) { uint oldVal = allowed[msg.sender][_spender]; if (_subtractedValue > oldVal) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldVal.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } /** * Define interface for releasing the token transfer after a successful crowdsale. */ contract ReleasableToken is StandardToken, Ownable { /* The finalizer contract that allows lifting the transfer limits on this token */ address public releaseAgent; /** A crowdsale contract can release us to the wild if ICO success. If false we are are in transfer lock up period.*/ bool public released = false; /** Map of agents that are allowed to transfer tokens regardless of the lock down period. These are crowdsale contracts and possible the team multisig itself. */ mapping (address => bool) public transferAgents; /** * Set the contract that can call release and make the token transferable. * * Since the owner of this contract is (or should be) the crowdsale, * it can only be called by a corresponding exposed API in the crowdsale contract in case of input error. */ function setReleaseAgent(address addr) onlyOwner inReleaseState(false) public { // We don't do interface check here as we might want to have a normal wallet address to act as a release agent. releaseAgent = addr; } /** * Owner can allow a particular address (e.g. a crowdsale contract) to transfer tokens despite the lock up period. */ function setTransferAgent(address addr, bool state) onlyOwner inReleaseState(false) public { transferAgents[addr] = state; } /** * One way function to release the tokens into the wild. * * Can be called only from the release agent that should typically be the finalize agent ICO contract. * In the scope of the crowdsale, it is only called if the crowdsale has been a success (first milestone reached). */ function releaseTokenTransfer() public onlyReleaseAgent { released = true; } /** * Limit token transfer until the crowdsale is over. */ modifier canTransfer(address _sender) { require(released || transferAgents[_sender]); _; } /** The function can be called only before or after the tokens have been released */ modifier inReleaseState(bool releaseState) { require(releaseState == released); _; } /** The function can be called only by a whitelisted release agent. */ modifier onlyReleaseAgent() { require(msg.sender == releaseAgent); _; } /** We restrict transfer by overriding it */ function transfer(address _to, uint _value) public canTransfer(msg.sender) returns (bool success) { // Call StandardToken.transfer() return super.transfer(_to, _value); } /** We restrict transferFrom by overriding it */ function transferFrom(address _from, address _to, uint _value) public canTransfer(_from) returns (bool success) { // Call StandardToken.transferForm() return super.transferFrom(_from, _to, _value); } } /** * A token that can increase its supply by another contract. * * This allows uncapped crowdsale by dynamically increasing the supply when money pours in. * Only mint agents, contracts whitelisted by owner, can mint new tokens. * */ contract MintableToken is StandardToken, Ownable { using SafeMath for uint; bool public mintingFinished = false; /** List of agents that are allowed to create new tokens */ mapping (address => bool) public mintAgents; event MintingAgentChanged(address addr, bool state); function MintableToken(uint _initialSupply, address _multisig, bool _mintable) internal { require(_multisig != address(0)); // Cannot create a token without supply and no minting require(_mintable || _initialSupply != 0); // Create initially all balance on the team multisig if (_initialSupply > 0) mintInternal(_multisig, _initialSupply); // No more new supply allowed after the token creation mintingFinished = !_mintable; } /** * Create new tokens and allocate them to an address. * * Only callable by a crowdsale contract (mint agent). */ function mint(address receiver, uint amount) onlyMintAgent public { mintInternal(receiver, amount); } function mintInternal(address receiver, uint amount) canMint private { totalSupply = totalSupply.add(amount); balances[receiver] = balances[receiver].add(amount); // Removed because this may be confused with anonymous transfers in the upcoming fork. // This will make the mint transaction appear in EtherScan.io // We can remove this after there is a standardized minting event // Transfer(0, receiver, amount); Minted(receiver, amount); } /** * Owner can allow a crowdsale contract to mint new tokens. */ function setMintAgent(address addr, bool state) onlyOwner canMint public { mintAgents[addr] = state; MintingAgentChanged(addr, state); } modifier onlyMintAgent() { // Only mint agents are allowed to mint new tokens require(mintAgents[msg.sender]); _; } /** Make sure we are not done yet. */ modifier canMint() { require(!mintingFinished); _; } } /** * Upgrade agent transfers tokens to a new contract. * Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting. * * The Upgrade agent is the interface used to implement a token * migration in the case of an emergency. * The function upgradeFrom has to implement the part of the creation * of new tokens on behalf of the user doing the upgrade. * * The new token can implement this interface directly, or use. */ contract UpgradeAgent { /** This value should be the same as the original token's total supply */ uint public originalSupply; /** Interface to ensure the contract is correctly configured */ function isUpgradeAgent() public constant returns (bool) { return true; } /** Upgrade an account When the token contract is in the upgrade status the each user will have to call `upgrade(value)` function from UpgradeableToken. The upgrade function adjust the balance of the user and the supply of the previous token and then call `upgradeFrom(value)`. The UpgradeAgent is the responsible to create the tokens for the user in the new contract. * @param _from Account to upgrade. * @param _value Tokens to upgrade. */ function upgradeFrom(address _from, uint _value) public; } /** * A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision. * */ contract UpgradeableToken is StandardToken { /** Contract / person who can set the upgrade path. This can be the same as team multisig wallet, as what it is with its default value. */ address public upgradeMaster; /** The next contract where the tokens will be migrated. */ UpgradeAgent public upgradeAgent; /** How many tokens we have upgraded by now. */ uint public totalUpgraded; /** * Upgrade states. * * - NotAllowed: The child contract has not reached a condition where the upgrade can bgun * - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet * - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet * - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens * */ enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading} /** * Somebody has upgraded some of his tokens. */ event Upgrade(address indexed _from, address indexed _to, uint _value); /** * New upgrade agent available. */ event UpgradeAgentSet(address agent); /** * Do not allow construction without upgrade master set. */ function UpgradeableToken(address _upgradeMaster) { setUpgradeMaster(_upgradeMaster); } /** * Allow the token holder to upgrade some of their tokens to a new contract. */ function upgrade(uint value) public { UpgradeState state = getUpgradeState(); // Ensure it's not called in a bad state require(state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading); // Validate input value. require(value != 0); balances[msg.sender] = balances[msg.sender].sub(value); // Take tokens out from circulation totalSupply = totalSupply.sub(value); totalUpgraded = totalUpgraded.add(value); // Upgrade agent reissues the tokens upgradeAgent.upgradeFrom(msg.sender, value); Upgrade(msg.sender, upgradeAgent, value); } /** * Set an upgrade agent that handles the upgrade process */ function setUpgradeAgent(address agent) external { // Check whether the token is in a state that we could think of upgrading require(canUpgrade()); require(agent != 0x0); // Only a master can designate the next agent require(msg.sender == upgradeMaster); // Upgrade has already begun for an agent require(getUpgradeState() != UpgradeState.Upgrading); upgradeAgent = UpgradeAgent(agent); // Bad interface require(upgradeAgent.isUpgradeAgent()); // Make sure that token supplies match in source and target require(upgradeAgent.originalSupply() == totalSupply); UpgradeAgentSet(upgradeAgent); } /** * Get the state of the token upgrade. */ function getUpgradeState() public constant returns(UpgradeState) { if (!canUpgrade()) return UpgradeState.NotAllowed; else if (address(upgradeAgent) == 0x00) return UpgradeState.WaitingForAgent; else if (totalUpgraded == 0) return UpgradeState.ReadyToUpgrade; else return UpgradeState.Upgrading; } /** * Change the upgrade master. * * This allows us to set a new owner for the upgrade mechanism. */ function changeUpgradeMaster(address new_master) public { require(msg.sender == upgradeMaster); setUpgradeMaster(new_master); } /** * Internal upgrade master setter. */ function setUpgradeMaster(address new_master) private { require(new_master != 0x0); upgradeMaster = new_master; } /** * Child contract can enable to provide the condition when the upgrade can begin. */ function canUpgrade() public constant returns(bool) { return true; } } /** * A crowdsale token. * * An ERC-20 token designed specifically for crowdsales with investor protection and further development path. * * - The token transfer() is disabled until the crowdsale is over * - The token contract gives an opt-in upgrade path to a new contract * - The same token can be part of several crowdsales through the approve() mechanism * - The token can be capped (supply set in the constructor) or uncapped (crowdsale contract can mint new tokens) * */ contract CrowdsaleToken is ReleasableToken, MintableToken, UpgradeableToken, FractionalERC20 { event UpdatedTokenInformation(string newName, string newSymbol); string public name; string public symbol; /** * Construct the token. * * This token must be created through a team multisig wallet, so that it is owned by that wallet. * * @param _name Token name * @param _symbol Token symbol - typically it's all caps * @param _initialSupply How many tokens we start with * @param _decimals Number of decimal places * @param _mintable Are new tokens created over the crowdsale or do we distribute only the initial supply? Note that when the token becomes transferable the minting always ends. */ function CrowdsaleToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals, address _multisig, bool _mintable) UpgradeableToken(_multisig) MintableToken(_initialSupply, _multisig, _mintable) { name = _name; symbol = _symbol; decimals = _decimals; } /** * When token is released to be transferable, prohibit new token creation. */ function releaseTokenTransfer() public onlyReleaseAgent { mintingFinished = true; super.releaseTokenTransfer(); } /** * Allow upgrade agent functionality to kick in only if the crowdsale was a success. */ function canUpgrade() public constant returns(bool) { return released && super.canUpgrade(); } /** * Owner can update token information here */ function setTokenInformation(string _name, string _symbol) onlyOwner { name = _name; symbol = _symbol; UpdatedTokenInformation(name, symbol); } } /** * Abstract base contract for token sales. * * Handles * - start and end dates * - accepting investments * - minimum funding goal and refund * - various statistics during the crowdfund * - different pricing strategies * - different investment policies (require server side customer id, allow only whitelisted addresses) * */ contract Crowdsale is Haltable { using SafeMath for uint; /* The token we are selling */ CrowdsaleToken public token; /* How we are going to price our offering */ PricingStrategy public pricingStrategy; /* How we are going to limit our offering */ CeilingStrategy public ceilingStrategy; /* Post-success callback */ FinalizeAgent public finalizeAgent; /* ether will be transferred to this address */ address public multisigWallet; /* if the funding goal is not reached, investors may withdraw their funds */ uint public minimumFundingGoal; /* the funding cannot exceed this cap; may be set later on during the crowdsale */ uint public weiFundingCap = 0; /* the starting block number of the crowdsale */ uint public startsAt; /* the ending block number of the crowdsale */ uint public endsAt; /* the number of tokens already sold through this contract*/ uint public tokensSold = 0; /* How many wei of funding we have raised */ uint public weiRaised = 0; /* How many distinct addresses have invested */ uint public investorCount = 0; /* How many wei we have returned back to the contract after a failed crowdfund. */ uint public loadedRefund = 0; /* How many wei we have given back to investors.*/ uint public weiRefunded = 0; /* Has this crowdsale been finalized */ bool public finalized; /* Do we need to have a unique contributor id for each customer */ bool public requireCustomerId; /** How many ETH each address has invested in this crowdsale */ mapping (address => uint) public investedAmountOf; /** How many tokens this crowdsale has credited for each investor address */ mapping (address => uint) public tokenAmountOf; /** Addresses that are allowed to invest even before ICO offical opens. For testing, for ICO partners, etc. */ mapping (address => bool) public earlyParticipantWhitelist; /** This is for manual testing of the interaction with the owner's wallet. You can set it to any value and inspect this in a blockchain explorer to see that crowdsale interaction works. */ uint8 public ownerTestValue; /** State machine * * - Prefunding: We have not reached the starting block yet * - Funding: Active crowdsale * - Success: Minimum funding goal reached * - Failure: Minimum funding goal not reached before the ending block * - Finalized: The finalize function has been called and succesfully executed * - Refunding: Refunds are loaded on the contract to be reclaimed by investors. */ enum State{Unknown, PreFunding, Funding, Success, Failure, Finalized, Refunding} // A new investment was made event Invested(address investor, uint weiAmount, uint tokenAmount, uint128 customerId); // Refund was processed for a contributor event Refund(address investor, uint weiAmount); // The rules about what kind of investments we accept were changed event InvestmentPolicyChanged(bool requireCId); // Address early participation whitelist status changed event Whitelisted(address addr, bool status); // Crowdsale's finalize function has been called event Finalized(); // A new funding cap has been set event FundingCapSet(uint newFundingCap); function Crowdsale(address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal) internal { setMultisig(_multisigWallet); // Don't mess the dates require(_start != 0 && _end != 0); require(block.number < _start && _start < _end); startsAt = _start; endsAt = _end; // Minimum funding goal can be zero minimumFundingGoal = _minimumFundingGoal; } /** * Don't expect to just send in money and get tokens. */ function() payable { require(false); } /** * Make an investment. * * Crowdsale must be running for one to invest. * We must have not pressed the emergency brake. * * @param receiver The Ethereum address who receives the tokens * @param customerId (optional) UUID v4 to track the successful payments on the server side * */ function investInternal(address receiver, uint128 customerId) stopInEmergency notFinished private { // Determine if it's a good time to accept investment from this participant if (getState() == State.PreFunding) { // Are we whitelisted for early deposit require(earlyParticipantWhitelist[receiver]); } uint weiAmount = ceilingStrategy.weiAllowedToReceive(msg.value, weiRaised, investedAmountOf[receiver], weiFundingCap); uint tokenAmount = pricingStrategy.calculatePrice(weiAmount, weiRaised, tokensSold, msg.sender, token.decimals()); // Dust transaction if no tokens can be given require(tokenAmount != 0); if (investedAmountOf[receiver] == 0) { // A new investor investorCount++; } updateInvestorFunds(tokenAmount, weiAmount, receiver, customerId); // Pocket the money multisigWallet.transfer(weiAmount); // Return excess of money uint weiToReturn = msg.value.sub(weiAmount); if (weiToReturn > 0) { msg.sender.transfer(weiToReturn); } } /** * Preallocate tokens for the early investors. * * Preallocated tokens have been sold before the actual crowdsale opens. * This function mints the tokens and moves the crowdsale needle. * * No money is exchanged, as the crowdsale team already have received the payment. * * @param fullTokens tokens as full tokens - decimal places added internally * @param weiPrice Price of a single full token in wei * */ function preallocate(address receiver, uint fullTokens, uint weiPrice) public onlyOwner notFinished { require(receiver != address(0)); uint tokenAmount = fullTokens.mul(10**uint(token.decimals())); require(tokenAmount != 0); uint weiAmount = weiPrice.mul(tokenAmount); // This can also be 0, in which case we give out tokens for free updateInvestorFunds(tokenAmount, weiAmount, receiver , 0); } /** * Private function to update accounting in the crowdsale. */ function updateInvestorFunds(uint tokenAmount, uint weiAmount, address receiver, uint128 customerId) private { // Update investor investedAmountOf[receiver] = investedAmountOf[receiver].add(weiAmount); tokenAmountOf[receiver] = tokenAmountOf[receiver].add(tokenAmount); // Update totals weiRaised = weiRaised.add(weiAmount); tokensSold = tokensSold.add(tokenAmount); assignTokens(receiver, tokenAmount); // Tell us that the investment was completed successfully Invested(receiver, weiAmount, tokenAmount, customerId); } /** * Allow the owner to set a funding cap on the crowdsale. * The new cap should be higher than the minimum funding goal. * * @param newCap minimum target cap that may be relaxed if it was already broken. */ function setFundingCap(uint newCap) public onlyOwner notFinished { weiFundingCap = ceilingStrategy.relaxFundingCap(newCap, weiRaised); require(weiFundingCap >= minimumFundingGoal); FundingCapSet(weiFundingCap); } /** * Invest to tokens, recognize the payer. * */ function buyWithCustomerId(uint128 customerId) public payable { require(customerId != 0); // UUIDv4 sanity check investInternal(msg.sender, customerId); } /** * The basic entry point to participate in the crowdsale process. * * Pay for funding, get invested tokens back in the sender address. */ function buy() public payable { require(!requireCustomerId); // Crowdsale needs to track participants for thank you email investInternal(msg.sender, 0); } /** * Finalize a succcesful crowdsale. * * The owner can trigger a call the contract that provides post-crowdsale actions, like releasing the tokens. */ function finalize() public inState(State.Success) onlyOwner stopInEmergency { finalizeAgent.finalizeCrowdsale(token); finalized = true; Finalized(); } /** * Set policy do we need to have server-side customer ids for the investments. * */ function setRequireCustomerId(bool value) public onlyOwner stopInEmergency { requireCustomerId = value; InvestmentPolicyChanged(requireCustomerId); } /** * Allow addresses to do early participation. * */ function setEarlyParticipantWhitelist(address addr, bool status) public onlyOwner notFinished stopInEmergency { earlyParticipantWhitelist[addr] = status; Whitelisted(addr, status); } /** * Allow to (re)set pricing strategy. */ function setPricingStrategy(PricingStrategy addr) internal { // Disallow setting a bad agent require(addr.isPricingStrategy()); pricingStrategy = addr; } /** * Allow to (re)set ceiling strategy. */ function setCeilingStrategy(CeilingStrategy addr) internal { // Disallow setting a bad agent require(addr.isCeilingStrategy()); ceilingStrategy = addr; } /** * Allow to (re)set finalize agent. */ function setFinalizeAgent(FinalizeAgent addr) internal { // Disallow setting a bad agent require(addr.isFinalizeAgent()); finalizeAgent = addr; require(isFinalizerSane()); } /** * Internal setter for the multisig wallet */ function setMultisig(address addr) internal { require(addr != 0); multisigWallet = addr; } /** * Allow load refunds back on the contract for the refunding. * * The team can transfer the funds back on the smart contract in the case that the minimum goal was not reached. */ function loadRefund() public payable inState(State.Failure) stopInEmergency { require(msg.value >= weiRaised); require(weiRefunded == 0); uint excedent = msg.value.sub(weiRaised); loadedRefund = loadedRefund.add(msg.value.sub(excedent)); investedAmountOf[msg.sender].add(excedent); } /** * Investors can claim refund. */ function refund() public inState(State.Refunding) stopInEmergency { uint weiValue = investedAmountOf[msg.sender]; require(weiValue != 0); investedAmountOf[msg.sender] = 0; weiRefunded = weiRefunded.add(weiValue); Refund(msg.sender, weiValue); msg.sender.transfer(weiValue); } /** * @return true if the crowdsale has raised enough money to be a success */ function isMinimumGoalReached() public constant returns (bool reached) { return weiRaised >= minimumFundingGoal; } /** * Check if the contract relationship looks good. */ function isFinalizerSane() public constant returns (bool sane) { return finalizeAgent.isSane(token); } /** * Crowdfund state machine management. * * This function has the timed transition builtin. * So there is no chance of the variable being stale. */ function getState() public constant returns (State) { if (finalized) return State.Finalized; else if (block.number < startsAt) return State.PreFunding; else if (block.number <= endsAt && !ceilingStrategy.isCrowdsaleFull(weiRaised, weiFundingCap)) return State.Funding; else if (isMinimumGoalReached()) return State.Success; else if (!isMinimumGoalReached() && weiRaised > 0 && loadedRefund >= weiRaised) return State.Refunding; else return State.Failure; } /** This is for manual testing of multisig wallet interaction */ function setOwnerTestValue(uint8 val) public onlyOwner stopInEmergency { ownerTestValue = val; } function assignTokens(address receiver, uint tokenAmount) private { token.mint(receiver, tokenAmount); } /** Interface marker. */ function isCrowdsale() public constant returns (bool) { return true; } // // Modifiers // /** Modifier allowing execution only if the crowdsale is currently running. */ modifier inState(State state) { require(getState() == state); _; } modifier notFinished() { State current_state = getState(); require(current_state == State.PreFunding || current_state == State.Funding); _; } } /** * Interface for defining crowdsale pricing. */ contract PricingStrategy { /** Interface declaration. */ function isPricingStrategy() public constant returns (bool) { return true; } /** * When somebody tries to buy tokens for X eth, calculate how many tokens they get. * * * @param value - What is the value of the transaction sent in as wei * @param weiRaised - how much money has been raised this far * @param tokensSold - how many tokens have been sold this far * @param msgSender - who is the investor of this transaction * @param decimals - how many decimal units the token has * @return Amount of tokens the investor receives */ function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint tokenAmount); } /** * Fixed crowdsale pricing - everybody gets the same price. */ contract FlatPricing is PricingStrategy { using SafeMath for uint; /* How many weis one token costs */ uint public oneTokenInWei; function FlatPricing(uint _oneTokenInWei) { oneTokenInWei = _oneTokenInWei; } /** * Calculate the current price for buy in amount. * * @ param {uint value} Buy-in value in wei. * @ param * @ param * @ param * @ param {uint decimals} The decimals used by the token representation (e.g. given by FractionalERC20). */ function calculatePrice(uint value, uint, uint, address, uint decimals) public constant returns (uint) { uint multiplier = 10 ** decimals; return value.mul(multiplier).div(oneTokenInWei); } } /** * Interface for defining crowdsale ceiling. */ contract CeilingStrategy { /** Interface declaration. */ function isCeilingStrategy() public constant returns (bool) { return true; } /** * When somebody tries to buy tokens for X wei, calculate how many weis they are allowed to use. * * * @param _value - What is the value of the transaction sent in as wei. * @param _weiRaised - How much money has been raised so far. * @param _weiInvestedBySender - the investment made by the address that is sending the transaction. * @param _weiFundingCap - the caller's declared total cap. May be reinterpreted by the implementation of the CeilingStrategy. * @return Amount of wei the crowdsale can receive. */ function weiAllowedToReceive(uint _value, uint _weiRaised, uint _weiInvestedBySender, uint _weiFundingCap) public constant returns (uint amount); function isCrowdsaleFull(uint _weiRaised, uint _weiFundingCap) public constant returns (bool); /** * Calculate a new cap if the provided one is not above the amount already raised. * * * @param _newCap - The potential new cap. * @param _weiRaised - How much money has been raised so far. * @return The adjusted cap. */ function relaxFundingCap(uint _newCap, uint _weiRaised) public constant returns (uint); } /** * Fixed cap investment per address and crowdsale */ contract FixedCeiling is CeilingStrategy { using SafeMath for uint; /* When relaxing a cap is necessary, we use this multiple to determine the relaxed cap */ uint public chunkedWeiMultiple; /* The limit an individual address can invest */ uint public weiLimitPerAddress; function FixedCeiling(uint multiple, uint limit) { chunkedWeiMultiple = multiple; weiLimitPerAddress = limit; } function weiAllowedToReceive(uint tentativeAmount, uint weiRaised, uint weiInvestedBySender, uint weiFundingCap) public constant returns (uint) { // First, we limit per address investment uint totalOfSender = tentativeAmount.add(weiInvestedBySender); if (totalOfSender > weiLimitPerAddress) tentativeAmount = weiLimitPerAddress.sub(weiInvestedBySender); // Then, we check the funding cap if (weiFundingCap == 0) return tentativeAmount; uint total = tentativeAmount.add(weiRaised); if (total < weiFundingCap) return tentativeAmount; else return weiFundingCap.sub(weiRaised); } function isCrowdsaleFull(uint weiRaised, uint weiFundingCap) public constant returns (bool) { return weiFundingCap > 0 && weiRaised >= weiFundingCap; } /* If the new target cap has not been reached yet, it's fine as it is */ function relaxFundingCap(uint newCap, uint weiRaised) public constant returns (uint) { if (newCap > weiRaised) return newCap; else return weiRaised.div(chunkedWeiMultiple).add(1).mul(chunkedWeiMultiple); } } /** * Finalize agent defines what happens at the end of a succesful crowdsale. * * - Allocate tokens for founders, bounties and community * - Make tokens transferable * - etc. */ contract FinalizeAgent { function isFinalizeAgent() public constant returns(bool) { return true; } /** Return true if we can run finalizeCrowdsale() properly. * * This is a safety check function that doesn't allow crowdsale to begin * unless the finalizer has been set up properly. */ function isSane(CrowdsaleToken token) public constant returns (bool); /** Called once by crowdsale finalize() if the sale was a success. */ function finalizeCrowdsale(CrowdsaleToken token) public; } /** * At the end of the successful crowdsale allocate % bonus of tokens to the team. * * Unlock tokens. * * BonusAllocationFinal must be set as the minting agent for the MintableToken. * */ contract BonusFinalizeAgent is FinalizeAgent { using SafeMath for uint; Crowdsale public crowdsale; /** Total percent of tokens minted to the team at the end of the sale as base points bonus tokens = tokensSold * bonusBasePoints * 0.0001 */ uint public bonusBasePoints; /** Implementation detail. This is the divisor of the base points **/ uint private constant basePointsDivisor = 10000; /** Where we move the tokens at the end of the sale. */ address public teamMultisig; /* How many bonus tokens we allocated */ uint public allocatedBonus; function BonusFinalizeAgent(Crowdsale _crowdsale, uint _bonusBasePoints, address _teamMultisig) { require(address(_crowdsale) != 0 && address(_teamMultisig) != 0); crowdsale = _crowdsale; teamMultisig = _teamMultisig; bonusBasePoints = _bonusBasePoints; } /* Can we run finalize properly */ function isSane(CrowdsaleToken token) public constant returns (bool) { return token.mintAgents(address(this)) && token.releaseAgent() == address(this); } /** Called once by crowdsale finalize() if the sale was a success. */ function finalizeCrowdsale(CrowdsaleToken token) { require(msg.sender == address(crowdsale)); // How many % points of tokens the founders and others get uint tokensSold = crowdsale.tokensSold(); uint saleBasePoints = basePointsDivisor.sub(bonusBasePoints); allocatedBonus = tokensSold.mul(bonusBasePoints).div(saleBasePoints); // Move tokens to the team multisig wallet token.mint(teamMultisig, allocatedBonus); // Make token transferable token.releaseTokenTransfer(); } } // This contract has the sole objective of providing a sane concrete instance of the Crowdsale contract. contract HubiiCrowdsale is Crowdsale { uint private constant chunked_multiple = 18000 * (10 ** 18); // in wei uint private constant limit_per_address = 100000 * (10 ** 18); // in wei uint private constant hubii_minimum_funding = 17000 * (10 ** 18); // in wei uint private constant token_initial_supply = 0; uint8 private constant token_decimals = 15; bool private constant token_mintable = true; string private constant token_name = "Hubiits"; string private constant token_symbol = "HBT"; uint private constant token_in_wei = 10 ** 15; // The fraction of 10,000 out of the total target tokens that is used to mint bonus tokens. These are allocated to the team's multisig wallet. uint private constant bonus_base_points = 3000; function HubiiCrowdsale(address _teamMultisig, uint _start, uint _end) Crowdsale(_teamMultisig, _start, _end, hubii_minimum_funding) public { PricingStrategy p_strategy = new FlatPricing(token_in_wei); CeilingStrategy c_strategy = new FixedCeiling(chunked_multiple, limit_per_address); FinalizeAgent f_agent = new BonusFinalizeAgent(this, bonus_base_points, _teamMultisig); setPricingStrategy(p_strategy); setCeilingStrategy(c_strategy); // Testing values token = new CrowdsaleToken(token_name, token_symbol, token_initial_supply, token_decimals, _teamMultisig, token_mintable); token.setMintAgent(address(this), true); token.setMintAgent(address(f_agent), true); token.setReleaseAgent(address(f_agent)); setFinalizeAgent(f_agent); } // These two setters are present only to correct block numbers if they are off from their target date by more than, say, a day function setStartingBlock(uint startingBlock) public onlyOwner inState(State.PreFunding) { require(startingBlock > block.number && startingBlock < endsAt); startsAt = startingBlock; } function setEndingBlock(uint endingBlock) public onlyOwner notFinished { require(endingBlock > block.number && endingBlock > startsAt); endsAt = endingBlock; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"ownerTestValue","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"requireCustomerId","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumFundingGoal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investedAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalizeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newCap","type":"uint256"}],"name":"setFundingCap","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"fullTokens","type":"uint256"},{"name":"weiPrice","type":"uint256"}],"name":"preallocate","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsale","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"endingBlock","type":"uint256"}],"name":"setEndingBlock","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiFundingCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"status","type":"bool"}],"name":"setEarlyParticipantWhitelist","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRefunded","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pricingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"loadedRefund","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isMinimumGoalReached","outputs":[{"name":"reached","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setRequireCustomerId","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"loadRefund","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"multisigWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"customerId","type":"uint128"}],"name":"buyWithCustomerId","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"isFinalizerSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint8"}],"name":"setOwnerTestValue","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"earlyParticipantWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unhalt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"startingBlock","type":"uint256"}],"name":"setStartingBlock","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ceilingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_teamMultisig","type":"address"},{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint128"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requireCId","type":"bool"}],"name":"InvestmentPolicyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFundingCap","type":"uint256"}],"name":"FundingCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"halted","type":"bool"}],"name":"Halted","type":"event"}]
Contract Creation Code
606060405260006007556000600a556000600b556000600c556000600d556000600e5534156200002e57600080fd5b604051606080620049028339810160405280805191906020018051919060200180519150505b600080600085858569039992648a23c8a000005b5b60008054600160a060020a03191633600160a060020a03161790555b6200009e846401000000006200182d6200054882021704565b8215801590620000ad57508115155b1515620000b957600080fd5b8243108015620000c857508183105b1515620000d457600080fd5b6008839055600982905560068190555b5050505066038d7ea4c68000620000fa62000833565b908152602001604051809103906000f08015156200011757600080fd5b92506903cfc82e37e9a740000069152d02c7e14af68000006200013962000844565b918252602082015260409081019051809103906000f08015156200015c57600080fd5b915030610bb8876200016d62000855565b600160a060020a039384168152602081019290925290911660408083019190915260609091019051809103906000f0801515620001a957600080fd5b9050620001c483640100000000620018616200057d82021704565b620001dd82640100000000620018ec6200062482021704565b604080519081016040908152600782527f487562696974730000000000000000000000000000000000000000000000000060208301528051908101604052600381527f484254000000000000000000000000000000000000000000000000000000000060208201526000600f8960016200025662000866565b6040810185905260ff84166060820152600160a060020a038316608082015281151560a082015260c080825281906020820190820189818151815260200191508051906020019080838360005b83811015620002be5780820151818401525b602001620002a3565b50505050905090810190601f168015620002ec5780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b83811015620003255780820151818401525b6020016200030a565b50505050905090810190601f168015620003535780820380516001836020036101000a031916815260200191505b5098505050505050505050604051809103906000f08015156200037557600080fd5b60018054600160a060020a031916600160a060020a03928316178082559091169063432146759030906040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b1515620003fd57600080fd5b6102c65a03f115156200040f57600080fd5b505060018054600160a060020a0316915063432146759083906040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a03909216600483015215156024820152604401600060405180830381600087803b15156200048757600080fd5b6102c65a03f115156200049957600080fd5b5050600154600160a060020a031690506329ff4f53826040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200050757600080fd5b6102c65a03f115156200051957600080fd5b5050506200053b81620006cb6401000000000262001977176401000000009004565b5b50505050505062000877565b600160a060020a03811615156200055e57600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620005dd57600080fd5b6102c65a03f11515620005ef57600080fd5b5050506040518051905015156200060557600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200068457600080fd5b6102c65a03f115156200069657600080fd5b505050604051805190501515620006ac57600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200072b57600080fd5b6102c65a03f115156200073d57600080fd5b5050506040518051905015156200075357600080fd5b60048054600160a060020a031916600160a060020a03831617905562000786640100000000620007968102620011021704565b15156200057a57600080fd5b5b50565b600454600154600091600160a060020a0390811691638e768288911683604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200081257600080fd5b6102c65a03f115156200082457600080fd5b50505060405180519150505b90565b6040516101ba80620022e883390190565b60405161034d80620024a283390190565b60405161057b80620027ef83390190565b604051611b988062002d6a83390190565b611a6180620008876000396000f300606060405236156101dd5763ffffffff60e060020a6000350416630226401d81146101eb57806303ca0eed146102145780630a09284a1461023b57806313f4e977146102605780631865c57d146102855780631aae3460146102bc57806321d5c0f6146102ed5780632a0139251461031c57806332013ac3146103345780634042b66f1461035b5780634551dd591461038057806346755c68146103a75780634bb278f3146103bf5780634da1b25d146103d4578063518ab2a8146103f957806358bad3eb1461041e578063590e1ae3146104445780635da89ac0146104595780635ed7ca5b1461047e57806378b99c2414610493578063797d9437146104c25780637c2e08a3146104e75780637f7d711e1461050e57806387612102146105285780638da5cb5b146105325780639075becf1461056157806397b150ca1461059057806399e9376c146105c1578063a6f2ae3a146105d7578063a7ba44c3146105e1578063af46868214610608578063b3f05b971461062d578063b9b8af0b14610654578063bb23ef741461067b578063cb16e6d014610696578063cb3e64fd146106c9578063d7e64c00146106de578063ec17b20e14610703578063ee51b8791461071b578063f2fde38b1461074a578063fc0c546a1461076b575b6101e95b600080fd5b5b565b005b34156101f657600080fd5b6101fe61079a565b60405160ff909116815260200160405180910390f35b341561021f57600080fd5b6102276107a3565b604051901515815260200160405180910390f35b341561024657600080fd5b61024e6107b1565b60405190815260200160405180910390f35b341561026b57600080fd5b61024e6107b7565b60405190815260200160405180910390f35b341561029057600080fd5b6102986107bd565b604051808260068111156102a857fe5b60ff16815260200191505060405180910390f35b34156102c757600080fd5b61024e600160a060020a03600435166108d1565b60405190815260200160405180910390f35b34156102f857600080fd5b6103006108e3565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b6101e96004356108f2565b005b341561033f57600080fd5b6101e9600160a060020a0360043516602435604435610a14565b005b341561036657600080fd5b61024e610b36565b60405190815260200160405180910390f35b341561038b57600080fd5b610227610b3c565b604051901515815260200160405180910390f35b34156103b257600080fd5b6101e9600435610b42565b005b34156103ca57600080fd5b6101e9610bc2565b005b34156103df57600080fd5b61024e610cc0565b60405190815260200160405180910390f35b341561040457600080fd5b61024e610cc6565b60405190815260200160405180910390f35b341561042957600080fd5b6101e9600160a060020a03600435166024351515610ccc565b005b341561044f57600080fd5b6101e9610db2565b005b341561046457600080fd5b61024e610ebe565b60405190815260200160405180910390f35b341561048957600080fd5b6101e9610ec4565b005b341561049e57600080fd5b610300610f1d565b604051600160a060020a03909116815260200160405180910390f35b34156104cd57600080fd5b61024e610f2c565b60405190815260200160405180910390f35b34156104f257600080fd5b610227610f32565b604051901515815260200160405180910390f35b341561051957600080fd5b6101e96004351515610f3e565b005b6101e9610fca565b005b341561053d57600080fd5b61030061108c565b604051600160a060020a03909116815260200160405180910390f35b341561056c57600080fd5b61030061109b565b604051600160a060020a03909116815260200160405180910390f35b341561059b57600080fd5b61024e600160a060020a03600435166110aa565b60405190815260200160405180910390f35b6101e96001608060020a03600435166110bc565b005b6101e96110df565b005b34156105ec57600080fd5b610227611102565b604051901515815260200160405180910390f35b341561061357600080fd5b61024e611184565b60405190815260200160405180910390f35b341561063857600080fd5b61022761118a565b604051901515815260200160405180910390f35b341561065f57600080fd5b610227611193565b604051901515815260200160405180910390f35b341561068657600080fd5b6101e960ff600435166111a3565b005b34156106a157600080fd5b610227600160a060020a03600435166111ea565b604051901515815260200160405180910390f35b34156106d457600080fd5b6101e96111ff565b005b34156106e957600080fd5b61024e61126a565b60405190815260200160405180910390f35b341561070e57600080fd5b6101e9600435611270565b005b341561072657600080fd5b6103006112d3565b604051600160a060020a03909116815260200160405180910390f35b341561075557600080fd5b6101e9600160a060020a03600435166112e2565b005b341561077657600080fd5b610300611332565b604051600160a060020a03909116815260200160405180910390f35b60135460ff1681565b600f54610100900460ff1681565b60095481565b60065481565b600f5460009060ff16156107d3575060056108c9565b6008544310156107e5575060016108c9565b600954431115801561086f5750600354600b54600754600160a060020a039092169163d0bc97d0919060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561085257600080fd5b6102c65a03f1151561086357600080fd5b50505060405180519050155b1561087c575060026108c9565b610884610f32565b15610891575060036108c9565b610899610f32565b1580156108a857506000600b54115b80156108b85750600b54600d5410155b156108c5575060066108c9565b5060045b5b5b5b5b5b90565b60106020526000908152604090205481565b600454600160a060020a031681565b60005433600160a060020a0390811691161461090d57600080fd5b60006109176107bd565b905060015b81600681111561092857fe5b1480610940575060025b81600681111561093e57fe5b145b151561094b57600080fd5b600354600b54600160a060020a039091169063b12dff6590849060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b15156109a957600080fd5b6102c65a03f115156109ba57600080fd5b5050506040518051600781905560065490101590506109d857600080fd5b7f90a72a3ffe1b2fb74f2660b6f57990bc203fa5c7b4a6eed6a7f7a3b48abc1a4060075460405190815260200160405180910390a15b5b505b50565b60008054819033600160a060020a03908116911614610a3257600080fd5b6000610a3c6107bd565b905060015b816006811115610a4d57fe5b1480610a65575060025b816006811115610a6357fe5b145b1515610a7057600080fd5b600160a060020a0386161515610a8557600080fd5b600154610afe90600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ad157600080fd5b6102c65a03f11515610ae257600080fd5b505050604051805187915060ff16600a0a63ffffffff61134116565b9250821515610b0c57600080fd5b610b1c848463ffffffff61134116565b9150610b2b8383886000611370565b5b5b505b5050505050565b600b5481565b60015b90565b60005433600160a060020a03908116911614610b5d57600080fd5b6000610b676107bd565b905060015b816006811115610b7857fe5b1480610b90575060025b816006811115610b8e57fe5b145b1515610b9b57600080fd5b4382118015610bab575060085482115b1515610bb657600080fd5b60098290555b5b505b50565b6003805b610bce6107bd565b6006811115610bd957fe5b14610be357600080fd5b60005433600160a060020a03908116911614610bfe57600080fd5b60005460a060020a900460ff1615610c1557600080fd5b600454600154600160a060020a0391821691634cb6d6af911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c6c57600080fd5b6102c65a03f11515610c7d57600080fd5b5050600f805460ff19166001179055507f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a15b5b5b5b50565b60075481565b600a5481565b60005433600160a060020a03908116911614610ce757600080fd5b6000610cf16107bd565b905060015b816006811115610d0257fe5b1480610d1a575060025b816006811115610d1857fe5b145b1515610d2557600080fd5b60005460a060020a900460ff1615610d3c57600080fd5b600160a060020a03831660009081526012602052604090819020805460ff19168415151790557fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440908490849051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b505b5050565b60006006805b610dc06107bd565b6006811115610dcb57fe5b14610dd557600080fd5b60005460a060020a900460ff1615610dec57600080fd5b600160a060020a0333166000908152601060205260409020549150811515610e1357600080fd5b600160a060020a033316600090815260106020526040812055600e54610e3f908363ffffffff61148616565b600e557fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d3383604051600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610a0e57600080fd5b5b5b5b5050565b600e5481565b60005433600160a060020a03908116911614610edf57600080fd5b6000805460a060020a60ff02191660a060020a179055600080516020611a168339815191526001604051901515815260200160405180910390a15b5b565b600254600160a060020a031681565b600d5481565b600654600b5410155b90565b60005433600160a060020a03908116911614610f5957600080fd5b60005460a060020a900460ff1615610f7057600080fd5b600f805461ff001916610100831515810291909117918290557f18e146f9f57083907720563bd8f8ca0ae35b6ade53ed888590d597ec7f576ad99160ff91900416604051901515815260200160405180910390a15b5b5b50565b60006004805b610fd86107bd565b6006811115610fe357fe5b14610fed57600080fd5b60005460a060020a900460ff161561100457600080fd5b600b5434101561101357600080fd5b600e541561102057600080fd5b600b5461103490349063ffffffff6114a016565b9150611058611049348463ffffffff6114a016565b600d549063ffffffff61148616565b600d55600160a060020a033316600090815260106020526040902054610daa908363ffffffff61148616565b505b5b5b5050565b600054600160a060020a031681565b600554600160a060020a031681565b60116020526000908152604090205481565b6001608060020a03811615156110d157600080fd5b610a1133826114b7565b5b50565b600f54610100900460ff16156110f457600080fd5b6101e63360006114b7565b5b565b600454600154600091600160a060020a0390811691638e7682889116836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561116457600080fd5b6102c65a03f1151561117557600080fd5b50505060405180519150505b90565b60085481565b600f5460ff1681565b60005460a060020a900460ff1681565b60005433600160a060020a039081169116146111be57600080fd5b60005460a060020a900460ff16156111d557600080fd5b6013805460ff191660ff83161790555b5b5b50565b60126020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461121a57600080fd5b60005460a060020a900460ff16151561123257600080fd5b6000805460a060020a60ff0219168155600080516020611a1683398151915290604051901515815260200160405180910390a15b5b5b565b600c5481565b60005433600160a060020a0390811691161461128b57600080fd5b6001805b6112976107bd565b60068111156112a257fe5b146112ac57600080fd5b43821180156112bc575060095482105b15156112c757600080fd5b60088290555b5b505b50565b600354600160a060020a031681565b60005433600160a060020a039081169116146112fd57600080fd5b600160a060020a038116151561131257600080fd5b60008054600160a060020a031916600160a060020a0383161790555b5b50565b600154600160a060020a031681565b600082820283158061135d575082848281151561135a57fe5b04145b151561136557fe5b8091505b5092915050565b600160a060020a038216600090815260106020526040902054611399908463ffffffff61148616565b600160a060020a0383166000908152601060209081526040808320939093556011905220546113ce908563ffffffff61148616565b600160a060020a038316600090815260116020526040902055600b546113fa908463ffffffff61148616565b600b55600a54611410908563ffffffff61148616565b600a5561141d82856117be565b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335082848684604051600160a060020a03909416845260208401929092526040808401919091526001608060020a0390911660608301526080909101905180910390a15b50505050565b60008282018381101561136557fe5b8091505b5092915050565b6000828211156114ac57fe5b508082035b92915050565b600080548190819060a060020a900460ff16156114d357600080fd5b60006114dd6107bd565b905060015b8160068111156114ee57fe5b1480611506575060025b81600681111561150457fe5b145b151561151157600080fd5b60015b61151c6107bd565b600681111561152757fe5b141561155457600160a060020a03861660009081526012602052604090205460ff16151561155457600080fd5b5b600354600b54600160a060020a0388811660009081526010602052604080822054600754939095169463a04e34bc94349490939192909190516020015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401602060405180830381600087803b15156115da57600080fd5b6102c65a03f115156115eb57600080fd5b5050506040518051600254600b54600a54600154939850600160a060020a0392831694506318a4155e93899333911663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561165657600080fd5b6102c65a03f1151561166757600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8816028152600481019590955260248501939093526044840191909152600160a060020a0316606483015260ff16608482015260a401602060405180830381600087803b15156116d657600080fd5b6102c65a03f115156116e757600080fd5b50505060405180519350508215156116fe57600080fd5b600160a060020a038616600090815260106020526040902054151561172757600c805460010190555b61173383858888611370565b600554600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561176657600080fd5b611776348563ffffffff6114a016565b91506000821115610b2b57600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610b2b57600080fd5b5b5b5b505b5050505050565b600154600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561181457600080fd5b6102c65a03f11515610b2f57600080fd5b5050505b5050565b600160a060020a038116151561184257600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b5050506040518051905015156118cd57600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561193257600080fd5b6102c65a03f1151561194357600080fd5b50505060405180519050151561195857600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156119bd57600080fd5b6102c65a03f115156119ce57600080fd5b5050506040518051905015156119e357600080fd5b60048054600160a060020a031916600160a060020a038316179055611a06611102565b1515610a1157600080fd5b5b50560092333b0b676476985757350034668cb9ee247674ac7a7479de10cd761381f733a165627a7a723058202fb751fcca7b341ef504eed002ca773b243d14d42b03312ecee53d8751b9d6b500296060604052341561000f57600080fd5b6040516020806101ba833981016040528080519150505b60008190555b505b61017d8061003d6000396000f300606060405263ffffffff60e060020a60003504166304bbc255811461003a57806318a4155e1461006157806384e3ac941461009e575b600080fd5b341561004557600080fd5b61004d6100c3565b604051901515815260200160405180910390f35b341561006c57600080fd5b61008c600435602435604435600160a060020a03606435166084356100c9565b60405190815260200160405180910390f35b34156100a957600080fd5b61008c610100565b60405190815260200160405180910390f35b60015b90565b60008054600a83900a906100f3906100e7898463ffffffff61010616565b9063ffffffff61013516565b91505b5095945050505050565b60005481565b6000828202831580610122575082848281151561011f57fe5b04145b151561012a57fe5b8091505b5092915050565b600080828481151561014357fe5b0490508091505b50929150505600a165627a7a72305820f2cacf89a34fc95861df87df2cba39e74ca0b8eff78a379b92366bb3bb50d77d00296060604052341561000f57600080fd5b60405160408061034d83398101604052808051919060200180519150505b600082905560018190555b50505b6103038061004a6000396000f3006060604052361561005c5763ffffffff60e060020a600035041663296ca48a811461006157806360f6fb2e146100865780638dbe3be5146100ab578063a04e34bc146100d2578063b12dff6514610103578063d0bc97d01461012e575b600080fd5b341561006c57600080fd5b61007461015b565b60405190815260200160405180910390f35b341561009157600080fd5b610074610161565b60405190815260200160405180910390f35b34156100b657600080fd5b6100be610167565b604051901515815260200160405180910390f35b34156100dd57600080fd5b61007460043560243560443560643561016d565b60405190815260200160405180910390f35b341561010e57600080fd5b6100746004356024356101f2565b60405190815260200160405180910390f35b341561013957600080fd5b6100be600435602435610241565b604051901515815260200160405180910390f35b60015481565b60005481565b60015b90565b60008080610181878663ffffffff61025b16565b91506001548211156101a3576001546101a0908663ffffffff61027516565b96505b8315156101b2578692506101e7565b6101c2878763ffffffff61025b16565b9050838110156101d4578692506101e7565b6101e4848763ffffffff61027516565b92505b5b5050949350505050565b60008183111561020357508161023a565b6000546102379061022b600161021f868463ffffffff61028c16565b9063ffffffff61025b16565b9063ffffffff6102a816565b90505b5b92915050565b600080821180156102375750818310155b90505b92915050565b60008282018381101561026a57fe5b8091505b5092915050565b60008282111561028157fe5b508082035b92915050565b600080828481151561029a57fe5b0490508091505b5092915050565b60008282028315806102c457508284828115156102c157fe5b04145b151561026a57fe5b8091505b50929150505600a165627a7a72305820a52c9bca7cbc4d524dfd6b63f6c5ae8f01cbffb0e33ed72a9dd41acb49de0e1800296060604052341561000f57600080fd5b60405160608061057b8339810160405280805191906020018051919060200180519150505b600160a060020a038316158015906100545750600160a060020a03811615155b151561005f57600080fd5b60008054600160a060020a03808616600160a060020a031992831617909255600280549284169290911691909117905560018290555b5050505b6104d3806100a86000396000f300606060405236156100675763ffffffff60e060020a6000350416634cb6d6af811461006c578063614cb9041461008d5780636a457ee9146100b45780637424bebc146100d95780638e768288146100fe5780639c1e03a014610131578063dbc0c08514610160575b600080fd5b341561007757600080fd5b61008b600160a060020a036004351661018f565b005b341561009857600080fd5b6100a061031c565b604051901515815260200160405180910390f35b34156100bf57600080fd5b6100c7610322565b60405190815260200160405180910390f35b34156100e457600080fd5b6100c7610328565b60405190815260200160405180910390f35b341561010957600080fd5b6100a0600160a060020a036004351661032e565b604051901515815260200160405180910390f35b341561013c57600080fd5b610144610427565b604051600160a060020a03909116815260200160405180910390f35b341561016b57600080fd5b610144610436565b604051600160a060020a03909116815260200160405180910390f35b60008054819033600160a060020a039081169116146101ad57600080fd5b60008054600160a060020a03169063518ab2a890604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156101f657600080fd5b6102c65a03f1151561020757600080fd5b505050604051805160015490935061022991506127109063ffffffff61044516565b9050610250816102446001548561045c90919063ffffffff16565b9063ffffffff61048b16565b6003819055600254600160a060020a03808616926340c10f19929091169060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156102b157600080fd5b6102c65a03f115156102c257600080fd5b50505082600160a060020a0316635f412d4f6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561030257600080fd5b6102c65a03f1151561031357600080fd5b5050505b505050565b60015b90565b60035481565b60015481565b600081600160a060020a03166342c1867b3060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561038757600080fd5b6102c65a03f1151561039857600080fd5b50505060405180519050801561041f575030600160a060020a031682600160a060020a031663d1f276d36000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103f957600080fd5b6102c65a03f1151561040a57600080fd5b50505060405180519050600160a060020a0316145b90505b919050565b600054600160a060020a031681565b600254600160a060020a031681565b60008282111561045157fe5b508082035b92915050565b6000828202831580610478575082848281151561047557fe5b04145b151561048057fe5b8091505b5092915050565b600080828481151561049957fe5b0490508091505b50929150505600a165627a7a723058208c3e8aafa45fe0ec40295a985ca9c7030124689ff513961d3cb9ef0f75e44d06002960606040526004805460a060020a60ff02191690556006805460ff1916905534156200002a57600080fd5b60405162001b9838038062001b98833981016040528080518201919060200180518201919060200180519190602001805191906020018051919060200180519150505b815b8483835b5b60038054600160a060020a03191633600160a060020a03161790555b600160a060020a0382161515620000a657600080fd5b8080620000b257508215155b1515620000be57600080fd5b6000831115620000e257620000e28284640100000000620015546200015d82021704565b5b6006805460ff191682151790555b5050506200011381620002296401000000000262001725176401000000009004565b5b50600c8680516200012a92916020019062000279565b50600d8580516200014092916020019062000279565b50600b805460ff191660ff85161790555b50505050505062000323565b60065460ff16156200016e57600080fd5b6000546200018b9082640100000000620016226200025e82021704565b6000908155600160a060020a038316815260016020526040902054620001c09082640100000000620016226200025e82021704565b600160a060020a03831660009081526001602052604090819020919091557f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe908390839051600160a060020a03909216825260208201526040908101905180910390a15b5b5050565b600160a060020a03811615156200023f57600080fd5b60088054600160a060020a031916600160a060020a0383161790555b50565b6000828201838110156200026e57fe5b8091505b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b5b50620002fb929150620002ff565b5090565b6200032091905b80821115620002fb576000815560010162000306565b5090565b90565b61186580620003336000396000f300606060405236156101855763ffffffff60e060020a60003504166302f652a3811461018a57806305d2035b146101b057806306fdde03146101d7578063095ea7b31461026257806318160ddd1461029857806323b872dd146102bd57806329ff4f53146102f9578063313ce5671461031a57806340c10f191461034357806342c1867b14610367578063432146751461039a57806345977d03146103c05780634eee966f146103d85780635de4ccb01461046d5780635f412d4f1461049c578063600440cb146104b157806370a08231146104e05780638444b39114610511578063867c2857146105485780638da5cb5b1461057b57806395d89b41146105aa57806396132521146106355780639738968c1461065c578063a9059cbb14610683578063ac3cb72c146106b9578063c752ff62146106ef578063d1f276d314610714578063d7e7088a14610743578063dd62ed3e14610764578063e2301d021461079b578063ea56a44d146107d1578063eefa597b146107f2578063f2fde38b14610819575b600080fd5b341561019557600080fd5b6101ae600160a060020a0360043516602435151561083a565b005b34156101bb57600080fd5b6101c361089b565b604051901515815260200160405180910390f35b34156101e257600080fd5b6101ea6108a4565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102275780820151818401525b60200161020e565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561026d57600080fd5b6101c3600160a060020a0360043516602435610942565b604051901515815260200160405180910390f35b34156102a357600080fd5b6102ab6109d7565b60405190815260200160405180910390f35b34156102c857600080fd5b6101c3600160a060020a03600435811690602435166044356109dd565b604051901515815260200160405180910390f35b341561030457600080fd5b6101ae600160a060020a0360043516610a34565b005b341561032557600080fd5b61032d610a8b565b60405160ff909116815260200160405180910390f35b341561034e57600080fd5b6101ae600160a060020a0360043516602435610a94565b005b341561037257600080fd5b6101c3600160a060020a0360043516610acb565b604051901515815260200160405180910390f35b34156103a557600080fd5b6101ae600160a060020a03600435166024351515610ae0565b005b34156103cb57600080fd5b6101ae600435610b7f565b005b34156103e357600080fd5b6101ae60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650610ceb95505050505050565b005b341561047857600080fd5b610480610e5b565b604051600160a060020a03909116815260200160405180910390f35b34156104a757600080fd5b6101ae610e6a565b005b34156104bc57600080fd5b610480610e9e565b604051600160a060020a03909116815260200160405180910390f35b34156104eb57600080fd5b6102ab600160a060020a0360043516610ead565b60405190815260200160405180910390f35b341561051c57600080fd5b610524610ecc565b6040518082600481111561053457fe5b60ff16815260200191505060405180910390f35b341561055357600080fd5b6101c3600160a060020a0360043516610f19565b604051901515815260200160405180910390f35b341561058657600080fd5b610480610f2e565b604051600160a060020a03909116815260200160405180910390f35b34156105b557600080fd5b6101ea610f3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102275780820151818401525b60200161020e565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064057600080fd5b6101c3610fdb565b604051901515815260200160405180910390f35b341561066757600080fd5b6101c3610feb565b604051901515815260200160405180910390f35b341561068e57600080fd5b6101c3600160a060020a0360043516602435611011565b604051901515815260200160405180910390f35b34156106c457600080fd5b6101c3600160a060020a0360043516602435611066565b604051901515815260200160405180910390f35b34156106fa57600080fd5b6102ab6110fb565b60405190815260200160405180910390f35b341561071f57600080fd5b610480611101565b604051600160a060020a03909116815260200160405180910390f35b341561074e57600080fd5b6101ae600160a060020a0360043516611110565b005b341561076f57600080fd5b6102ab600160a060020a03600435811690602435166112bc565b60405190815260200160405180910390f35b34156107a657600080fd5b6101c3600160a060020a03600435166024356112e9565b604051901515815260200160405180910390f35b34156107dc57600080fd5b6101ae600160a060020a03600435166113d3565b005b34156107fd57600080fd5b6101c36113fb565b604051901515815260200160405180910390f35b341561082457600080fd5b6101ae600160a060020a0360043516611401565b005b60035433600160a060020a0390811691161461085557600080fd5b60045460009060a060020a900460ff161561086f57600080fd5b600160a060020a0383166000908152600560205260409020805460ff19168315151790555b5b505b5050565b60065460ff1681565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b505050505081565b60008115806109745750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561097f57600080fd5b600160a060020a033381166000818152600260209081526040808320948816808452949091529081902085905560008051602061181a8339815191529085905190815260200160405180910390a35060015b92915050565b60005481565b600454600090849060a060020a900460ff1680610a125750600160a060020a03811660009081526005602052604090205460ff165b1515610a1d57600080fd5b610a28858585611451565b91505b5b509392505050565b60035433600160a060020a03908116911614610a4f57600080fd5b60045460009060a060020a900460ff1615610a6957600080fd5b60048054600160a060020a031916600160a060020a0384161790555b5b505b50565b600b5460ff1681565b600160a060020a03331660009081526007602052604090205460ff161515610abb57600080fd5b6108978282611554565b5b5b5050565b60076020526000908152604090205460ff1681565b60035433600160a060020a03908116911614610afb57600080fd5b60065460ff1615610b0b57600080fd5b600160a060020a03821660009081526007602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000610b89610ecc565b905060035b816004811115610b9a57fe5b1480610bb2575060045b816004811115610bb057fe5b145b1515610bbd57600080fd5b811515610bc957600080fd5b600160a060020a033316600090815260016020526040902054610bf2908363ffffffff61160b16565b600160a060020a03331660009081526001602052604081209190915554610c1f908363ffffffff61160b16565b600055600a54610c35908363ffffffff61162216565b600a55600954600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610c8e57600080fd5b6102c65a03f11515610c9f57600080fd5b5050600954600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b60035433600160a060020a03908116911614610d0657600080fd5b600c828051610d19929160200190611759565b50600d818051610d2d929160200190611759565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb46600c600d604051604080825283546002600019610100600184161502019091160490820181905281906020820190606083019086908015610dd15780601f10610da657610100808354040283529160200191610dd1565b820191906000526020600020905b815481529060010190602001808311610db457829003601f168201915b5050838103825284546002600019610100600184161502019091160480825260209091019085908015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505094505050505060405180910390a15b5b5050565b600954600160a060020a031681565b60045433600160a060020a03908116911614610e8557600080fd5b6006805460ff19166001179055610e9a61163c565b5b5b565b600854600160a060020a031681565b600160a060020a0381166000908152600160205260409020545b919050565b6000610ed6610feb565b1515610ee457506001610f13565b600954600160a060020a03161515610efe57506002610f13565b600a541515610f0f57506003610f13565b5060045b5b5b5b90565b60056020526000908152604090205460ff1681565b600354600160a060020a031681565b600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b505050505081565b60045460a060020a900460ff1681565b60045460009060a060020a900460ff16801561100a575061100a6113fb565b5b90505b90565b600454600090339060a060020a900460ff16806110465750600160a060020a03811660009081526005602052604090205460ff165b151561105157600080fd5b61105b8484611677565b91505b5b5092915050565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205461109e818463ffffffff61162216565b600160a060020a033381166000818152600260209081526040808320948a1680845294909152908190208490559192909160008051602061181a83398151915291905190815260200160405180910390a3600191505b5092915050565b600a5481565b600454600160a060020a031681565b611118610feb565b151561112357600080fd5b600160a060020a038116151561113857600080fd5b60085433600160a060020a0390811691161461115357600080fd5b60045b61115e610ecc565b600481111561116957fe5b141561117457600080fd5b60098054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b5050506040518051905015156111f857600080fd5b600080546009549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561124857600080fd5b6102c65a03f1151561125957600080fd5b5050506040518051905014151561126f57600080fd5b6009547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561134657600160a060020a03338116600090815260026020908152604080832093881683529290529081205561137d565b61109e818463ffffffff61160b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190205460008051602061181a833981519152915190815260200160405180910390a3600191505b5092915050565b60085433600160a060020a039081169116146113ee57600080fd5b610a8881611725565b5b50565b60015b90565b60035433600160a060020a0390811691161461141c57600080fd5b600160a060020a038116151561143157600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611498908463ffffffff61162216565b600160a060020a0380861660009081526001602052604080822093909355908716815220546114cd908463ffffffff61160b16565b600160a060020a0386166000908152600160205260409020556114f6818463ffffffff61160b16565b600160a060020a03808716600081815260026020908152604080832033861684529091529081902093909355908616916000805160206117fa8339815191529086905190815260200160405180910390a3600191505b509392505050565b60065460ff161561156457600080fd5b600054611577908263ffffffff61162216565b6000908155600160a060020a0383168152600160205260409020546115a2908263ffffffff61162216565b600160a060020a03831660009081526001602052604090819020919091557f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe908390839051600160a060020a03909216825260208201526040908101905180910390a15b5b5050565b60008282111561161757fe5b508082035b92915050565b60008282018381101561163157fe5b8091505b5092915050565b60045433600160a060020a0390811691161461165757600080fd5b6004805460a060020a60ff02191660a060020a1790555b5b565b60015b90565b600160a060020a0333166000908152600160205260408120546116a0908363ffffffff61160b16565b600160a060020a0333811660009081526001602052604080822093909355908516815220546116d5908363ffffffff61162216565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206117fa8339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a038116151561173a57600080fd5b60088054600160a060020a031916600160a060020a0383161790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061179a57805160ff19168380011785556117c7565b828001600101855582156117c7579182015b828111156117c75782518255916020019190600101906117ac565b5b506117d49291506117d8565b5090565b610f1391905b808211156117d457600081556001016117de565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a165627a7a7230582081828f9ae489ed77919587782a892cfe871396b934c3819f5804c4d9732b6c1e0029000000000000000000000000800e1dcc20d95e60ff8b3106e6eaa1cb73d5d16f0000000000000000000000000000000000000000000000000000000000400f9c000000000000000000000000000000000000000000000000000000000040e9a7
Deployed Bytecode
0x606060405236156101dd5763ffffffff60e060020a6000350416630226401d81146101eb57806303ca0eed146102145780630a09284a1461023b57806313f4e977146102605780631865c57d146102855780631aae3460146102bc57806321d5c0f6146102ed5780632a0139251461031c57806332013ac3146103345780634042b66f1461035b5780634551dd591461038057806346755c68146103a75780634bb278f3146103bf5780634da1b25d146103d4578063518ab2a8146103f957806358bad3eb1461041e578063590e1ae3146104445780635da89ac0146104595780635ed7ca5b1461047e57806378b99c2414610493578063797d9437146104c25780637c2e08a3146104e75780637f7d711e1461050e57806387612102146105285780638da5cb5b146105325780639075becf1461056157806397b150ca1461059057806399e9376c146105c1578063a6f2ae3a146105d7578063a7ba44c3146105e1578063af46868214610608578063b3f05b971461062d578063b9b8af0b14610654578063bb23ef741461067b578063cb16e6d014610696578063cb3e64fd146106c9578063d7e64c00146106de578063ec17b20e14610703578063ee51b8791461071b578063f2fde38b1461074a578063fc0c546a1461076b575b6101e95b600080fd5b5b565b005b34156101f657600080fd5b6101fe61079a565b60405160ff909116815260200160405180910390f35b341561021f57600080fd5b6102276107a3565b604051901515815260200160405180910390f35b341561024657600080fd5b61024e6107b1565b60405190815260200160405180910390f35b341561026b57600080fd5b61024e6107b7565b60405190815260200160405180910390f35b341561029057600080fd5b6102986107bd565b604051808260068111156102a857fe5b60ff16815260200191505060405180910390f35b34156102c757600080fd5b61024e600160a060020a03600435166108d1565b60405190815260200160405180910390f35b34156102f857600080fd5b6103006108e3565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b6101e96004356108f2565b005b341561033f57600080fd5b6101e9600160a060020a0360043516602435604435610a14565b005b341561036657600080fd5b61024e610b36565b60405190815260200160405180910390f35b341561038b57600080fd5b610227610b3c565b604051901515815260200160405180910390f35b34156103b257600080fd5b6101e9600435610b42565b005b34156103ca57600080fd5b6101e9610bc2565b005b34156103df57600080fd5b61024e610cc0565b60405190815260200160405180910390f35b341561040457600080fd5b61024e610cc6565b60405190815260200160405180910390f35b341561042957600080fd5b6101e9600160a060020a03600435166024351515610ccc565b005b341561044f57600080fd5b6101e9610db2565b005b341561046457600080fd5b61024e610ebe565b60405190815260200160405180910390f35b341561048957600080fd5b6101e9610ec4565b005b341561049e57600080fd5b610300610f1d565b604051600160a060020a03909116815260200160405180910390f35b34156104cd57600080fd5b61024e610f2c565b60405190815260200160405180910390f35b34156104f257600080fd5b610227610f32565b604051901515815260200160405180910390f35b341561051957600080fd5b6101e96004351515610f3e565b005b6101e9610fca565b005b341561053d57600080fd5b61030061108c565b604051600160a060020a03909116815260200160405180910390f35b341561056c57600080fd5b61030061109b565b604051600160a060020a03909116815260200160405180910390f35b341561059b57600080fd5b61024e600160a060020a03600435166110aa565b60405190815260200160405180910390f35b6101e96001608060020a03600435166110bc565b005b6101e96110df565b005b34156105ec57600080fd5b610227611102565b604051901515815260200160405180910390f35b341561061357600080fd5b61024e611184565b60405190815260200160405180910390f35b341561063857600080fd5b61022761118a565b604051901515815260200160405180910390f35b341561065f57600080fd5b610227611193565b604051901515815260200160405180910390f35b341561068657600080fd5b6101e960ff600435166111a3565b005b34156106a157600080fd5b610227600160a060020a03600435166111ea565b604051901515815260200160405180910390f35b34156106d457600080fd5b6101e96111ff565b005b34156106e957600080fd5b61024e61126a565b60405190815260200160405180910390f35b341561070e57600080fd5b6101e9600435611270565b005b341561072657600080fd5b6103006112d3565b604051600160a060020a03909116815260200160405180910390f35b341561075557600080fd5b6101e9600160a060020a03600435166112e2565b005b341561077657600080fd5b610300611332565b604051600160a060020a03909116815260200160405180910390f35b60135460ff1681565b600f54610100900460ff1681565b60095481565b60065481565b600f5460009060ff16156107d3575060056108c9565b6008544310156107e5575060016108c9565b600954431115801561086f5750600354600b54600754600160a060020a039092169163d0bc97d0919060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561085257600080fd5b6102c65a03f1151561086357600080fd5b50505060405180519050155b1561087c575060026108c9565b610884610f32565b15610891575060036108c9565b610899610f32565b1580156108a857506000600b54115b80156108b85750600b54600d5410155b156108c5575060066108c9565b5060045b5b5b5b5b5b90565b60106020526000908152604090205481565b600454600160a060020a031681565b60005433600160a060020a0390811691161461090d57600080fd5b60006109176107bd565b905060015b81600681111561092857fe5b1480610940575060025b81600681111561093e57fe5b145b151561094b57600080fd5b600354600b54600160a060020a039091169063b12dff6590849060006040516020015260405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b15156109a957600080fd5b6102c65a03f115156109ba57600080fd5b5050506040518051600781905560065490101590506109d857600080fd5b7f90a72a3ffe1b2fb74f2660b6f57990bc203fa5c7b4a6eed6a7f7a3b48abc1a4060075460405190815260200160405180910390a15b5b505b50565b60008054819033600160a060020a03908116911614610a3257600080fd5b6000610a3c6107bd565b905060015b816006811115610a4d57fe5b1480610a65575060025b816006811115610a6357fe5b145b1515610a7057600080fd5b600160a060020a0386161515610a8557600080fd5b600154610afe90600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ad157600080fd5b6102c65a03f11515610ae257600080fd5b505050604051805187915060ff16600a0a63ffffffff61134116565b9250821515610b0c57600080fd5b610b1c848463ffffffff61134116565b9150610b2b8383886000611370565b5b5b505b5050505050565b600b5481565b60015b90565b60005433600160a060020a03908116911614610b5d57600080fd5b6000610b676107bd565b905060015b816006811115610b7857fe5b1480610b90575060025b816006811115610b8e57fe5b145b1515610b9b57600080fd5b4382118015610bab575060085482115b1515610bb657600080fd5b60098290555b5b505b50565b6003805b610bce6107bd565b6006811115610bd957fe5b14610be357600080fd5b60005433600160a060020a03908116911614610bfe57600080fd5b60005460a060020a900460ff1615610c1557600080fd5b600454600154600160a060020a0391821691634cb6d6af911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610c6c57600080fd5b6102c65a03f11515610c7d57600080fd5b5050600f805460ff19166001179055507f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a15b5b5b5b50565b60075481565b600a5481565b60005433600160a060020a03908116911614610ce757600080fd5b6000610cf16107bd565b905060015b816006811115610d0257fe5b1480610d1a575060025b816006811115610d1857fe5b145b1515610d2557600080fd5b60005460a060020a900460ff1615610d3c57600080fd5b600160a060020a03831660009081526012602052604090819020805460ff19168415151790557fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440908490849051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b505b5050565b60006006805b610dc06107bd565b6006811115610dcb57fe5b14610dd557600080fd5b60005460a060020a900460ff1615610dec57600080fd5b600160a060020a0333166000908152601060205260409020549150811515610e1357600080fd5b600160a060020a033316600090815260106020526040812055600e54610e3f908363ffffffff61148616565b600e557fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d3383604051600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610a0e57600080fd5b5b5b5b5050565b600e5481565b60005433600160a060020a03908116911614610edf57600080fd5b6000805460a060020a60ff02191660a060020a179055600080516020611a168339815191526001604051901515815260200160405180910390a15b5b565b600254600160a060020a031681565b600d5481565b600654600b5410155b90565b60005433600160a060020a03908116911614610f5957600080fd5b60005460a060020a900460ff1615610f7057600080fd5b600f805461ff001916610100831515810291909117918290557f18e146f9f57083907720563bd8f8ca0ae35b6ade53ed888590d597ec7f576ad99160ff91900416604051901515815260200160405180910390a15b5b5b50565b60006004805b610fd86107bd565b6006811115610fe357fe5b14610fed57600080fd5b60005460a060020a900460ff161561100457600080fd5b600b5434101561101357600080fd5b600e541561102057600080fd5b600b5461103490349063ffffffff6114a016565b9150611058611049348463ffffffff6114a016565b600d549063ffffffff61148616565b600d55600160a060020a033316600090815260106020526040902054610daa908363ffffffff61148616565b505b5b5b5050565b600054600160a060020a031681565b600554600160a060020a031681565b60116020526000908152604090205481565b6001608060020a03811615156110d157600080fd5b610a1133826114b7565b5b50565b600f54610100900460ff16156110f457600080fd5b6101e63360006114b7565b5b565b600454600154600091600160a060020a0390811691638e7682889116836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561116457600080fd5b6102c65a03f1151561117557600080fd5b50505060405180519150505b90565b60085481565b600f5460ff1681565b60005460a060020a900460ff1681565b60005433600160a060020a039081169116146111be57600080fd5b60005460a060020a900460ff16156111d557600080fd5b6013805460ff191660ff83161790555b5b5b50565b60126020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461121a57600080fd5b60005460a060020a900460ff16151561123257600080fd5b6000805460a060020a60ff0219168155600080516020611a1683398151915290604051901515815260200160405180910390a15b5b5b565b600c5481565b60005433600160a060020a0390811691161461128b57600080fd5b6001805b6112976107bd565b60068111156112a257fe5b146112ac57600080fd5b43821180156112bc575060095482105b15156112c757600080fd5b60088290555b5b505b50565b600354600160a060020a031681565b60005433600160a060020a039081169116146112fd57600080fd5b600160a060020a038116151561131257600080fd5b60008054600160a060020a031916600160a060020a0383161790555b5b50565b600154600160a060020a031681565b600082820283158061135d575082848281151561135a57fe5b04145b151561136557fe5b8091505b5092915050565b600160a060020a038216600090815260106020526040902054611399908463ffffffff61148616565b600160a060020a0383166000908152601060209081526040808320939093556011905220546113ce908563ffffffff61148616565b600160a060020a038316600090815260116020526040902055600b546113fa908463ffffffff61148616565b600b55600a54611410908563ffffffff61148616565b600a5561141d82856117be565b7f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc4335082848684604051600160a060020a03909416845260208401929092526040808401919091526001608060020a0390911660608301526080909101905180910390a15b50505050565b60008282018381101561136557fe5b8091505b5092915050565b6000828211156114ac57fe5b508082035b92915050565b600080548190819060a060020a900460ff16156114d357600080fd5b60006114dd6107bd565b905060015b8160068111156114ee57fe5b1480611506575060025b81600681111561150457fe5b145b151561151157600080fd5b60015b61151c6107bd565b600681111561152757fe5b141561155457600160a060020a03861660009081526012602052604090205460ff16151561155457600080fd5b5b600354600b54600160a060020a0388811660009081526010602052604080822054600754939095169463a04e34bc94349490939192909190516020015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401602060405180830381600087803b15156115da57600080fd5b6102c65a03f115156115eb57600080fd5b5050506040518051600254600b54600a54600154939850600160a060020a0392831694506318a4155e93899333911663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561165657600080fd5b6102c65a03f1151561166757600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8816028152600481019590955260248501939093526044840191909152600160a060020a0316606483015260ff16608482015260a401602060405180830381600087803b15156116d657600080fd5b6102c65a03f115156116e757600080fd5b50505060405180519350508215156116fe57600080fd5b600160a060020a038616600090815260106020526040902054151561172757600c805460010190555b61173383858888611370565b600554600160a060020a031684156108fc0285604051600060405180830381858888f19350505050151561176657600080fd5b611776348563ffffffff6114a016565b91506000821115610b2b57600160a060020a03331682156108fc0283604051600060405180830381858888f193505050501515610b2b57600080fd5b5b5b5b505b5050505050565b600154600160a060020a03166340c10f19838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561181457600080fd5b6102c65a03f11515610b2f57600080fd5b5050505b5050565b600160a060020a038116151561184257600080fd5b60058054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a03166304bbc2556000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b5050506040518051905015156118cd57600080fd5b60028054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a0316638dbe3be56000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561193257600080fd5b6102c65a03f1151561194357600080fd5b50505060405180519050151561195857600080fd5b60038054600160a060020a031916600160a060020a0383161790555b50565b80600160a060020a031663614cb9046000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156119bd57600080fd5b6102c65a03f115156119ce57600080fd5b5050506040518051905015156119e357600080fd5b60048054600160a060020a031916600160a060020a038316179055611a06611102565b1515610a1157600080fd5b5b50560092333b0b676476985757350034668cb9ee247674ac7a7479de10cd761381f733a165627a7a723058202fb751fcca7b341ef504eed002ca773b243d14d42b03312ecee53d8751b9d6b50029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f0000000000000000000000000000000000000000000000000000000000400F9C000000000000000000000000000000000000000000000000000000000040E9A7
-----Decoded View---------------
Arg [0] : _teamMultisig (address): 0x800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f
Arg [1] : _start (uint256): 4198300
Arg [2] : _end (uint256): 4254119
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000800E1Dcc20D95e60fF8B3106e6EaA1cB73D5D16f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000400F9C
Arg [2] : 000000000000000000000000000000000000000000000000000000000040E9A7
Swarm Source
bzzr://81828f9ae489ed77919587782a892cfe871396b934c3819f5804c4d9732b6c1e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.