Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 656 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Contribute | 5609079 | 2439 days ago | IN | 1 ETH | 0.00011391 | ||||
Allocate Tokens | 5582948 | 2444 days ago | IN | 0 ETH | 0.0005098 | ||||
Contribute | 5579490 | 2445 days ago | IN | 1 ETH | 0.00276236 | ||||
Transfer | 5579466 | 2445 days ago | IN | 1 ETH | 0.00204146 | ||||
Contribute | 5579406 | 2445 days ago | IN | 1 ETH | 0.00276236 | ||||
Contribute | 5579320 | 2445 days ago | IN | 1 ETH | 0.00276236 | ||||
Contribute | 5579305 | 2445 days ago | IN | 1 ETH | 0.00116759 | ||||
Conditional Tran... | 5579303 | 2445 days ago | IN | 0 ETH | 0.00194046 | ||||
Contribute | 5579293 | 2445 days ago | IN | 1 ETH | 0.00409606 | ||||
Contribute | 5579271 | 2445 days ago | IN | 1 ETH | 0.00204331 | ||||
Contribute | 5579256 | 2445 days ago | IN | 1 ETH | 0.0011357 | ||||
Contribute | 5579246 | 2445 days ago | IN | 1 ETH | 0.00110831 | ||||
Transfer | 5579209 | 2445 days ago | IN | 1 ETH | 0.000861 | ||||
Transfer | 5578907 | 2445 days ago | IN | 1 ETH | 0.000819 | ||||
Contribute | 5578897 | 2445 days ago | IN | 4 ETH | 0.00422423 | ||||
Transfer | 5578886 | 2445 days ago | IN | 1 ETH | 0.00086288 | ||||
Contribute | 5578860 | 2445 days ago | IN | 4.48 ETH | 0.00422423 | ||||
Contribute | 5578850 | 2445 days ago | IN | 4 ETH | 0.00356482 | ||||
Contribute | 5578834 | 2445 days ago | IN | 4 ETH | 0.001271 | ||||
Contribute | 5578795 | 2445 days ago | IN | 1,267 ETH | 0.0055887 | ||||
Contribute | 5578781 | 2445 days ago | IN | 4.49 ETH | 0.00164 | ||||
Contribute | 5578780 | 2445 days ago | IN | 1 ETH | 0.00513432 | ||||
Contribute | 5578725 | 2445 days ago | IN | 1 ETH | 0.00226326 | ||||
Transfer | 5578719 | 2445 days ago | IN | 1 ETH | 0.00126276 | ||||
Contribute | 5578708 | 2445 days ago | IN | 5 ETH | 0.00078258 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
5578795 | 2445 days ago | 0.44621649 ETH | ||||
5578795 | 2445 days ago | 1,266.5537835 ETH | ||||
5578780 | 2445 days ago | 1 ETH | ||||
5578708 | 2445 days ago | 5 ETH | ||||
5578695 | 2445 days ago | 1 ETH | ||||
5578582 | 2445 days ago | 4 ETH | ||||
5577951 | 2445 days ago | 2 ETH | ||||
5577874 | 2445 days ago | 11.6 ETH | ||||
5577096 | 2445 days ago | 1 ETH | ||||
5576901 | 2445 days ago | 1 ETH | ||||
5576889 | 2445 days ago | 1 ETH | ||||
5574562 | 2445 days ago | 1 ETH | ||||
5574366 | 2445 days ago | 1 ETH | ||||
5573777 | 2446 days ago | 6.28 ETH | ||||
5573416 | 2446 days ago | 1 ETH | ||||
5573184 | 2446 days ago | 4 ETH | ||||
5572745 | 2446 days ago | 4.000001 ETH | ||||
5570957 | 2446 days ago | 1 ETH | ||||
5570362 | 2446 days ago | 4 ETH | ||||
5569784 | 2446 days ago | 1 ETH | ||||
5568839 | 2446 days ago | 8 ETH | ||||
5568301 | 2447 days ago | 5 ETH | ||||
5567856 | 2447 days ago | 49 ETH | ||||
5567819 | 2447 days ago | 1 ETH | ||||
5567674 | 2447 days ago | 4 ETH |
Loading...
Loading
Contract Name:
VirtuePokerSale
Compiler Version
v0.4.19+commit.c4cbbb05
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-04-20 */ pragma solidity 0.4.19; // File: zeppelin-solidity/contracts/math/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } // File: zeppelin-solidity/contracts/ownership/Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: zeppelin-solidity/contracts/token/ERC20/ERC20.sol /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @tokenfoundry/sale-contracts/contracts/DisbursementHandler.sol /// @title Disbursement handler - Manages time locked disbursements of ERC20 tokens contract DisbursementHandler is Ownable { using SafeMath for uint256; struct Disbursement { // Tokens cannot be withdrawn before this timestamp uint256 timestamp; // Amount of tokens to be disbursed uint256 tokens; } event LogSetup(address indexed vestor, uint256 timestamp, uint256 tokens); event LogWithdraw(address indexed to, uint256 value); ERC20 public token; uint256 public totalAmount; mapping(address => Disbursement[]) public disbursements; mapping(address => uint256) public withdrawnTokens; function DisbursementHandler(address _token) public { token = ERC20(_token); } /// @dev Called by the sale contract to create a disbursement. /// @param vestor The address of the beneficiary. /// @param tokens Amount of tokens to be locked. /// @param timestamp Funds will be locked until this timestamp. function setupDisbursement( address vestor, uint256 tokens, uint256 timestamp ) external onlyOwner { require(block.timestamp < timestamp); disbursements[vestor].push(Disbursement(timestamp, tokens)); totalAmount = totalAmount.add(tokens); LogSetup(vestor, timestamp, tokens); } /// @dev Transfers tokens to the withdrawer function withdraw() external { uint256 withdrawAmount = calcMaxWithdraw(msg.sender); require(withdrawAmount != 0); withdrawnTokens[msg.sender] = withdrawnTokens[msg.sender].add(withdrawAmount); require(token.transfer(msg.sender, withdrawAmount)); LogWithdraw(msg.sender, withdrawAmount); } /// @dev Calculates the maximum amount of vested tokens /// @return Number of vested tokens that can be withdrawn function calcMaxWithdraw(address beneficiary) public view returns (uint256) { uint256 maxTokens = 0; // Go over all the disbursements and calculate how many tokens can be withdrawn Disbursement[] storage temp = disbursements[beneficiary]; uint256 tempLength = temp.length; for (uint256 i = 0; i < tempLength; i++) { if (block.timestamp > temp[i].timestamp) { maxTokens = maxTokens.add(temp[i].tokens); } } // Return the computed amount minus the tokens already withdrawn return maxTokens.sub(withdrawnTokens[beneficiary]); } } // File: zeppelin-solidity/contracts/math/Math.sol /** * @title Math * @dev Assorted math operations */ library Math { function max64(uint64 a, uint64 b) internal pure returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal pure returns (uint64) { return a < b ? a : b; } function max256(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min256(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } // File: @tokenfoundry/sale-contracts/contracts/Vault.sol // Adapted from Open Zeppelin's RefundVault /** * @title Vault * @dev This contract is used for storing funds while a crowdsale * is in progress. Supports refunding the money if crowdsale fails, * and forwarding it if crowdsale is successful. */ contract Vault is Ownable { using SafeMath for uint256; enum State { Active, Success, Refunding, Closed } uint256 public constant DISBURSEMENT_DURATION = 4 weeks; mapping (address => uint256) public deposited; uint256 public disbursementAmount; // The amount to be disbursed to the wallet every month address public trustedWallet; // Wallet from the project team uint256 public initialAmount; // The eth amount the team will get initially if the sale is successful uint256 public lastDisbursement; // Timestamp of the last disbursement made uint256 public totalDeposited; // Total amount that was deposited uint256 public refundable; // Amount that can be refunded uint256 public closingDuration; uint256 public closingDeadline; // Vault can't be closed before this deadline State public state; event LogClosed(); event LogRefundsEnabled(); event LogRefunded(address indexed contributor, uint256 amount); modifier atState(State _state) { require(state == _state); _; } function Vault( address wallet, uint256 _initialAmount, uint256 _disbursementAmount, uint256 _closingDuration ) public { require(wallet != address(0)); require(_disbursementAmount != 0); require(_closingDuration != 0); trustedWallet = wallet; initialAmount = _initialAmount; disbursementAmount = _disbursementAmount; closingDuration = _closingDuration; state = State.Active; } /// @dev Called by the sale contract to deposit ether for a contributor. function deposit(address contributor) onlyOwner external payable { require(state == State.Active || state == State.Success); totalDeposited = totalDeposited.add(msg.value); refundable = refundable.add(msg.value); deposited[contributor] = deposited[contributor].add(msg.value); } /// @dev Sends initial funds to the wallet. function saleSuccessful() onlyOwner external atState(State.Active){ state = State.Success; refundable = refundable.sub(initialAmount); if (initialAmount != 0) { trustedWallet.transfer(initialAmount); } } /// @dev Called by the owner if the project didn't deliver the testnet contracts or if we need to stop disbursements for any reasone. function enableRefunds() onlyOwner external { state = State.Refunding; LogRefundsEnabled(); } /// @dev Refunds ether to the contributors if in the Refunding state. function refund(address contributor) external atState(State.Refunding) { uint256 refundAmount = deposited[contributor].mul(refundable).div(totalDeposited); deposited[contributor] = 0; contributor.transfer(refundAmount); LogRefunded(contributor, refundAmount); } /// @dev Sets the closingDeadline variable function beginClosingPeriod() external onlyOwner atState(State.Success) { require(closingDeadline == 0); closingDeadline = now.add(closingDuration); } /// @dev Called by anyone if the sale was successful and the project delivered. function close() external atState(State.Success) { require(closingDeadline != 0 && closingDeadline <= now); state = State.Closed; LogClosed(); } /// @dev Sends the disbursement amount to the wallet after the disbursement period has passed. Can be called by anyone. function sendFundsToWallet() external atState(State.Closed) { require(lastDisbursement.add(DISBURSEMENT_DURATION) <= now); lastDisbursement = now; uint256 amountToSend = Math.min256(address(this).balance, disbursementAmount); refundable = amountToSend > refundable ? 0 : refundable.sub(amountToSend); trustedWallet.transfer(amountToSend); } } // File: @tokenfoundry/sale-contracts/contracts/Whitelistable.sol /** * @title Whitelistable * @dev This contract is used to implement a signature based whitelisting mechanism */ contract Whitelistable is Ownable { bytes constant PREFIX = "\x19Ethereum Signed Message:\n32"; address public whitelistAdmin; // addresses map to false by default mapping(address => bool) public blacklist; event LogAdminUpdated(address indexed newAdmin); modifier validAdmin(address _admin) { require(_admin != 0); _; } modifier onlyAdmin { require(msg.sender == whitelistAdmin); _; } /// @dev Constructor for Whitelistable contract /// @param _admin the address of the admin that will generate the signatures function Whitelistable(address _admin) public validAdmin(_admin) { whitelistAdmin = _admin; } /// @dev Updates whitelistAdmin address /// @dev Can only be called by the current owner /// @param _admin the new admin address function changeAdmin(address _admin) external onlyOwner validAdmin(_admin) { LogAdminUpdated(_admin); whitelistAdmin = _admin; } // @dev blacklists the given address to ban them from contributing // @param _contributor Address of the contributor to blacklist function addToBlacklist(address _contributor) external onlyAdmin { blacklist[_contributor] = true; } // @dev removes a previously blacklisted contributor from the blacklist // @param _contributor Address of the contributor remove function removeFromBlacklist(address _contributor) external onlyAdmin { blacklist[_contributor] = false; } /// @dev Checks if contributor is whitelisted (main Whitelistable function) /// @param contributor Address of who was whitelisted /// @param contributionLimit Limit for the user contribution /// @param currentSaleCap Cap of contributions to the sale at the current point in time /// @param v Recovery id /// @param r Component of the ECDSA signature /// @param s Component of the ECDSA signature /// @return Is the signature correct? function checkWhitelisted( address contributor, uint256 contributionLimit, uint256 currentSaleCap, uint8 v, bytes32 r, bytes32 s ) public view returns(bool) { bytes32 prefixed = keccak256(PREFIX, keccak256(contributor, contributionLimit, currentSaleCap)); return !(blacklist[contributor]) && (whitelistAdmin == ecrecover(prefixed, v, r, s)); } } // File: @tokenfoundry/state-machine/contracts/StateMachine.sol contract StateMachine { struct State { bytes32 nextStateId; mapping(bytes4 => bool) allowedFunctions; function() internal[] transitionCallbacks; function(bytes32) internal returns(bool)[] startConditions; } mapping(bytes32 => State) states; // The current state id bytes32 private currentStateId; event LogTransition(bytes32 stateId, uint256 blockNumber); /* This modifier performs the conditional transitions and checks that the function * to be executed is allowed in the current State */ modifier checkAllowed { conditionalTransitions(); require(states[currentStateId].allowedFunctions[msg.sig]); _; } ///@dev transitions the state machine into the state it should currently be in ///@dev by taking into account the current conditions and how many further transitions can occur function conditionalTransitions() public { bytes32 next = states[currentStateId].nextStateId; bool stateChanged; while (next != 0) { // If one of the next state's conditions is met, go to this state and continue stateChanged = false; for (uint256 i = 0; i < states[next].startConditions.length; i++) { if (states[next].startConditions[i](next)) { goToNextState(); next = states[next].nextStateId; stateChanged = true; break; } } // If none of the next state's conditions are met, then we are in the right current state if (!stateChanged) break; } } function getCurrentStateId() view public returns(bytes32) { return currentStateId; } /// @dev Setup the state machine with the given states. /// @param _stateIds Array of state ids. function setStates(bytes32[] _stateIds) internal { require(_stateIds.length > 0); require(currentStateId == 0); require(_stateIds[0] != 0); currentStateId = _stateIds[0]; for (uint256 i = 1; i < _stateIds.length; i++) { require(_stateIds[i] != 0); states[_stateIds[i - 1]].nextStateId = _stateIds[i]; // Check that the state appears only once in the array require(states[_stateIds[i]].nextStateId == 0); } } /// @dev Allow a function in the given state. /// @param _stateId The id of the state /// @param _functionSelector A function selector (bytes4[keccak256(functionSignature)]) function allowFunction(bytes32 _stateId, bytes4 _functionSelector) internal { states[_stateId].allowedFunctions[_functionSelector] = true; } /// @dev Goes to the next state if possible (if the next state is valid) function goToNextState() internal { bytes32 next = states[currentStateId].nextStateId; require(next != 0); currentStateId = next; for (uint256 i = 0; i < states[next].transitionCallbacks.length; i++) { states[next].transitionCallbacks[i](); } LogTransition(next, block.number); } ///@dev add a function returning a boolean as a start condition for a state ///@param _stateId The ID of the state to add the condition for ///@param _condition Start condition function - returns true if a start condition (for a given state ID) is met function addStartCondition(bytes32 _stateId, function(bytes32) internal returns(bool) _condition) internal { states[_stateId].startConditions.push(_condition); } ///@dev add a callback function for a state ///@param _stateId The ID of the state to add a callback function for ///@param _callback The callback function to add function addCallback(bytes32 _stateId, function() internal _callback) internal { states[_stateId].transitionCallbacks.push(_callback); } } // File: @tokenfoundry/state-machine/contracts/TimedStateMachine.sol /// @title A contract that implements the state machine pattern and adds time dependant transitions. contract TimedStateMachine is StateMachine { event LogSetStateStartTime(bytes32 indexed _stateId, uint256 _startTime); // Stores the start timestamp for each state (the value is 0 if the state doesn't have a start timestamp). mapping(bytes32 => uint256) private startTime; /// @dev Returns the timestamp for the given state id. /// @param _stateId The id of the state for which we want to set the start timestamp. function getStateStartTime(bytes32 _stateId) public view returns(uint256) { return startTime[_stateId]; } /// @dev Sets the starting timestamp for a state. /// @param _stateId The id of the state for which we want to set the start timestamp. /// @param _timestamp The start timestamp for the given state. It should be bigger than the current one. function setStateStartTime(bytes32 _stateId, uint256 _timestamp) internal { require(block.timestamp < _timestamp); if (startTime[_stateId] == 0) { addStartCondition(_stateId, hasStartTimePassed); } startTime[_stateId] = _timestamp; LogSetStateStartTime(_stateId, _timestamp); } function hasStartTimePassed(bytes32 _stateId) internal returns(bool) { return startTime[_stateId] <= block.timestamp; } } // File: @tokenfoundry/token-contracts/contracts/TokenControllerI.sol /// @title Interface for token controllers. The controller specifies whether a transfer can be done. contract TokenControllerI { /// @dev Specifies whether a transfer is allowed or not. /// @return True if the transfer is allowed function transferAllowed(address _from, address _to) external view returns (bool); } // File: zeppelin-solidity/contracts/token/ERC20/BasicToken.sol /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) balances; uint256 totalSupply_; /** * @dev total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } } // File: zeppelin-solidity/contracts/token/ERC20/StandardToken.sol /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } // File: @tokenfoundry/token-contracts/contracts/ControllableToken.sol /** * @title Controllable ERC20 token * * @dev Token that queries a token controller contract to check if a transfer is allowed. * @dev controller state var is going to be set with the address of a TokenControllerI contract that has * implemented transferAllowed() function. */ contract ControllableToken is Ownable, StandardToken { TokenControllerI public controller; /// @dev Executes transferAllowed() function from the Controller. modifier isAllowed(address _from, address _to) { require(controller.transferAllowed(_from, _to)); _; } /// @dev Sets the controller that is going to be used by isAllowed modifier function setController(TokenControllerI _controller) onlyOwner public { require(_controller != address(0)); controller = _controller; } /// @dev It calls parent BasicToken.transfer() function. It will transfer an amount of tokens to an specific address /// @return True if the token is transfered with success function transfer(address _to, uint256 _value) isAllowed(msg.sender, _to) public returns (bool) { return super.transfer(_to, _value); } /// @dev It calls parent StandardToken.transferFrom() function. It will transfer from an address a certain amount of tokens to another address /// @return True if the token is transfered with success function transferFrom(address _from, address _to, uint256 _value) isAllowed(_from, _to) public returns (bool) { return super.transferFrom(_from, _to, _value); } } // File: zeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol contract DetailedERC20 is ERC20 { string public name; string public symbol; uint8 public decimals; function DetailedERC20(string _name, string _symbol, uint8 _decimals) public { name = _name; symbol = _symbol; decimals = _decimals; } } // File: @tokenfoundry/token-contracts/contracts/Token.sol /** * @title Token base contract - Defines basic structure for a token * * @dev ControllableToken is a StandardToken, an OpenZeppelin ERC20 implementation library. DetailedERC20 is also an OpenZeppelin contract. * More info about them is available here: https://github.com/OpenZeppelin/zeppelin-solidity/tree/master/contracts/token/ERC20 */ contract Token is ControllableToken, DetailedERC20 { /** * @dev Transfer is an event inherited from ERC20Basic.sol interface (OpenZeppelin). * @param _supply Total supply of tokens. * @param _name Is the long name by which the token contract should be known * @param _symbol The set of capital letters used to represent the token e.g. DTH. * @param _decimals The number of decimal places the tokens can be split up into. This should be between 0 and 18. */ function Token( uint256 _supply, string _name, string _symbol, uint8 _decimals ) DetailedERC20(_name, _symbol, _decimals) public { require(_supply != 0); totalSupply_ = _supply; balances[msg.sender] = _supply; Transfer(address(0), msg.sender, _supply); //event } } // File: @tokenfoundry/sale-contracts/contracts/Sale.sol /// @title Sale base contract contract Sale is Ownable, Whitelistable, TimedStateMachine, TokenControllerI { using SafeMath for uint256; // State machine states bytes32 private constant SETUP = 'setup'; bytes32 private constant FREEZE = 'freeze'; bytes32 private constant SALE_IN_PROGRESS = 'saleInProgress'; bytes32 private constant SALE_ENDED = 'saleEnded'; bytes32[] public states = [SETUP, FREEZE, SALE_IN_PROGRESS, SALE_ENDED]; // Stores the contribution for each user mapping(address => uint256) public contributions; // Records which users have contributed throughout the sale mapping(address => bool) public hasContributed; DisbursementHandler public disbursementHandler; uint256 public weiContributed = 0; uint256 public totalSaleCap; uint256 public minContribution; uint256 public minThreshold; // How many tokens a user will receive per each wei contributed uint256 public tokensPerWei; uint256 public tokensForSale; Token public trustedToken; Vault public trustedVault; event LogContribution(address indexed contributor, uint256 value, uint256 excess); event LogTokensAllocated(address indexed contributor, uint256 amount); function Sale( uint256 _totalSaleCap, uint256 _minContribution, uint256 _minThreshold, uint256 _maxTokens, address _whitelistAdmin, address _wallet, uint256 _closingDuration, uint256 _vaultInitialAmount, uint256 _vaultDisbursementAmount, uint256 _startTime, string _tokenName, string _tokenSymbol, uint8 _tokenDecimals ) Whitelistable(_whitelistAdmin) public { require(_totalSaleCap != 0); require(_maxTokens != 0); require(_wallet != 0); require(_minThreshold <= _totalSaleCap); require(_vaultInitialAmount <= _minThreshold); require(now < _startTime); totalSaleCap = _totalSaleCap; minContribution = _minContribution; minThreshold = _minThreshold; // Setup the necessary contracts trustedToken = new Token(_maxTokens, _tokenName, _tokenSymbol, _tokenDecimals); disbursementHandler = new DisbursementHandler(trustedToken); trustedToken.setController(this); trustedVault = new Vault( _wallet, _vaultInitialAmount, _vaultDisbursementAmount, // disbursement amount _closingDuration ); // Set the states setStates(states); allowFunction(SETUP, this.setup.selector); allowFunction(FREEZE, this.setEndTime.selector); allowFunction(SALE_IN_PROGRESS, this.setEndTime.selector); allowFunction(SALE_IN_PROGRESS, this.contribute.selector); allowFunction(SALE_IN_PROGRESS, this.endSale.selector); allowFunction(SALE_ENDED, this.allocateTokens.selector); // End the sale when the cap is reached addStartCondition(SALE_ENDED, wasCapReached); // Set the onSaleEnded callback (will be called when the sale ends) addCallback(SALE_ENDED, onSaleEnded); // Set the start and end times for the sale setStateStartTime(SALE_IN_PROGRESS, _startTime); } /// @dev Setup the disbursements and tokens for sale. /// @dev This needs to be outside the constructor because the token needs to query the sale for allowed transfers. function setup() public onlyOwner checkAllowed { require(trustedToken.transfer(disbursementHandler, disbursementHandler.totalAmount())); tokensForSale = trustedToken.balanceOf(this); require(tokensForSale >= totalSaleCap); // Go to freeze state goToNextState(); } /// @dev Called by users to contribute ETH to the sale. function contribute(uint256 contributionLimit, uint256 currentSaleCap, uint8 v, bytes32 r, bytes32 s) external payable checkAllowed { // Check that the signature is valid require(currentSaleCap <= totalSaleCap); require(weiContributed < currentSaleCap); require(checkWhitelisted(msg.sender, contributionLimit, currentSaleCap, v, r, s)); uint256 current = contributions[msg.sender]; require(current < contributionLimit); // Get the max amount that the user can contribute uint256 remaining = Math.min256(contributionLimit.sub(current), currentSaleCap.sub(weiContributed)); // Check if it goes over the contribution limit of the user or the eth cap. uint256 contribution = Math.min256(msg.value, remaining); // Get the total contribution for the contributor after the previous checks uint256 totalContribution = current.add(contribution); require(totalContribution >= minContribution); contributions[msg.sender] = totalContribution; hasContributed[msg.sender] = true; weiContributed = weiContributed.add(contribution); trustedVault.deposit.value(contribution)(msg.sender); if (weiContributed >= minThreshold && trustedVault.state() != Vault.State.Success) trustedVault.saleSuccessful(); // If there is an excess, return it to the user uint256 excess = msg.value.sub(contribution); if (excess > 0) msg.sender.transfer(excess); LogContribution(msg.sender, contribution, excess); assert(totalContribution <= contributionLimit); } /// @dev Sets the end time for the sale /// @param _endTime The timestamp at which the sale will end. function setEndTime(uint256 _endTime) external onlyOwner checkAllowed { require(now < _endTime); require(getStateStartTime(SALE_ENDED) == 0); setStateStartTime(SALE_ENDED, _endTime); } /// @dev Called to allocate the tokens depending on eth contributed by the end of the sale. /// @param _contributor The address of the contributor. function allocateTokens(address _contributor) external checkAllowed { require(contributions[_contributor] != 0); // Transfer the respective tokens to the contributor uint256 amount = contributions[_contributor].mul(tokensPerWei); // Set contributions to 0 contributions[_contributor] = 0; require(trustedToken.transfer(_contributor, amount)); LogTokensAllocated(_contributor, amount); } /// @dev Called to end the sale by the owner. Can only be called in SALE_IN_PROGRESS state function endSale() external onlyOwner checkAllowed { goToNextState(); } /// @dev Since Sale is TokenControllerI, it has to implement transferAllowed() function /// @notice only the Sale and DisbursementHandler can disburse the initial tokens to their future owners function transferAllowed(address _from, address) external view returns (bool) { return _from == address(this) || _from == address(disbursementHandler); } /// @dev Called internally by the sale to setup a disbursement (it has to be called in the constructor of child sales) /// param _beneficiary Tokens will be disbursed to this address. /// param _amount Number of tokens to be disbursed. /// param _duration Tokens will be locked for this long. function setupDisbursement(address _beneficiary, uint256 _amount, uint256 _duration) internal { require(tokensForSale == 0); disbursementHandler.setupDisbursement(_beneficiary, _amount, now.add(_duration)); } /// @dev Returns true if the cap was reached. function wasCapReached(bytes32) internal returns (bool) { return totalSaleCap <= weiContributed; } /// @dev Callback that gets called when entering the SALE_ENDED state. function onSaleEnded() internal { // If the minimum threshold wasn't reached, enable refunds if (weiContributed < minThreshold) { trustedVault.enableRefunds(); } else { trustedVault.beginClosingPeriod(); tokensPerWei = tokensForSale.div(weiContributed); } trustedToken.transferOwnership(owner); trustedVault.transferOwnership(owner); } } // File: contracts/VirtuePokerSale.sol contract VirtuePokerSale is Sale { function VirtuePokerSale() Sale( 25000 ether, // Total sale cap 1 ether, // Min contribution 12000 ether, // Min threshold 500000000 * (10 ** 18), // Max tokens 0x13ebf15f2e32d05ea944927ef5e6a3cad8187440, // Whitelist Admin 0xaa0aE3459F9f3472d1237015CaFC1aAfc6F03C63, // Wallet 28 days, // Closing duration 12000 ether, // Vault initial amount 25000 ether, // Vault disbursement amount 1524218400, // Start time "Virtue Player Points", // Token name "VPP", // Token symbol 18 // Token decimals ) public { // Team Wallet (50,000,000 VPP, 25% per year) setupDisbursement(0x2e286dA6Ee6E8e0Afb2c1CfADb1B74669a3cD642, 12500000 * (10 ** 18), 1 years); setupDisbursement(0x2e286dA6Ee6E8e0Afb2c1CfADb1B74669a3cD642, 12500000 * (10 ** 18), 2 years); setupDisbursement(0x2e286dA6Ee6E8e0Afb2c1CfADb1B74669a3cD642, 12500000 * (10 ** 18), 3 years); setupDisbursement(0x2e286dA6Ee6E8e0Afb2c1CfADb1B74669a3cD642, 12500000 * (10 ** 18), 4 years); // Company Wallet (250,000,000 VPP, no lock-up) setupDisbursement(0xaa0aE3459F9f3472d1237015CaFC1aAfc6F03C63, 250000000 * (10 ** 18), 1 days); // Founder Allocations (total 100,000,000, 12.5% per 6 months) setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 0.5 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 1 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 1.5 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 2 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 2.5 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 3 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 3.5 years); setupDisbursement(0x5ca71f050865092468CF8184D09e087F3DC58e31, 8000000 * (10 ** 18), 4 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 0.5 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 1 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 1.5 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 2 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 2.5 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 3 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 3.5 years); setupDisbursement(0x35fc8cA81E1b5992a0727c6Aa87DbeB8cca42094, 2250000 * (10 ** 18), 4 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 0.5 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 1 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 1.5 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 2 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 2.5 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 3 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 3.5 years); setupDisbursement(0xce3EFA6763e23DF21aF74DA46C6489736F96d4B6, 2250000 * (10 ** 18), 4 years); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"states","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensForSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contributionLimit","type":"uint256"},{"name":"currentSaleCap","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"contribute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"hasContributed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"","type":"address"}],"name":"transferAllowed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensPerWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trustedVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stateId","type":"bytes32"}],"name":"getStateStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"}],"name":"addToBlacklist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"whitelistAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"}],"name":"removeFromBlacklist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"disbursementHandler","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSaleCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_admin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minContribution","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contributor","type":"address"}],"name":"allocateTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_endTime","type":"uint256"}],"name":"setEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"conditionalTransitions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentStateId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trustedToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"contributor","type":"address"},{"name":"contributionLimit","type":"uint256"},{"name":"currentSaleCap","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"checkWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blacklist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"contributor","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"excess","type":"uint256"}],"name":"LogContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"contributor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogTokensAllocated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_stateId","type":"bytes32"},{"indexed":false,"name":"_startTime","type":"uint256"}],"name":"LogSetStateStartTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stateId","type":"bytes32"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"LogTransition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newAdmin","type":"address"}],"name":"LogAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
6060604052608060405190810160409081527f736574757000000000000000000000000000000000000000000000000000000082527f667265657a65000000000000000000000000000000000000000000000000000060208301527f73616c65496e50726f6772657373000000000000000000000000000000000000908201527f73616c65456e64656400000000000000000000000000000000000000000000006060820152620000b59060069060046200149d565b506000600a553415620000c757600080fd5b69054b40b1f852bda00000670de0b6b3a764000069028a857425466f8000006b019d971e4fe8401e740000007313ebf15f2e32d05ea944927ef5e6a3cad818744073aa0ae3459f9f3472d1237015cafc1aafc6f03c636224ea0069028a857425466f80000069054b40b1f852bda00000635ad9ba20604080519081016040908152601482527f56697274756520506c6179657220506f696e747300000000000000000000000060208301528051908101604052600381527f5650500000000000000000000000000000000000000000000000000000000000602082015260008054600160a060020a03191633600160a060020a03908116919091179091556012908990819081161515620001da57600080fd5b5060018054600160a060020a031916600160a060020a03929092169190911790558c15156200020857600080fd5b8915156200021557600080fd5b600160a060020a03881615156200022b57600080fd5b8c8b11156200023957600080fd5b8a8611156200024757600080fd5b428490106200025557600080fd5b600b8d9055600c8c9055600d8b90558983838362000272620014ef565b84815260ff82166060820152608060208201818152906040830190830186818151815260200191508051906020019080838360005b83811015620002c1578082015183820152602001620002a7565b50505050905090810190601f168015620002ef5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b83811015620003275780820151838201526020016200030d565b50505050905090810190601f168015620003555780820380516001836020036101000a031916815260200191505b509650505050505050604051809103906000f08015156200037557600080fd5b60108054600160a060020a031916600160a060020a039283161790819055166200039e62001500565b600160a060020a039091168152602001604051809103906000f0801515620003c557600080fd5b60098054600160a060020a031916600160a060020a03928316179055601054166392eefe9b306040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200044357600080fd5b6102c65a03f115156200045557600080fd5b505050878686896200046662001511565b8085600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001945050505050604051809103906000f0801515620004ae57600080fd5b601160006101000a815481600160a060020a030219169083600160a060020a031602179055506200054660068054806020026020016040519081016040528092919081815260200182805480156200052757602002820191906000526020600020905b8154815260019091019060200180831162000511575b505050505062000edd640100000000026200137e176401000000009004565b620005a07f73657475700000000000000000000000000000000000000000000000000000007fba0bba40000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620005fa7f667265657a6500000000000000000000000000000000000000000000000000007fccb98ffc000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620006547f73616c65496e50726f67726573730000000000000000000000000000000000007fccb98ffc000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620006ae7f73616c65496e50726f67726573730000000000000000000000000000000000007f1a069c72000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620007087f73616c65496e50726f67726573730000000000000000000000000000000000007f380d831b000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620007627f73616c65456e64656400000000000000000000000000000000000000000000007fcabfd1bf000000000000000000000000000000000000000000000000000000006401000000006200148d62000ff982021704565b620007b17f73616c65456e64656400000000000000000000000000000000000000000000006200104864010000000002620014c4176200105464010000000002620012cf176401000000009004565b620008007f73616c65456e6465640000000000000000000000000000000000000000000000620010bb64010000000002620014d017620012dc6401000000000262001674176401000000009004565b6200083a7f73616c65496e50726f6772657373000000000000000000000000000000000000856401000000006200123f620012ff82021704565b505050505050505050505050506200088b732e286da6ee6e8e0afb2c1cfadb1b74669a3cd6426a0a56fa5b99019a5c8000006301e133806200139e6401000000000262001695176401000000009004565b620008c9732e286da6ee6e8e0afb2c1cfadb1b74669a3cd6426a0a56fa5b99019a5c8000006303c26700640100000000620016956200139e82021704565b62000907732e286da6ee6e8e0afb2c1cfadb1b74669a3cd6426a0a56fa5b99019a5c8000006305a39a80640100000000620016956200139e82021704565b62000945732e286da6ee6e8e0afb2c1cfadb1b74669a3cd6426a0a56fa5b99019a5c800000630784ce00640100000000620016956200139e82021704565b6200098273aa0ae3459f9f3472d1237015cafc1aafc6f03c636acecb8f27f4200f3a00000062015180640100000000620016956200139e82021704565b620009ba60008051602062004afb8339815191526a069e10de76676d0800000062f099c0640100000000620016956200139e82021704565b620009f360008051602062004afb8339815191526a069e10de76676d080000006301e13380640100000000620016956200139e82021704565b62000a2c60008051602062004afb8339815191526a069e10de76676d080000006302d1cd40640100000000620016956200139e82021704565b62000a6560008051602062004afb8339815191526a069e10de76676d080000006303c26700640100000000620016956200139e82021704565b62000a9e60008051602062004afb8339815191526a069e10de76676d080000006304b300c0640100000000620016956200139e82021704565b62000ad760008051602062004afb8339815191526a069e10de76676d080000006305a39a80640100000000620016956200139e82021704565b62000b1060008051602062004afb8339815191526a069e10de76676d080000006306943440640100000000620016956200139e82021704565b62000b4960008051602062004afb8339815191526a069e10de76676d08000000630784ce00640100000000620016956200139e82021704565b62000b8160008051602062004b1b8339815191526a01dc74be914d16aa40000062f099c0640100000000620016956200139e82021704565b62000bba60008051602062004b1b8339815191526a01dc74be914d16aa4000006301e13380640100000000620016956200139e82021704565b62000bf360008051602062004b1b8339815191526a01dc74be914d16aa4000006302d1cd40640100000000620016956200139e82021704565b62000c2c60008051602062004b1b8339815191526a01dc74be914d16aa4000006303c26700640100000000620016956200139e82021704565b62000c6560008051602062004b1b8339815191526a01dc74be914d16aa4000006304b300c0640100000000620016956200139e82021704565b62000c9e60008051602062004b1b8339815191526a01dc74be914d16aa4000006305a39a80640100000000620016956200139e82021704565b62000cd760008051602062004b1b8339815191526a01dc74be914d16aa4000006306943440640100000000620016956200139e82021704565b62000d1060008051602062004b1b8339815191526a01dc74be914d16aa400000630784ce00640100000000620016956200139e82021704565b62000d4860008051602062004b3b8339815191526a01dc74be914d16aa40000062f099c0640100000000620016956200139e82021704565b62000d8160008051602062004b3b8339815191526a01dc74be914d16aa4000006301e13380640100000000620016956200139e82021704565b62000dba60008051602062004b3b8339815191526a01dc74be914d16aa4000006302d1cd40640100000000620016956200139e82021704565b62000df360008051602062004b3b8339815191526a01dc74be914d16aa4000006303c26700640100000000620016956200139e82021704565b62000e2c60008051602062004b3b8339815191526a01dc74be914d16aa4000006304b300c0640100000000620016956200139e82021704565b62000e6560008051602062004b3b8339815191526a01dc74be914d16aa4000006305a39a80640100000000620016956200139e82021704565b62000e9e60008051602062004b3b8339815191526a01dc74be914d16aa4000006306943440640100000000620016956200139e82021704565b62000ed760008051602062004b3b8339815191526a01dc74be914d16aa400000630784ce00640100000000620016956200139e82021704565b62001574565b60008082511162000eed57600080fd5b6004541562000efb57600080fd5b8160008151811062000f0957fe5b90602001906020020151151562000f1f57600080fd5b8160008151811062000f2d57fe5b906020019060200201516004555060015b815181101562000ff55781818151811062000f5557fe5b90602001906020020151151562000f6b57600080fd5b81818151811062000f7857fe5b906020019060200201516003600084600185038151811062000f9657fe5b906020019060200201518152602081019190915260400160009081209190915560039083838151811062000fc657fe5b9060200190602002015181526020810191909152604001600020541562000fec57600080fd5b60010162000f3e565b5050565b60009182526003602090815260408084207fffffffff0000000000000000000000000000000000000000000000000000000090931684526001928301909152909120805460ff19169091179055565b50600a54600b54111590565b60008281526003602081905260409091200180546001810162001078838262001522565b916000526020600020906004918282040191900660080283909190916101000a8154816001604060020a0302191690836001604060020a03160217905550505050565b600d54600a5410156200113c57601154600160a060020a0316638c52dc416040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156200112157600080fd5b6102c65a03f115156200113357600080fd5b505050620011ce565b601154600160a060020a0316637b0863de6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156200119557600080fd5b6102c65a03f11515620011a757600080fd5b5050600a54600f54620011ca925090640100000000620017296200145882021704565b600e555b601054600054600160a060020a039182169163f2fde38b91166040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200123f57600080fd5b6102c65a03f115156200125157600080fd5b5050601154600054600160a060020a03918216925063f2fde38b91166040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620012c557600080fd5b6102c65a03f11515620012d757600080fd5b505050565b600082815260036020526040902060020180546001810162001078838262001522565b428190106200130d57600080fd5b6000828152600560205260409020541515620013525762001352826200147064010000000002620012b9176200105464010000000002620012cf176401000000009004565b6000828152600560205260409081902082905582907f910b922fc573f1132ffccba3c67771b0dfa3abcbb76bf7ffb732d09e90ca2e8f9083905190815260200160405180910390a25050565b600f5415620013ac57600080fd5b600954600160a060020a031663763ffcec8484620013d94286640100000000620011516200148682021704565b6040517c010000000000000000000000000000000000000000000000000000000063ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b15156200143e57600080fd5b6102c65a03f115156200145057600080fd5b505050505050565b60008082848115156200146757fe5b04949350505050565b6000908152600560205260409020544290111590565b6000828201838110156200149657fe5b9392505050565b828054828255906000526020600020908101928215620014dd579160200282015b82811115620014dd5782518255602090920191600190910190620014be565b50620014eb92915062001554565b5090565b604051610d7f8062002cf083390190565b6040516106c98062003a6f83390190565b6040516109c3806200413883390190565b815481835581811511620012d7576003016004900481600301600490048360005260206000209182019101620012d791905b6200157191905b80821115620014eb57600081556001016200155b565b90565b61176c80620015846000396000f30060606040526004361061015b5763ffffffff60e060020a600035041663017a9105811461016057806312aef8c3146101885780631a069c721461019b578063205b1946146101b7578063214e52ca146101ea57806322d60d171461020f578063279fdf6d146102225780632f782b321461025157806332cd724a14610264578063380d831b1461027a57806342e94c901461028d57806344337ea1146102ac5780634adbe551146102cb578063537df3b6146102de5780637467bc92146102fd5780638d578bee146103105780638da5cb5b146103235780638f28397014610336578063aaffadf314610355578063ba0bba4014610368578063c85501bb1461037b578063cabfd1bf1461038e578063ccb98ffc146103ad578063d525aa32146103c3578063de4138de146103d6578063e3386a98146103e9578063eca001dd146103fc578063f2fde38b1461042d578063f9f92be41461044c575b600080fd5b341561016b57600080fd5b61017660043561046b565b60405190815260200160405180910390f35b341561019357600080fd5b61017661048a565b6101b560043560243560ff60443516606435608435610490565b005b34156101c257600080fd5b6101d6600160a060020a03600435166107bf565b604051901515815260200160405180910390f35b34156101f557600080fd5b6101d6600160a060020a03600435811690602435166107d4565b341561021a57600080fd5b61017661080a565b341561022d57600080fd5b610235610810565b604051600160a060020a03909116815260200160405180910390f35b341561025c57600080fd5b61017661081f565b341561026f57600080fd5b610176600435610825565b341561028557600080fd5b6101b5610837565b341561029857600080fd5b610176600160a060020a036004351661089d565b34156102b757600080fd5b6101b5600160a060020a03600435166108af565b34156102d657600080fd5b6102356108ee565b34156102e957600080fd5b6101b5600160a060020a03600435166108fd565b341561030857600080fd5b610235610939565b341561031b57600080fd5b610176610948565b341561032e57600080fd5b61023561094e565b341561034157600080fd5b6101b5600160a060020a036004351661095d565b341561036057600080fd5b6101766109f4565b341561037357600080fd5b6101b56109fa565b341561038657600080fd5b610176610bc1565b341561039957600080fd5b6101b5600160a060020a0360043516610bc7565b34156103b857600080fd5b6101b5600435610d3b565b34156103ce57600080fd5b6101b5610e04565b34156103e157600080fd5b610176610edb565b34156103f457600080fd5b610235610ee2565b341561040757600080fd5b6101d6600160a060020a036004351660243560443560ff6064351660843560a435610ef1565b341561043857600080fd5b6101b5600160a060020a0360043516611079565b341561045757600080fd5b6101d6600160a060020a0360043516611114565b600680548290811061047957fe5b600091825260209091200154905081565b600f5481565b60008060008060006104a0610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156104d957600080fd5b600b548911156104e857600080fd5b600a548990106104f757600080fd5b610505338b8b8b8b8b610ef1565b151561051057600080fd5b600160a060020a033316600090815260076020526040902054945089851061053757600080fd5b61056361054a8b8763ffffffff61112916565b600a5461055e908c9063ffffffff61112916565b61113b565b935061056f348561113b565b9250610581858463ffffffff61115116565b600c5490925082101561059357600080fd5b600160a060020a033316600090815260076020908152604080832085905560089091529020805460ff19166001179055600a546105d6908463ffffffff61115116565b600a55601154600160a060020a031663f340fa01843360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561062957600080fd5b6125ee5a03f1151561063a57600080fd5b50505050600d54600a54101580156106c057506001601154600160a060020a031663c19d93fb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561069757600080fd5b6102c65a03f115156106a857600080fd5b5050506040518051905060038111156106bd57fe5b14155b1561071957601154600160a060020a0316635eabe01e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561070457600080fd5b6102c65a03f1151561071557600080fd5b5050505b610729348463ffffffff61112916565b9050600081111561076557600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561076557600080fd5b33600160a060020a03167f85f3c568c46211a851eab01fa3dd8725e07fb05eeaf9f852859aa866f787d9fe848360405191825260208201526040908101905180910390a2898211156107b357fe5b50505050505050505050565b60086020526000908152604090205460ff1681565b600030600160a060020a031683600160a060020a031614806108035750600954600160a060020a038481169116145b9392505050565b600e5481565b601154600160a060020a031681565b600a5481565b60009081526005602052604090205490565b60005433600160a060020a0390811691161461085257600080fd5b61085a610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff16151561089357600080fd5b61089b61116b565b565b60076020526000908152604090205481565b60015433600160a060020a039081169116146108ca57600080fd5b600160a060020a03166000908152600260205260409020805460ff19166001179055565b600154600160a060020a031681565b60015433600160a060020a0390811691161461091857600080fd5b600160a060020a03166000908152600260205260409020805460ff19169055565b600954600160a060020a031681565b600b5481565b600054600160a060020a031681565b60005433600160a060020a0390811691161461097857600080fd5b80600160a060020a038116151561098e57600080fd5b81600160a060020a03167f92bec23a66fc8de1f2b80d13f392cb5a8edd5c524cbea94609a1053c38323bc160405160405180910390a2506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5481565b60005433600160a060020a03908116911614610a1557600080fd5b610a1d610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610a5657600080fd5b601054600954600160a060020a039182169163a9059cbb911680631a39d8ef6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610aac57600080fd5b6102c65a03f11515610abd57600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1357600080fd5b6102c65a03f11515610b2457600080fd5b505050604051805190501515610b3957600080fd5b601054600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b9257600080fd5b6102c65a03f11515610ba357600080fd5b5050506040518051600f819055600b54901015905061089357600080fd5b600d5481565b6000610bd1610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610c0a57600080fd5b600160a060020a0382166000908152600760205260409020541515610c2e57600080fd5b600e54600160a060020a038316600090815260076020526040902054610c599163ffffffff61121416565b600160a060020a03808416600090815260076020526040808220829055601054939450929091169163a9059cbb918591859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610cd457600080fd5b6102c65a03f11515610ce557600080fd5b505050604051805190501515610cfa57600080fd5b81600160a060020a03167f5b7bccf2cf20f5a50db7bd55abd00dda3d627a8e68aa8c16c25a773f1a3c36c48260405190815260200160405180910390a25050565b60005433600160a060020a03908116911614610d5657600080fd5b610d5e610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610d9757600080fd5b42819010610da457600080fd5b610dcd7f73616c65456e6465640000000000000000000000000000000000000000000000610825565b15610dd757600080fd5b610e017f73616c65456e64656400000000000000000000000000000000000000000000008261123f565b50565b60045460009081526003602052604081205490805b8215610ed6575060009050805b60008381526003602081905260409091200154811015610ec5576000838152600360208190526040909120018054610e9691859184908110610e6457fe5b90600052602060002090600491828204019190066008029054906101000a900467ffffffffffffffff1663ffffffff16565b15610ebd57610ea361116b565b600092835260036020526040909220549160019150610ec5565b600101610e26565b811515610ed157610ed6565b610e19565b505050565b6004545b90565b601054600160a060020a031681565b6000806040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250888888604051600160a060020a03939093166c010000000000000000000000000283526014830191909152603482015260540160405180910390206040518083805190602001908083835b60208310610f945780518252601f199092019160209182019101610f75565b6001836020036101000a03801982511681845116179092525050509190910192835250506020019050604051908190039020600160a060020a03891660009081526002602052604090205490915060ff1615801561106d57506001818686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561105257600080fd5b505060206040510351600154600160a060020a039081169116145b98975050505050505050565b60005433600160a060020a0390811691161461109457600080fd5b600160a060020a03811615156110a957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60026020526000908152604090205460ff1681565b60008282111561113557fe5b50900390565b600081831061114a5781610803565b5090919050565b60008282018381101561116057fe5b8091505b5092915050565b6004546000908152600360205260408120549081151561118a57600080fd5b50600481905560005b6000828152600360205260409020600201548110156111d657600082815260036020526040902060020180546111ce919083908110610e6457fe5b600101611193565b7f96176797e3a5e248293a99794b69542c096df98f575121ca8eb7ccf5156a0274824360405191825260208201526040908101905180910390a15050565b6000808315156112275760009150611164565b5082820282848281151561123757fe5b041461116057fe5b4281901061124c57600080fd5b600082815260056020526040902054151561126d5761126d826112b96112cf565b6000828152600560205260409081902082905582907f910b922fc573f1132ffccba3c67771b0dfa3abcbb76bf7ffb732d09e90ca2e8f9083905190815260200160405180910390a25050565b6000908152600560205260409020544290111590565b6000828152600360208190526040909120018054600181016112f18382611336565b916000526020600020906004918282040191900660080283909190916101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b815481835581811511610ed657600083815260209020610ed691610edf9160046003928301819004820192860104015b8082111561137a5760008155600101611366565b5090565b60008082511161138d57600080fd5b6004541561139a57600080fd5b816000815181106113a757fe5b9060200190602002015115156113bc57600080fd5b816000815181106113c957fe5b906020019060200201516004555060015b8151811015611489578181815181106113ef57fe5b90602001906020020151151561140457600080fd5b81818151811061141057fe5b906020019060200201516003600084600185038151811061142d57fe5b906020019060200201518152602081019190915260400160009081209190915560039083838151811061145c57fe5b9060200190602002015181526020810191909152604001600020541561148157600080fd5b6001016113da565b5050565b6000918252600360209081526040808420600160e060020a031990931684526001928301909152909120805460ff19169091179055565b50600a54600b54111590565b600d54600a54101561153457601154600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561151b57600080fd5b6102c65a03f1151561152c57600080fd5b5050506115a1565b601154600160a060020a0316637b0863de6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561157357600080fd5b6102c65a03f1151561158457600080fd5b5050600a54600f5461159d92509063ffffffff61172916565b600e555b601054600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156115f857600080fd5b6102c65a03f1151561160957600080fd5b5050601154600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561166357600080fd5b6102c65a03f11515610ed657600080fd5b60008281526003602052604090206002018054600181016112f18382611336565b600f54156116a257600080fd5b600954600160a060020a031663763ffcec84846116c5428663ffffffff61115116565b60405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b151561171057600080fd5b6102c65a03f1151561172157600080fd5b505050505050565b600080828481151561173757fe5b049493505050505600a165627a7a72305820326a26d9ee94b02799273acb20d41fecd5e6f07deb5142b7e46bdccc38e4431f00296060604052341561000f57600080fd5b604051610d7f380380610d7f833981016040528080519190602001805182019190602001805182019190602001805160008054600160a060020a03191633600160a060020a0316179055915083905082826005838051610073929160200190610107565b506006828051610087929160200190610107565b506007805460ff191660ff9290921691909117905550508315156100aa57600080fd5b6002849055600160a060020a0333166000818152600160205260408082208790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9087905190815260200160405180910390a3505050506101a2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061014857805160ff1916838001178555610175565b82800160010185558215610175579182015b8281111561017557825182559160200191906001019061015a565b50610181929150610185565b5090565b61019f91905b80821115610181576000815560010161018b565b90565b610bce806101b16000396000f3006060604052600436106100c15763ffffffff60e060020a60003504166306fdde0381146100c6578063095ea7b31461015057806318160ddd1461018657806323b872dd146101ab578063313ce567146101d357806366188463146101fc57806370a082311461021e5780638da5cb5b1461023d57806392eefe9b1461026c57806395d89b411461028d578063a9059cbb146102a0578063d73dd623146102c2578063dd62ed3e146102e4578063f2fde38b14610309578063f77c479114610328575b600080fd5b34156100d157600080fd5b6100d961033b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101155780820151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015b57600080fd5b610172600160a060020a03600435166024356103d9565b604051901515815260200160405180910390f35b341561019157600080fd5b610199610445565b60405190815260200160405180910390f35b34156101b657600080fd5b610172600160a060020a036004358116906024351660443561044b565b34156101de57600080fd5b6101e66104ed565b60405160ff909116815260200160405180910390f35b341561020757600080fd5b610172600160a060020a03600435166024356104f6565b341561022957600080fd5b610199600160a060020a03600435166105f0565b341561024857600080fd5b61025061060b565b604051600160a060020a03909116815260200160405180910390f35b341561027757600080fd5b61028b600160a060020a036004351661061a565b005b341561029857600080fd5b6100d9610679565b34156102ab57600080fd5b610172600160a060020a03600435166024356106e4565b34156102cd57600080fd5b610172600160a060020a0360043516602435610784565b34156102ef57600080fd5b610199600160a060020a0360043581169060243516610828565b341561031457600080fd5b61028b600160a060020a0360043516610853565b341561033357600080fd5b6102506108ee565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d15780601f106103a6576101008083540402835291602001916103d1565b820191906000526020600020905b8154815290600101906020018083116103b457829003601f168201915b505050505081565b600160a060020a03338116600081815260036020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60025490565b60045460009084908490600160a060020a031663214e52ca8383866040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b15156104b257600080fd5b6102c65a03f115156104c357600080fd5b5050506040518051905015156104d857600080fd5b6104e38686866108fd565b9695505050505050565b60075460ff1681565b600160a060020a0333811660009081526003602090815260408083209386168352929052908120548083111561055357600160a060020a03338116600090815260036020908152604080832093881683529290529081205561058a565b610563818463ffffffff610a7f16565b600160a060020a033381166000908152600360209081526040808320938916835292905220555b600160a060020a0333811660008181526003602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600160a060020a031660009081526001602052604090205490565b600054600160a060020a031681565b60005433600160a060020a0390811691161461063557600080fd5b600160a060020a038116151561064a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d15780601f106103a6576101008083540402835291602001916103d1565b60045460009033908490600160a060020a031663214e52ca8383866040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b151561074b57600080fd5b6102c65a03f1151561075c57600080fd5b50505060405180519050151561077157600080fd5b61077b8585610a91565b95945050505050565b600160a060020a0333811660009081526003602090815260408083209386168352929052908120546107bc908363ffffffff610b8c16565b600160a060020a0333811660008181526003602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b60005433600160a060020a0390811691161461086e57600080fd5b600160a060020a038116151561088357600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600454600160a060020a031681565b6000600160a060020a038316151561091457600080fd5b600160a060020a03841660009081526001602052604090205482111561093957600080fd5b600160a060020a038085166000908152600360209081526040808320339094168352929052205482111561096c57600080fd5b600160a060020a038416600090815260016020526040902054610995908363ffffffff610a7f16565b600160a060020a0380861660009081526001602052604080822093909355908516815220546109ca908363ffffffff610b8c16565b600160a060020a03808516600090815260016020908152604080832094909455878316825260038152838220339093168252919091522054610a12908363ffffffff610a7f16565b600160a060020a03808616600081815260036020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600082821115610a8b57fe5b50900390565b6000600160a060020a0383161515610aa857600080fd5b600160a060020a033316600090815260016020526040902054821115610acd57600080fd5b600160a060020a033316600090815260016020526040902054610af6908363ffffffff610a7f16565b600160a060020a033381166000908152600160205260408082209390935590851681522054610b2b908363ffffffff610b8c16565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b600082820183811015610b9b57fe5b93925050505600a165627a7a72305820b8c87ee973e0c1f7ba5d0646c429316821ea8f0d8cc6a7c13de230301ead2ff800296060604052341561000f57600080fd5b6040516020806106c98339810160405280805160008054600160a060020a03338116600160a060020a03199283161790925560018054929093169116179055505061066a8061005f6000396000f3006060604052600436106100985763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631a39d8ef811461009d578063250540cf146100c25780633ccfd60b146100e1578063763ffcec146100f65780637a1530431461011b5780638da5cb5b14610155578063e8c9a3e514610184578063f2fde38b146101a3578063fc0c546a146101c2575b600080fd5b34156100a857600080fd5b6100b06101d5565b60405190815260200160405180910390f35b34156100cd57600080fd5b6100b0600160a060020a03600435166101db565b34156100ec57600080fd5b6100f461029a565b005b341561010157600080fd5b6100f4600160a060020a03600435166024356044356103d1565b341561012657600080fd5b61013d600160a060020a03600435166024356104b8565b60405191825260208201526040908101905180910390f35b341561016057600080fd5b6101686104f3565b604051600160a060020a03909116815260200160405180910390f35b341561018f57600080fd5b6100b0600160a060020a0360043516610502565b34156101ae57600080fd5b6100f4600160a060020a0360043516610514565b34156101cd57600080fd5b6101686105af565b60025481565b600160a060020a03811660009081526003602052604081208054829190825b8181101561026657828181548110151561021057fe5b90600052602060002090600202016000015442111561025e5761025b838281548110151561023a57fe5b906000526020600020906002020160010154856105be90919063ffffffff16565b93505b6001016101fa565b600160a060020a03861660009081526004602052604090205461029090859063ffffffff6105d416565b9695505050505050565b60006102a5336101db565b90508015156102b357600080fd5b600160a060020a0333166000908152600460205260409020546102dc908263ffffffff6105be16565b600160a060020a0333818116600090815260046020526040808220949094556001549092169263a9059cbb92859151602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561036b57600080fd5b6102c65a03f1151561037c57600080fd5b50505060405180519050151561039157600080fd5b33600160a060020a03167f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab7088260405190815260200160405180910390a250565b60005433600160a060020a039081169116146103ec57600080fd5b428190106103f957600080fd5b600160a060020a038316600090815260036020526040902080546001810161042183826105e6565b916000526020600020906002020160006040805190810160405284815260208101869052919050815181556020820151600190910155505060025461046c908363ffffffff6105be16565b600255600160a060020a0383167fee26bf684b1caabd55a818dba8edff6f95687e810688f88294343938f29222d7828460405191825260208201526040908101905180910390a2505050565b6003602052816000526040600020818154811015156104d357fe5b600091825260209091206002909102018054600190910154909250905082565b600054600160a060020a031681565b60046020526000908152604090205481565b60005433600160a060020a0390811691161461052f57600080fd5b600160a060020a038116151561054457600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a031681565b6000828201838110156105cd57fe5b9392505050565b6000828211156105e057fe5b50900390565b815481835581811511610612576002028160020283600052602060002091820191016106129190610617565b505050565b61063b91905b80821115610637576000808255600182015560020161061d565b5090565b905600a165627a7a723058201d63a04f89708b7bba0cce3c139cc28ee0752e49e26ddd0c800eaedeb91155a300296060604052341561000f57600080fd5b6040516080806109c38339810160405280805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925085161515905061006a57600080fd5b81151561007657600080fd5b80151561008257600080fd5b60038054600160a060020a031916600160a060020a039590951694909417909355600491909155600255600855600a805460ff191690556108fb806100c86000396000f3006060604052600436106101115763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663117d94f5811461011657806325973df51461012b57806343d726d614610150578063570d2f8f146101635780635eabe01e146101925780637b0863de146101a55780638c52dc41146101b85780638da5cb5b146101cb5780639a4c8933146101de578063adb71a1e146101f1578063bf89662d14610204578063c19d93fb14610217578063cb13cddb1461024e578063cd8888e51461026d578063f28b7a9c14610280578063f2fde38b14610293578063f340fa01146102b2578063fa89401a146102c6578063fc1ed437146102e5578063ff50abdc146102f8575b600080fd5b341561012157600080fd5b61012961030b565b005b341561013657600080fd5b61013e6103ca565b60405190815260200160405180910390f35b341561015b57600080fd5b6101296103d0565b341561016e57600080fd5b610176610448565b604051600160a060020a03909116815260200160405180910390f35b341561019d57600080fd5b610129610457565b34156101b057600080fd5b6101296104f3565b34156101c357600080fd5b610129610553565b34156101d657600080fd5b6101766105a9565b34156101e957600080fd5b61013e6105b8565b34156101fc57600080fd5b61013e6105be565b341561020f57600080fd5b61013e6105c4565b341561022257600080fd5b61022a6105ca565b6040518082600381111561023a57fe5b60ff16815260200191505060405180910390f35b341561025957600080fd5b61013e600160a060020a03600435166105d3565b341561027857600080fd5b61013e6105e5565b341561028b57600080fd5b61013e6105ec565b341561029e57600080fd5b610129600160a060020a03600435166105f2565b610129600160a060020a036004351661068d565b34156102d157600080fd5b610129600160a060020a0360043516610753565b34156102f057600080fd5b61013e61083d565b341561030357600080fd5b61013e610843565b6000600380600a5460ff16600381111561032157fe5b1461032b57600080fd5b6005544290610343906224ea0063ffffffff61084916565b111561034e57600080fd5b4260055560025461036a90600160a060020a0330163190610863565b9150600754821161038d57600754610388908363ffffffff61087b16565b610390565b60005b600755600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156103c657600080fd5b5050565b60095481565b600180600a5460ff1660038111156103e457fe5b146103ee57600080fd5b6009541580159061040157504260095411155b151561040c57600080fd5b600a805460ff191660031790557f0cbf711abd5268e287bdccda6099e8c45c4f29299dcf4a7bb3dc0c1b2d16bb6560405160405180910390a150565b600354600160a060020a031681565b60005433600160a060020a0390811691161461047257600080fd5b600080600a5460ff16600381111561048657fe5b1461049057600080fd5b600a805460ff191660011790556004546007546104ac9161087b565b600755600454156104f057600354600454600160a060020a039091169080156108fc0290604051600060405180830381858888f1935050505015156104f057600080fd5b50565b60005433600160a060020a0390811691161461050e57600080fd5b600180600a5460ff16600381111561052257fe5b1461052c57600080fd5b6009541561053957600080fd5b60085461054d90429063ffffffff61084916565b60095550565b60005433600160a060020a0390811691161461056e57600080fd5b600a805460ff191660021790557ffb33e68b8317895375ad9fcd57a71c3759bcfdf95d02d557f99d71d79f2d1d6260405160405180910390a1565b600054600160a060020a031681565b60055481565b60085481565b60075481565b600a5460ff1681565b60016020526000908152604090205481565b6224ea0081565b60025481565b60005433600160a060020a0390811691161461060d57600080fd5b600160a060020a038116151561062257600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005433600160a060020a039081169116146106a857600080fd5b6000600a5460ff1660038111156106bb57fe5b14806106d757506001600a5460ff1660038111156106d557fe5b145b15156106e257600080fd5b6006546106f5903463ffffffff61084916565b60065560075461070b903463ffffffff61084916565b600755600160a060020a038116600090815260016020526040902054610737903463ffffffff61084916565b600160a060020a03909116600090815260016020526040902055565b6000600280600a5460ff16600381111561076957fe5b1461077357600080fd5b600654600754600160a060020a0385166000908152600160205260409020546107b392916107a7919063ffffffff61088d16565b9063ffffffff6108b816565b600160a060020a038416600081815260016020526040808220919091559193509083156108fc0290849051600060405180830381858888f1935050505015156107fb57600080fd5b82600160a060020a03167fe53401aefeb7b394682ea9c8af5d7fa3c4789a12d45f8eb316c5f874d1e832858360405190815260200160405180910390a2505050565b60045481565b60065481565b60008282018381101561085857fe5b8091505b5092915050565b60008183106108725781610874565b825b9392505050565b60008282111561088757fe5b50900390565b6000808315156108a0576000915061085c565b508282028284828115156108b057fe5b041461085857fe5b60008082848115156108c657fe5b049493505050505600a165627a7a723058203ea8beca1fb2aa99ee4b8e84e26fc2a0ea424f0021da07d55ddb1a6b16e53a5800290000000000000000000000005ca71f050865092468cf8184d09e087f3dc58e3100000000000000000000000035fc8ca81e1b5992a0727c6aa87dbeb8cca42094000000000000000000000000ce3efa6763e23df21af74da46c6489736f96d4b6
Deployed Bytecode
0x60606040526004361061015b5763ffffffff60e060020a600035041663017a9105811461016057806312aef8c3146101885780631a069c721461019b578063205b1946146101b7578063214e52ca146101ea57806322d60d171461020f578063279fdf6d146102225780632f782b321461025157806332cd724a14610264578063380d831b1461027a57806342e94c901461028d57806344337ea1146102ac5780634adbe551146102cb578063537df3b6146102de5780637467bc92146102fd5780638d578bee146103105780638da5cb5b146103235780638f28397014610336578063aaffadf314610355578063ba0bba4014610368578063c85501bb1461037b578063cabfd1bf1461038e578063ccb98ffc146103ad578063d525aa32146103c3578063de4138de146103d6578063e3386a98146103e9578063eca001dd146103fc578063f2fde38b1461042d578063f9f92be41461044c575b600080fd5b341561016b57600080fd5b61017660043561046b565b60405190815260200160405180910390f35b341561019357600080fd5b61017661048a565b6101b560043560243560ff60443516606435608435610490565b005b34156101c257600080fd5b6101d6600160a060020a03600435166107bf565b604051901515815260200160405180910390f35b34156101f557600080fd5b6101d6600160a060020a03600435811690602435166107d4565b341561021a57600080fd5b61017661080a565b341561022d57600080fd5b610235610810565b604051600160a060020a03909116815260200160405180910390f35b341561025c57600080fd5b61017661081f565b341561026f57600080fd5b610176600435610825565b341561028557600080fd5b6101b5610837565b341561029857600080fd5b610176600160a060020a036004351661089d565b34156102b757600080fd5b6101b5600160a060020a03600435166108af565b34156102d657600080fd5b6102356108ee565b34156102e957600080fd5b6101b5600160a060020a03600435166108fd565b341561030857600080fd5b610235610939565b341561031b57600080fd5b610176610948565b341561032e57600080fd5b61023561094e565b341561034157600080fd5b6101b5600160a060020a036004351661095d565b341561036057600080fd5b6101766109f4565b341561037357600080fd5b6101b56109fa565b341561038657600080fd5b610176610bc1565b341561039957600080fd5b6101b5600160a060020a0360043516610bc7565b34156103b857600080fd5b6101b5600435610d3b565b34156103ce57600080fd5b6101b5610e04565b34156103e157600080fd5b610176610edb565b34156103f457600080fd5b610235610ee2565b341561040757600080fd5b6101d6600160a060020a036004351660243560443560ff6064351660843560a435610ef1565b341561043857600080fd5b6101b5600160a060020a0360043516611079565b341561045757600080fd5b6101d6600160a060020a0360043516611114565b600680548290811061047957fe5b600091825260209091200154905081565b600f5481565b60008060008060006104a0610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156104d957600080fd5b600b548911156104e857600080fd5b600a548990106104f757600080fd5b610505338b8b8b8b8b610ef1565b151561051057600080fd5b600160a060020a033316600090815260076020526040902054945089851061053757600080fd5b61056361054a8b8763ffffffff61112916565b600a5461055e908c9063ffffffff61112916565b61113b565b935061056f348561113b565b9250610581858463ffffffff61115116565b600c5490925082101561059357600080fd5b600160a060020a033316600090815260076020908152604080832085905560089091529020805460ff19166001179055600a546105d6908463ffffffff61115116565b600a55601154600160a060020a031663f340fa01843360405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561062957600080fd5b6125ee5a03f1151561063a57600080fd5b50505050600d54600a54101580156106c057506001601154600160a060020a031663c19d93fb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561069757600080fd5b6102c65a03f115156106a857600080fd5b5050506040518051905060038111156106bd57fe5b14155b1561071957601154600160a060020a0316635eabe01e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561070457600080fd5b6102c65a03f1151561071557600080fd5b5050505b610729348463ffffffff61112916565b9050600081111561076557600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561076557600080fd5b33600160a060020a03167f85f3c568c46211a851eab01fa3dd8725e07fb05eeaf9f852859aa866f787d9fe848360405191825260208201526040908101905180910390a2898211156107b357fe5b50505050505050505050565b60086020526000908152604090205460ff1681565b600030600160a060020a031683600160a060020a031614806108035750600954600160a060020a038481169116145b9392505050565b600e5481565b601154600160a060020a031681565b600a5481565b60009081526005602052604090205490565b60005433600160a060020a0390811691161461085257600080fd5b61085a610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff16151561089357600080fd5b61089b61116b565b565b60076020526000908152604090205481565b60015433600160a060020a039081169116146108ca57600080fd5b600160a060020a03166000908152600260205260409020805460ff19166001179055565b600154600160a060020a031681565b60015433600160a060020a0390811691161461091857600080fd5b600160a060020a03166000908152600260205260409020805460ff19169055565b600954600160a060020a031681565b600b5481565b600054600160a060020a031681565b60005433600160a060020a0390811691161461097857600080fd5b80600160a060020a038116151561098e57600080fd5b81600160a060020a03167f92bec23a66fc8de1f2b80d13f392cb5a8edd5c524cbea94609a1053c38323bc160405160405180910390a2506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5481565b60005433600160a060020a03908116911614610a1557600080fd5b610a1d610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610a5657600080fd5b601054600954600160a060020a039182169163a9059cbb911680631a39d8ef6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610aac57600080fd5b6102c65a03f11515610abd57600080fd5b5050506040518051905060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1357600080fd5b6102c65a03f11515610b2457600080fd5b505050604051805190501515610b3957600080fd5b601054600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610b9257600080fd5b6102c65a03f11515610ba357600080fd5b5050506040518051600f819055600b54901015905061089357600080fd5b600d5481565b6000610bd1610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610c0a57600080fd5b600160a060020a0382166000908152600760205260409020541515610c2e57600080fd5b600e54600160a060020a038316600090815260076020526040902054610c599163ffffffff61121416565b600160a060020a03808416600090815260076020526040808220829055601054939450929091169163a9059cbb918591859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610cd457600080fd5b6102c65a03f11515610ce557600080fd5b505050604051805190501515610cfa57600080fd5b81600160a060020a03167f5b7bccf2cf20f5a50db7bd55abd00dda3d627a8e68aa8c16c25a773f1a3c36c48260405190815260200160405180910390a25050565b60005433600160a060020a03908116911614610d5657600080fd5b610d5e610e04565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff161515610d9757600080fd5b42819010610da457600080fd5b610dcd7f73616c65456e6465640000000000000000000000000000000000000000000000610825565b15610dd757600080fd5b610e017f73616c65456e64656400000000000000000000000000000000000000000000008261123f565b50565b60045460009081526003602052604081205490805b8215610ed6575060009050805b60008381526003602081905260409091200154811015610ec5576000838152600360208190526040909120018054610e9691859184908110610e6457fe5b90600052602060002090600491828204019190066008029054906101000a900467ffffffffffffffff1663ffffffff16565b15610ebd57610ea361116b565b600092835260036020526040909220549160019150610ec5565b600101610e26565b811515610ed157610ed6565b610e19565b505050565b6004545b90565b601054600160a060020a031681565b6000806040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250888888604051600160a060020a03939093166c010000000000000000000000000283526014830191909152603482015260540160405180910390206040518083805190602001908083835b60208310610f945780518252601f199092019160209182019101610f75565b6001836020036101000a03801982511681845116179092525050509190910192835250506020019050604051908190039020600160a060020a03891660009081526002602052604090205490915060ff1615801561106d57506001818686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561105257600080fd5b505060206040510351600154600160a060020a039081169116145b98975050505050505050565b60005433600160a060020a0390811691161461109457600080fd5b600160a060020a03811615156110a957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60026020526000908152604090205460ff1681565b60008282111561113557fe5b50900390565b600081831061114a5781610803565b5090919050565b60008282018381101561116057fe5b8091505b5092915050565b6004546000908152600360205260408120549081151561118a57600080fd5b50600481905560005b6000828152600360205260409020600201548110156111d657600082815260036020526040902060020180546111ce919083908110610e6457fe5b600101611193565b7f96176797e3a5e248293a99794b69542c096df98f575121ca8eb7ccf5156a0274824360405191825260208201526040908101905180910390a15050565b6000808315156112275760009150611164565b5082820282848281151561123757fe5b041461116057fe5b4281901061124c57600080fd5b600082815260056020526040902054151561126d5761126d826112b96112cf565b6000828152600560205260409081902082905582907f910b922fc573f1132ffccba3c67771b0dfa3abcbb76bf7ffb732d09e90ca2e8f9083905190815260200160405180910390a25050565b6000908152600560205260409020544290111590565b6000828152600360208190526040909120018054600181016112f18382611336565b916000526020600020906004918282040191900660080283909190916101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b815481835581811511610ed657600083815260209020610ed691610edf9160046003928301819004820192860104015b8082111561137a5760008155600101611366565b5090565b60008082511161138d57600080fd5b6004541561139a57600080fd5b816000815181106113a757fe5b9060200190602002015115156113bc57600080fd5b816000815181106113c957fe5b906020019060200201516004555060015b8151811015611489578181815181106113ef57fe5b90602001906020020151151561140457600080fd5b81818151811061141057fe5b906020019060200201516003600084600185038151811061142d57fe5b906020019060200201518152602081019190915260400160009081209190915560039083838151811061145c57fe5b9060200190602002015181526020810191909152604001600020541561148157600080fd5b6001016113da565b5050565b6000918252600360209081526040808420600160e060020a031990931684526001928301909152909120805460ff19169091179055565b50600a54600b54111590565b600d54600a54101561153457601154600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561151b57600080fd5b6102c65a03f1151561152c57600080fd5b5050506115a1565b601154600160a060020a0316637b0863de6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561157357600080fd5b6102c65a03f1151561158457600080fd5b5050600a54600f5461159d92509063ffffffff61172916565b600e555b601054600054600160a060020a039182169163f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156115f857600080fd5b6102c65a03f1151561160957600080fd5b5050601154600054600160a060020a03918216925063f2fde38b911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561166357600080fd5b6102c65a03f11515610ed657600080fd5b60008281526003602052604090206002018054600181016112f18382611336565b600f54156116a257600080fd5b600954600160a060020a031663763ffcec84846116c5428663ffffffff61115116565b60405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b151561171057600080fd5b6102c65a03f1151561172157600080fd5b505050505050565b600080828481151561173757fe5b049493505050505600a165627a7a72305820326a26d9ee94b02799273acb20d41fecd5e6f07deb5142b7e46bdccc38e4431f0029
Swarm Source
bzzr://3ea8beca1fb2aa99ee4b8e84e26fc2a0ea424f0021da07d55ddb1a6b16e53a58
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.