Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 916 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 9742648 | 2184 days ago | IN | 0.002 ETH | 0.00042 | ||||
| Transfer | 9742647 | 2184 days ago | IN | 0.001 ETH | 0.00042 | ||||
| Transfer | 9529189 | 2217 days ago | IN | 0.01 ETH | 0.00042 | ||||
| Contribute | 7883853 | 2481 days ago | IN | 0 ETH | 0.00216865 | ||||
| Transfer | 7238786 | 2585 days ago | IN | 0.07 ETH | 0.00002104 | ||||
| Contribute | 6559670 | 2705 days ago | IN | 4.37946216 ETH | 0.00263142 | ||||
| Contribute | 6559668 | 2705 days ago | IN | 4.37946216 ETH | 0.00320905 | ||||
| Contribute | 6538997 | 2709 days ago | IN | 4.75500697 ETH | 0.0021646 | ||||
| Contribute | 6526064 | 2711 days ago | IN | 1.18875174 ETH | 0.0032096 | ||||
| Contribute | 6526063 | 2711 days ago | IN | 0.15263846 ETH | 0.0032096 | ||||
| Contribute | 6524001 | 2711 days ago | IN | 1.19237207 ETH | 0.0055497 | ||||
| Transfer | 6523944 | 2711 days ago | IN | 0.349832 ETH | 0.00014732 | ||||
| Contribute | 6523566 | 2711 days ago | IN | 0.477 ETH | 0.00142182 | ||||
| Contribute | 6523543 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523449 | 2711 days ago | IN | 1.01113152 ETH | 0.0055497 | ||||
| Contribute | 6523423 | 2711 days ago | IN | 1.6693209 ETH | 0.0055539 | ||||
| Contribute | 6523360 | 2711 days ago | IN | 6.677 ETH | 0.0048587 | ||||
| Transfer | 6523318 | 2711 days ago | IN | 0.477 ETH | 0.00025255 | ||||
| Contribute | 6523234 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523220 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523209 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523205 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523201 | 2711 days ago | IN | 4.77425779 ETH | 0.00198375 | ||||
| Contribute | 6523087 | 2711 days ago | IN | 2.08187849 ETH | 0.0059138 | ||||
| Contribute | 6523075 | 2711 days ago | IN | 23.13201828 ETH | 0.0040539 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 6559670 | 2705 days ago | 0.251038 ETH | ||||
| Transfer | 6559668 | 2705 days ago | 0.251038 ETH | ||||
| Transfer | 6526064 | 2711 days ago | 0.00953301 ETH | ||||
| Transfer | 6526063 | 2711 days ago | 0.01906602 ETH | ||||
| Transfer | 6524001 | 2711 days ago | 1.19237207 ETH | ||||
| Transfer | 6523566 | 2711 days ago | 0.00005116 ETH | ||||
| Transfer | 6523566 | 2711 days ago | 0.47694883 ETH | ||||
| Transfer | 6523449 | 2711 days ago | 1.01113152 ETH | ||||
| Transfer | 6523423 | 2711 days ago | 1.6693209 ETH | ||||
| Transfer | 6523360 | 2711 days ago | 0.00448585 ETH | ||||
| Transfer | 6523360 | 2711 days ago | 6.67251414 ETH | ||||
| Transfer | 6523087 | 2711 days ago | 0.03099852 ETH | ||||
| Transfer | 6523087 | 2711 days ago | 2.05087997 ETH | ||||
| Transfer | 6523075 | 2711 days ago | 23.13201828 ETH | ||||
| Transfer | 6523064 | 2711 days ago | 4.7694883 ETH | ||||
| Transfer | 6523011 | 2711 days ago | 0.95389766 ETH | ||||
| Transfer | 6522906 | 2711 days ago | 0.47694883 ETH | ||||
| Transfer | 6522632 | 2711 days ago | 0.47694883 ETH | ||||
| Transfer | 6522617 | 2711 days ago | 4.7694883 ETH | ||||
| Transfer | 6522425 | 2711 days ago | 0.09538976 ETH | ||||
| Transfer | 6522365 | 2711 days ago | 0.47694883 ETH | ||||
| Transfer | 6522284 | 2711 days ago | 0.24207889 ETH | ||||
| Transfer | 6521904 | 2711 days ago | 0.43574201 ETH | ||||
| Transfer | 6521856 | 2711 days ago | 0.62940512 ETH | ||||
| Transfer | 6521767 | 2711 days ago | 0.96831558 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CivilSale
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-09-17
*/
pragma solidity 0.4.24;
// File: @tokenfoundry/sale-contracts/contracts/interfaces/VaultI.sol
interface VaultI {
function deposit(address contributor) external payable;
function saleSuccessful() external;
function enableRefunds() external;
function refund(address contributor) external;
function close() external;
function sendFundsToWallet() external;
}
// File: openzeppelin-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: openzeppelin-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 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
// File: openzeppelin-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 OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function _transferOwnership(address _newOwner) internal {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
// 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 VaultI, Ownable {
using SafeMath for uint256;
enum State { Active, Success, Refunding, Closed }
// The timestamp of the first deposit
uint256 public firstDepositTimestamp;
mapping (address => uint256) public deposited;
// The amount to be disbursed to the wallet every month
uint256 public disbursementWei;
uint256 public disbursementDuration;
// Wallet from the project team
address public trustedWallet;
// The eth amount the team will get initially if the sale is successful
uint256 public initialWei;
// Timestamp that has to pass before sending funds to the wallet
uint256 public nextDisbursement;
// Total amount that was deposited
uint256 public totalDeposited;
// Amount that can be refunded
uint256 public refundable;
State public state;
event Closed();
event RefundsEnabled();
event Refunded(address indexed contributor, uint256 amount);
modifier atState(State _state) {
require(state == _state, "This function cannot be called in the current vault state.");
_;
}
constructor (
address _wallet,
uint256 _initialWei,
uint256 _disbursementWei,
uint256 _disbursementDuration
)
public
{
require(_wallet != address(0), "Wallet address should not be 0.");
require(_disbursementWei != 0, "Disbursement Wei should be greater than 0.");
trustedWallet = _wallet;
initialWei = _initialWei;
disbursementWei = _disbursementWei;
disbursementDuration = _disbursementDuration;
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 , "Vault state must be Active or Success.");
if (firstDepositTimestamp == 0) {
firstDepositTimestamp = now;
}
totalDeposited = totalDeposited.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;
transferToWallet(initialWei);
}
/// @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 {
require(state != State.Refunding, "Vault state is not Refunding");
state = State.Refunding;
uint256 currentBalance = address(this).balance;
refundable = currentBalance <= totalDeposited ? currentBalance : totalDeposited;
emit RefundsEnabled();
}
/// @dev Refunds ether to the contributors if in the Refunding state.
function refund(address _contributor) external atState(State.Refunding) {
require(deposited[_contributor] > 0, "Refund not allowed if contributor deposit is 0.");
uint256 refundAmount = deposited[_contributor].mul(refundable).div(totalDeposited);
deposited[_contributor] = 0;
_contributor.transfer(refundAmount);
emit Refunded(_contributor, refundAmount);
}
/// @dev Called by the owner if the sale has ended.
function close() external atState(State.Success) onlyOwner {
state = State.Closed;
nextDisbursement = now;
emit Closed();
}
/// @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(firstDepositTimestamp.add(4 weeks) <= now, "First contributor\ń0027s deposit was less than 28 days ago");
require(nextDisbursement <= now, "Next disbursement period timestamp has not yet passed, too early to withdraw.");
if (disbursementDuration == 0) {
trustedWallet.transfer(address(this).balance);
return;
}
uint256 numberOfDisbursements = now.sub(nextDisbursement).div(disbursementDuration).add(1);
nextDisbursement = nextDisbursement.add(disbursementDuration.mul(numberOfDisbursements));
transferToWallet(disbursementWei.mul(numberOfDisbursements));
}
function transferToWallet(uint256 _amount) internal {
uint256 amountToSend = Math.min256(_amount, address(this).balance);
trustedWallet.transfer(amountToSend);
}
}
// File: @tokenfoundry/sale-contracts/contracts/interfaces/WhitelistableI.sol
interface WhitelistableI {
function changeAdmin(address _admin) external;
function invalidateHash(bytes32 _hash) external;
function invalidateHashes(bytes32[] _hashes) external;
}
// File: openzeppelin-solidity/contracts/ECRecovery.sol
/**
* @title Eliptic curve signature operations
*
* @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
*
* TODO Remove this library once solidity supports passing a signature to ecrecover.
* See https://github.com/ethereum/solidity/issues/864
*
*/
library ECRecovery {
/**
* @dev Recover signer address from a message by using their signature
* @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
* @param sig bytes signature, the signature is generated using web3.eth.sign()
*/
function recover(bytes32 hash, bytes sig)
internal
pure
returns (address)
{
bytes32 r;
bytes32 s;
uint8 v;
// Check the signature length
if (sig.length != 65) {
return (address(0));
}
// Divide the signature in r, s and v variables
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solium-disable-next-line security/no-inline-assembly
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
// Version of signature should be 27 or 28, but 0 and 1 are also possible versions
if (v < 27) {
v += 27;
}
// If the version is correct return the signer address
if (v != 27 && v != 28) {
return (address(0));
} else {
// solium-disable-next-line arg-overflow
return ecrecover(hash, v, r, s);
}
}
/**
* toEthSignedMessageHash
* @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
* @dev and hash the result
*/
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(
"\x19Ethereum Signed Message:\n32",
hash
);
}
}
// File: @tokenfoundry/sale-contracts/contracts/Whitelistable.sol
/**
* @title Whitelistable
* @dev This contract is used to implement a signature based whitelisting mechanism
*/
contract Whitelistable is WhitelistableI, Ownable {
using ECRecovery for bytes32;
address public whitelistAdmin;
// True if the hash has been invalidated
mapping(bytes32 => bool) public invalidHash;
event AdminUpdated(address indexed newAdmin);
modifier validAdmin(address _admin) {
require(_admin != 0, "Admin address cannot be 0");
_;
}
modifier onlyAdmin {
require(msg.sender == whitelistAdmin, "Only the whitelist admin may call this function");
_;
}
modifier isWhitelisted(bytes32 _hash, bytes _sig) {
require(checkWhitelisted(_hash, _sig), "The provided hash is not whitelisted");
_;
}
/// @dev Constructor for Whitelistable contract
/// @param _admin the address of the admin that will generate the signatures
constructor(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)
{
emit AdminUpdated(_admin);
whitelistAdmin = _admin;
}
// @dev blacklists the given address to ban them from contributing
// @param _contributor Address of the contributor to blacklist
function invalidateHash(bytes32 _hash) external onlyAdmin {
invalidHash[_hash] = true;
}
function invalidateHashes(bytes32[] _hashes) external onlyAdmin {
for (uint i = 0; i < _hashes.length; i++) {
invalidHash[_hashes[i]] = true;
}
}
/// @dev Checks if a hash has been signed by the whitelistAdmin
/// @param _rawHash The hash that was used to generate the signature
/// @param _sig The EC signature generated by the whitelistAdmin
/// @return Was the signature generated by the admin for the hash?
function checkWhitelisted(
bytes32 _rawHash,
bytes _sig
)
public
view
returns(bool)
{
bytes32 hash = _rawHash.toEthSignedMessageHash();
return !invalidHash[_rawHash] && whitelistAdmin == hash.recover(_sig);
}
}
// File: @tokenfoundry/sale-contracts/contracts/interfaces/EthPriceFeedI.sol
interface EthPriceFeedI {
function getUnit() external view returns(string);
function getRate() external view returns(uint256);
function getLastTimeUpdated() external view returns(uint256);
}
// 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 Transition(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 {
bool checkNextState;
do {
checkNextState = false;
bytes32 next = states[currentStateId].nextStateId;
// If one of the next state's conditions is met, go to this state and continue
for (uint256 i = 0; i < states[next].startConditions.length; i++) {
if (states[next].startConditions[i](next)) {
goToNextState();
checkNextState = true;
break;
}
}
} while (checkNextState);
}
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]();
}
emit Transition(next, block.number);
}
///@dev Add a function returning a boolean as a start condition for a state.
/// If any condition returns true, the StateMachine will transition to the next state.
/// If s.startConditions is empty, the StateMachine will need to enter state s through invoking
/// the goToNextState() function.
/// A start condition should never throw. (Otherwise, the StateMachine may fail to enter into the
/// correct state, and succeeding start conditions may return true.)
/// A start condition should be gas-inexpensive since every one of them is invoked in the same call to
/// transition the 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. All callbacks are invoked immediately after entering the state.
/// Callback functions should never throw. (Otherwise, the StateMachine may fail to enter a state.)
/// Callback functions should also be gas-inexpensive as all callbacks are invoked in the same call to enter the 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 StateStartTimeSet(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 as a startCondition. If other start conditions exist and are
/// met earlier, then the state may be entered into earlier than the specified start time.
/// @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;
emit StateStartTimeSet(_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: openzeppelin-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: openzeppelin-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]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
// File: openzeppelin-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: openzeppelin-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);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(
address _owner,
address _spender
)
public
view
returns (uint256)
{
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
*/
function increaseApproval(
address _spender,
uint _addedValue
)
public
returns (bool)
{
allowed[msg.sender][_spender] = (
allowed[msg.sender][_spender].add(_addedValue));
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
*/
function decreaseApproval(
address _spender,
uint _subtractedValue
)
public
returns (bool)
{
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
// File: @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), "Token Controller does not permit transfer.");
_;
}
/// @dev Sets the controller that is going to be used by isAllowed modifier
function setController(TokenControllerI _controller) onlyOwner public {
require(_controller != address(0), "Controller address should not be zero.");
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: openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol
/**
* @title DetailedERC20 token
* @dev The decimals are only for visualization purposes.
* All the operations are done using the smallest and indivisible token unit,
* just as on Ethereum all the operations are done in wei.
*/
contract DetailedERC20 is ERC20 {
string public name;
string public symbol;
uint8 public decimals;
constructor(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.
*/
constructor(
uint256 _supply,
string _name,
string _symbol,
uint8 _decimals
) DetailedERC20(_name, _symbol, _decimals) public {
require(_supply != 0, "Supply should be greater than 0.");
totalSupply_ = _supply;
balances[msg.sender] = _supply;
emit Transfer(address(0), msg.sender, _supply); //event
}
}
// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
require(token.transfer(to, value));
}
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 value
)
internal
{
require(token.transferFrom(from, to, value));
}
function safeApprove(ERC20 token, address spender, uint256 value) internal {
require(token.approve(spender, value));
}
}
// File: contracts/Sale.sol
/// @title Sale base contract
contract Sale is Ownable, Whitelistable, TimedStateMachine, TokenControllerI {
using SafeMath for uint256;
using SafeERC20 for Token;
// 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";
// solium-disable-next-line arg-overflow
bytes32[] public states = [SETUP, FREEZE, SALE_IN_PROGRESS, SALE_ENDED];
// Stores the contribution for each user
mapping(address => uint256) public unitContributions;
uint256 public totalContributedUnits = 0; // Units
uint256 public totalSaleCapUnits; // Units
uint256 public minContributionUnits; // Units
uint256 public minThresholdUnits; // Units
Token public trustedToken;
Vault public trustedVault;
EthPriceFeedI public ethPriceFeed;
event Contribution(
address indexed contributor,
address indexed sender,
uint256 valueUnit,
uint256 valueWei,
uint256 excessWei,
uint256 weiPerUnitRate
);
event EthPriceFeedChanged(address previousEthPriceFeed, address newEthPriceFeed);
constructor (
uint256 _totalSaleCapUnits, // Units
uint256 _minContributionUnits, // Units
uint256 _minThresholdUnits, // Units
uint256 _maxTokens,
address _whitelistAdmin,
address _wallet,
uint256 _vaultInitialDisburseWei, // Wei
uint256 _vaultDisbursementWei, // Wei
uint256 _vaultDisbursementDuration,
uint256 _startTime,
string _tokenName,
string _tokenSymbol,
uint8 _tokenDecimals,
EthPriceFeedI _ethPriceFeed
)
Whitelistable(_whitelistAdmin)
public
{
require(_totalSaleCapUnits != 0, "Total sale cap units must be > 0");
require(_maxTokens != 0, "The maximum number of tokens must be > 0");
require(_wallet != 0, "The team's wallet address cannot be 0");
require(_minThresholdUnits <= _totalSaleCapUnits, "The minimum threshold (units) cannot be larger than the sale cap (units)");
require(_ethPriceFeed != address(0), "The ETH price feed cannot be the 0 address");
require(now < _startTime, "The start time must be in the future");
totalSaleCapUnits = _totalSaleCapUnits;
minContributionUnits = _minContributionUnits;
minThresholdUnits = _minThresholdUnits;
// Setup the necessary contracts
trustedToken = new Token(
_maxTokens,
_tokenName,
_tokenSymbol,
_tokenDecimals
);
ethPriceFeed = _ethPriceFeed;
// The token will query the isTransferAllowed function contained in this contract
trustedToken.setController(this);
trustedToken.transferOwnership(owner);
trustedVault = new Vault(
_wallet,
_vaultInitialDisburseWei,
_vaultDisbursementWei, // disbursement amount
_vaultDisbursementDuration
);
// Set the states
setStates(states);
// Specify which functions are allowed in each state
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);
// End the sale when the cap is reached
addStartCondition(SALE_ENDED, wasCapReached);
// Set the start time for the sale
setStateStartTime(SALE_IN_PROGRESS, _startTime);
// Set the onSaleEnded callback (will be called when the sale ends)
addCallback(SALE_ENDED, onSaleEnded);
}
/// @dev Send tokens to the multisig for future distribution.
/// @dev This needs to be outside the constructor because the token needs to query the sale for allowed transfers.
function setup() external onlyOwner checkAllowed {
trustedToken.safeTransfer(trustedVault.trustedWallet(), trustedToken.balanceOf(this));
// Go to freeze state
goToNextState();
}
/// @dev To change the EthPriceFeed contract if needed
function changeEthPriceFeed(EthPriceFeedI _ethPriceFeed) external onlyOwner {
require(_ethPriceFeed != address(0), "ETH price feed address cannot be 0");
emit EthPriceFeedChanged(ethPriceFeed, _ethPriceFeed);
ethPriceFeed = _ethPriceFeed;
}
/// @dev Called by users to contribute ETH to the sale.
function contribute(
address _contributor,
uint256 _contributionLimitUnits,
uint256 _payloadExpiration,
bytes _sig
)
external
payable
checkAllowed
isWhitelisted(keccak256(
abi.encodePacked(
_contributor,
_contributionLimitUnits,
_payloadExpiration
)
), _sig)
{
require(msg.sender == _contributor, "Contributor address different from whitelisted address");
require(now < _payloadExpiration, "Payload has expired");
uint256 weiPerUnitRate = ethPriceFeed.getRate();
require(weiPerUnitRate != 0, "Wei per unit rate from feed is 0");
uint256 previouslyContributedUnits = unitContributions[_contributor];
// Check that the contribution amount doesn't go over the sale cap or personal contributionLimitUnits
uint256 currentContributionUnits = min256(
_contributionLimitUnits.sub(previouslyContributedUnits),
totalSaleCapUnits.sub(totalContributedUnits),
msg.value.div(weiPerUnitRate)
);
require(currentContributionUnits != 0, "No contribution permitted (contributor or sale has reached cap)");
// Check that it is higher than minContributionUnits
require(currentContributionUnits >= minContributionUnits || previouslyContributedUnits != 0, "Minimum contribution not reached");
// Update the state
unitContributions[_contributor] = previouslyContributedUnits.add(currentContributionUnits);
totalContributedUnits = totalContributedUnits.add(currentContributionUnits);
uint256 currentContributionWei = currentContributionUnits.mul(weiPerUnitRate);
trustedVault.deposit.value(currentContributionWei)(msg.sender);
// If the minThresholdUnits is reached for the first time, notify the vault
if (totalContributedUnits >= minThresholdUnits &&
trustedVault.state() != Vault.State.Success) {
trustedVault.saleSuccessful();
}
// If there is an excess, return it to the sender
uint256 excessWei = msg.value.sub(currentContributionWei);
if (excessWei > 0) {
msg.sender.transfer(excessWei);
}
emit Contribution(
_contributor,
msg.sender,
currentContributionUnits,
currentContributionWei,
excessWei,
weiPerUnitRate
);
}
/// @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, "Cannot set end time in the past");
require(getStateStartTime(SALE_ENDED) == 0, "End time already set");
setStateStartTime(SALE_ENDED, _endTime);
}
/// @dev Called to enable refunds by the owner. Can only be called in any state (without triggering conditional transitions)
/// @dev This is only meant to be used if there is an emergency and the endSale() function can't be called
function enableRefunds() external onlyOwner {
trustedVault.enableRefunds();
}
/// @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 is allowed to send tokens
function transferAllowed(address _from, address)
external
view
returns (bool)
{
return _from == address(this);
}
/// @dev Returns true if the cap was reached.
function wasCapReached(bytes32) internal returns (bool) {
return totalSaleCapUnits <= totalContributedUnits;
}
/// @dev Callback that gets called when entering the SALE_ENDED state.
function onSaleEnded() internal {
// Close the vault and transfer ownership to the owner of the sale
if (totalContributedUnits == 0 && minThresholdUnits == 0) {
return;
}
if (totalContributedUnits < minThresholdUnits) {
trustedVault.enableRefunds();
} else {
trustedVault.close();
}
trustedVault.transferOwnership(owner);
}
/// @dev a function to return the minimum of 3 values
function min256(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) {
return Math.min256(x, Math.min256(y, z));
}
}
// File: contracts/CivilSale.sol
contract CivilSale is Sale {
address public constant WALLET = 0xFe6eeE8911d866F3196d9cb003ee0Af50D1875C1;
// Just to make it compatible with our services
uint256 public saleTokensPerUnit = 36000000 * (10**18) / 24000000;
uint256 public extraTokensPerUnit = 0;
constructor()
Sale(
24000000, // Total sale cap (usd)
10, // Min contribution (usd)
1, // Min threshold (usd)
100000000 * (10 ** 18), // Max tokens
0x8D6267Fe5404f8cB33782379543b2c8856ACF4A7, // Whitelist Admin
WALLET, // Wallet
0, // Vault initial Wei (Not using this value)
1, // Vault disbursement Wei (Not using this value)
0, // Vault disbursement duration (0 means transfer everything right away)
now + 10 minutes, // Start time
"Civil", // Token name
"CVL", // Token symbol
18, // Token decimals
EthPriceFeedI(0x54bF24e1070784D7F0760095932b47CE55eb3A91) // Eth price feed
)
public
{
}
function transferAllowed(address _from, address)
external
view
returns (bool)
{
return _from == WALLET || _from == address(this);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"states","outputs":[{"name":"","type":"bytes32"}],"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":"minContributionUnits","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":"","type":"bytes32"}],"name":"invalidHash","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalContributedUnits","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":true,"inputs":[],"name":"totalSaleCapUnits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"invalidateHash","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":"_contributionLimitUnits","type":"uint256"},{"name":"_payloadExpiration","type":"uint256"},{"name":"_sig","type":"bytes"}],"name":"contribute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"WALLET","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minThresholdUnits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableRefunds","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_ethPriceFeed","type":"address"}],"name":"changeEthPriceFeed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"unitContributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethPriceFeed","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_endTime","type":"uint256"}],"name":"setEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleTokensPerUnit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"_rawHash","type":"bytes32"},{"name":"_sig","type":"bytes"}],"name":"checkWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"extraTokensPerUnit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hashes","type":"bytes32[]"}],"name":"invalidateHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"contributor","type":"address"},{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"valueUnit","type":"uint256"},{"indexed":false,"name":"valueWei","type":"uint256"},{"indexed":false,"name":"excessWei","type":"uint256"},{"indexed":false,"name":"weiPerUnitRate","type":"uint256"}],"name":"Contribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousEthPriceFeed","type":"address"},{"indexed":false,"name":"newEthPriceFeed","type":"address"}],"name":"EthPriceFeedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_stateId","type":"bytes32"},{"indexed":false,"name":"_startTime","type":"uint256"}],"name":"StateStartTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stateId","type":"bytes32"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"Transition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newAdmin","type":"address"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
6101006040527f736574757000000000000000000000000000000000000000000000000000000060809081527f667265657a65000000000000000000000000000000000000000000000000000060a0527f73616c65496e50726f677265737300000000000000000000000000000000000060c0527f73616c65456e646564000000000000000000000000000000000000000000000060e052620000a790600690600462000c8c565b5060006008556714d1120d7b160000600f556000601055348015620000cb57600080fd5b50604080518082018252600581527f436976696c0000000000000000000000000000000000000000000000000000006020808301919091528251808401909352600383527f43564c00000000000000000000000000000000000000000000000000000000009083015260008054600160a060020a03199081163317825560018054738d6267fe5404f8cb33782379543b2c8856acf4a792168217815563016e360094600a9491936a52b7d2dcc80cd2e4000000939273fe6eee8911d866f3196d9cb003ee0af50d1875c192869183916102584201919060127354bf24e1070784d7f0760095932b47ce55eb3a914285116200024c57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5468652073746172742074696d65206d75737420626520696e2074686520667560448201527f7475726500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60098e9055600a8d9055600b8c90558a8484846200026962000cde565b84815260ff82166060820152608060208083018281528651928401929092528551604084019160a08501919088019080838360005b83811015620002b85781810151838201526020016200029e565b50505050905090810190601f168015620002e65780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156200031b57818101518382015260200162000301565b50505050905090810190601f168015620003495780820380516001836020036101000a031916815260200191505b509650505050505050604051809103906000f0801580156200036f573d6000803e3d6000fd5b50600c8054600160a060020a0319908116600160a060020a039384161791829055600e8054909116848416179055604080517f92eefe9b000000000000000000000000000000000000000000000000000000008152306004820152905191909216916392eefe9b91602480830192600092919082900301818387803b158015620003f857600080fd5b505af11580156200040d573d6000803e3d6000fd5b5050600c5460008054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152905191909316945063f2fde38b935060248084019382900301818387803b1580156200047857600080fd5b505af11580156200048d573d6000803e3d6000fd5b50505050888888886200049f62000cef565b600160a060020a039094168452602084019290925260408084019190915260608301919091525190819003608001906000f080158015620004e4573d6000803e3d6000fd5b50600d60006101000a815481600160a060020a030219169083600160a060020a031602179055506200057860068054806020026020016040519081016040528092919081815260200182805480156200055e57602002820191906000526020600020905b8154815260019091019060200180831162000548575b5050505050620007fe640100000000026401000000009004565b620005cd7f73657475700000000000000000000000000000000000000000000000000000007fba0bba400000000000000000000000000000000000000000000000000000000064010000000062000927810204565b620006227f667265657a6500000000000000000000000000000000000000000000000000007fccb98ffc0000000000000000000000000000000000000000000000000000000064010000000062000927810204565b620006777f73616c65496e50726f67726573730000000000000000000000000000000000007fccb98ffc0000000000000000000000000000000000000000000000000000000064010000000062000927810204565b620006cc7f73616c65496e50726f67726573730000000000000000000000000000000000007f58bafdbc0000000000000000000000000000000000000000000000000000000064010000000062000927810204565b620007217f73616c65496e50726f67726573730000000000000000000000000000000000007f380d831b0000000000000000000000000000000000000000000000000000000064010000000062000927810204565b6200076b7f73616c65456e6465640000000000000000000000000000000000000000000000620009766401000000000262001a501762000982640100000000026401000000009004565b620007a07f73616c65496e50726f677265737300000000000000000000000000000000000086640100000000620009cf810204565b620007ea7f73616c65456e646564000000000000000000000000000000000000000000000062000a676401000000000262001a5c1762000c29640100000000026401000000009004565b505050505050505050505050505062000d20565b60008082511115156200081057600080fd5b600454156200081e57600080fd5b8160008151811015156200082e57fe5b6020908102909101015115156200084457600080fd5b8160008151811015156200085457fe5b602090810290910101516004555060015b8151811015620009235781818151811015156200087e57fe5b6020908102909101015115156200089457600080fd5b8181815181101515620008a357fe5b90602001906020020151600360008460018503815181101515620008c357fe5b60209081029091018101518252810191909152604001600090812091909155825160039190849084908110620008f557fe5b6020908102909101810151825281019190915260400160002054156200091a57600080fd5b60010162000865565b5050565b60009182526003602090815260408084207fffffffff0000000000000000000000000000000000000000000000000000000090931684526001928301909152909120805460ff19169091179055565b50600854600954111590565b6000918252600360208181526040842082018054600181018255908552932060048404018054939091166008026101000a6001604060020a03818102199094169290931692909202179055565b428111620009dc57600080fd5b600082815260056020526040902054151562000a1c5762000a1c8262000c7764010000000002620019ed1762000982640100000000026401000000009004565b6000828152600560209081526040918290208390558151838152915184927f9f976d9bff84df26aa98d2a3a52ea3de3e05dc94cdf1962c3d6d33fa8f03f69192908290030190a25050565b60085415801562000a785750600b54155b1562000a845762000c27565b600b54600854101562000b1d57600d60009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801562000afe57600080fd5b505af115801562000b13573d6000803e3d6000fd5b5050505062000ba4565b600d60009054906101000a9004600160a060020a0316600160a060020a03166343d726d66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801562000b8a57600080fd5b505af115801562000b9f573d6000803e3d6000fd5b505050505b600d5460008054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529051919093169263f2fde38b92602480830193919282900301818387803b15801562000c0d57600080fd5b505af115801562000c22573d6000803e3d6000fd5b505050505b565b600091825260036020818152604084206002018054600181018255908552932060048404018054939091166008026101000a6001604060020a03818102199094169290931692909202179055565b60009081526005602052604090205442101590565b82805482825590600052602060002090810192821562000ccc579160200282015b8281111562000ccc578251825560209092019160019091019062000cad565b5062000cda92915062000d00565b5090565b60405161100f806200292283390190565b604051610edf806200393183390190565b62000d1d91905b8082111562000cda576000815560010162000d07565b90565b611bf28062000d306000396000f3006080604052600436106101715763ffffffff60e060020a600035041663017a91058114610176578063214e52ca146101a0578063274faa9f146101db578063279fdf6d146101f0578063311adc751461022157806332484dab1461023957806332cd724a1461024e57806337d4862814610266578063380d831b1461027b57806345af7ceb146102925780634adbe551146102aa57806358bafdbc146102bf5780636d9cdbc6146102e7578063715018a6146102fc578063762549e0146103115780638c52dc41146103265780638da5cb5b1461033b5780638f2839701461035057806395550181146103715780639918fce114610392578063af7665ce146103b3578063ba0bba40146103c8578063ccb98ffc146103dd578063d30e268b146103f5578063d525aa321461040a578063de4138de1461041f578063e3386a9814610434578063eac5a89d14610449578063eced6c57146104a7578063edacfd25146104bc578063f2fde38b146104dc575b600080fd5b34801561018257600080fd5b5061018e6004356104fd565b60408051918252519081900360200190f35b3480156101ac57600080fd5b506101c7600160a060020a036004358116906024351661051c565b604080519115158252519081900360200190f35b3480156101e757600080fd5b5061018e61055a565b3480156101fc57600080fd5b50610205610560565b60408051600160a060020a039092168252519081900360200190f35b34801561022d57600080fd5b506101c760043561056f565b34801561024557600080fd5b5061018e610584565b34801561025a57600080fd5b5061018e60043561058a565b34801561027257600080fd5b5061018e61059c565b34801561028757600080fd5b506102906105a2565b005b34801561029e57600080fd5b50610290600435610604565b3480156102b657600080fd5b506102056106a7565b61029060048035600160a060020a0316906024803591604435916064359081019101356106b6565b3480156102f357600080fd5b50610205610de4565b34801561030857600080fd5b50610290610dfc565b34801561031d57600080fd5b5061018e610e68565b34801561033257600080fd5b50610290610e6e565b34801561034757600080fd5b50610205610ef2565b34801561035c57600080fd5b50610290600160a060020a0360043516610f01565b34801561037d57600080fd5b50610290600160a060020a0360043516610fdd565b34801561039e57600080fd5b5061018e600160a060020a03600435166110f1565b3480156103bf57600080fd5b50610205611103565b3480156103d457600080fd5b50610290611112565b3480156103e957600080fd5b506102906004356112a2565b34801561040157600080fd5b5061018e6113fc565b34801561041657600080fd5b50610290611402565b34801561042b57600080fd5b5061018e6114b3565b34801561044057600080fd5b506102056114b9565b34801561045557600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526101c79583359536956044949193909101919081908401838280828437509497506114c89650505050505050565b3480156104b357600080fd5b5061018e61151b565b3480156104c857600080fd5b506102906004803560248101910135611521565b3480156104e857600080fd5b50610290600160a060020a03600435166115fa565b600680548290811061050b57fe5b600091825260209091200154905081565b6000600160a060020a03831673fe6eee8911d866f3196d9cb003ee0af50d1875c114806105515750600160a060020a03831630145b90505b92915050565b600a5481565b600d54600160a060020a031681565b60026020526000908152604090205460ff1681565b60085481565b60009081526005602052604090205490565b60095481565b600054600160a060020a031633146105b957600080fd5b6105c1611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156105fa57600080fd5b61060261161a565b565b600154600160a060020a0316331461068c576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c79207468652077686974656c6973742061646d696e206d61792063616c60448201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b6000908152600260205260409020805460ff19166001179055565b600154600160a060020a031681565b60008060008060006106c6611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156106ff57600080fd5b8989896040516020018084600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140183815260200182815260200193505050506040516020818303038152906040526040518082805190602001908083835b6020831061077f5780518252601f199092019160209182019101610760565b51815160209384036101000a600019018019909216911617905260408051929094018290038220601f8d018290048202830182019094528b825292945092508a918a9150819084018382808284378201915050505050506107e082826114c8565b151561085b576040805160e560020a62461bcd028152602060048201526024808201527f5468652070726f76696465642068617368206973206e6f742077686974656c6960448201527f7374656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a038d16146108e1576040805160e560020a62461bcd02815260206004820152603660248201527f436f6e7472696275746f72206164647265737320646966666572656e7420667260448201527f6f6d2077686974656c6973746564206164647265737300000000000000000000606482015290519081900360840190fd5b428a11610938576040805160e560020a62461bcd02815260206004820152601360248201527f5061796c6f616420686173206578706972656400000000000000000000000000604482015290519081900360640190fd5b600e60009054906101000a9004600160a060020a0316600160a060020a031663679aefce6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561098b57600080fd5b505af115801561099f573d6000803e3d6000fd5b505050506040513d60208110156109b557600080fd5b50519650861515610a10576040805160e560020a62461bcd02815260206004820181905260248201527f5765692070657220756e697420726174652066726f6d20666565642069732030604482015290519081900360640190fd5b600160a060020a038c166000908152600760205260409020549550610a68610a3e8c8863ffffffff6116c316565b600854600954610a539163ffffffff6116c316565b610a63348b63ffffffff6116d516565b6116ea565b9450841515610ae7576040805160e560020a62461bcd02815260206004820152603f60248201527f4e6f20636f6e747269627574696f6e207065726d69747465642028636f6e747260448201527f696275746f72206f722073616c65206861732072656163686564206361702900606482015290519081900360840190fd5b600a5485101580610af757508515155b1515610b4d576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d20636f6e747269627574696f6e206e6f742072656163686564604482015290519081900360640190fd5b610b5d868663ffffffff6116ff16565b600160a060020a038d16600090815260076020526040902055600854610b89908663ffffffff6116ff16565b600855610b9c858863ffffffff61170c16565b600d54604080517ff340fa010000000000000000000000000000000000000000000000000000000081523360048201529051929650600160a060020a039091169163f340fa01918791602480830192600092919082900301818588803b158015610c0557600080fd5b505af1158015610c19573d6000803e3d6000fd5b5050505050600b5460085410158015610cc75750600d54604080517fc19d93fb0000000000000000000000000000000000000000000000000000000081529051600192600160a060020a03169163c19d93fb9160048083019260209291908290030181600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b505050506040513d6020811015610cb757600080fd5b50516003811115610cc457fe5b14155b15610d3857600d60009054906101000a9004600160a060020a0316600160a060020a0316635eabe01e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050505b610d48348563ffffffff6116c316565b92506000831115610d8257604051339084156108fc029085906000818181858888f19350505050158015610d80573d6000803e3d6000fd5b505b60408051868152602081018690528082018590526060810189905290513391600160a060020a038f16917f33c94e4dd1355f388bbb4eb66a186d239a2d28bdf73cec6aa187de58a2ce17909181900360800190a3505050505050505050505050565b73fe6eee8911d866f3196d9cb003ee0af50d1875c181565b600054600160a060020a03163314610e1357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600b5481565b600054600160a060020a03163314610e8557600080fd5b600d60009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b50505050565b600054600160a060020a031681565b600054600160a060020a03163314610f1857600080fd5b80600160a060020a0381161515610f79576040805160e560020a62461bcd02815260206004820152601960248201527f41646d696e20616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b604051600160a060020a038316907f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d90600090a2506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610ff457600080fd5b600160a060020a038116151561107a576040805160e560020a62461bcd02815260206004820152602260248201527f455448207072696365206665656420616464726573732063616e6e6f7420626560448201527f2030000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600e5460408051600160a060020a039283168152918316602083015280517ff41566bf3d02128644efdd2a51c6b4f47c28543bea4096d8c6d1526311cd2f6b9281900390910190a1600e805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205481565b600e54600160a060020a031681565b600054600160a060020a0316331461112957600080fd5b611131611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff16151561116a57600080fd5b600d54604080517f570d2f8f00000000000000000000000000000000000000000000000000000000815290516105fa92600160a060020a03169163570d2f8f9160048083019260209291908290030181600087803b1580156111cb57600080fd5b505af11580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b5051600c54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561125d57600080fd5b505af1158015611271573d6000803e3d6000fd5b505050506040513d602081101561128757600080fd5b5051600c54600160a060020a0316919063ffffffff61173516565b600054600160a060020a031633146112b957600080fd5b6112c1611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156112fa57600080fd5b428111611351576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f742073657420656e642074696d6520696e20746865207061737400604482015290519081900360640190fd5b61137a7f73616c65456e646564000000000000000000000000000000000000000000000061058a565b156113cf576040805160e560020a62461bcd02815260206004820152601460248201527f456e642074696d6520616c726561647920736574000000000000000000000000604482015290519081900360640190fd5b6113f97f73616c65456e6465640000000000000000000000000000000000000000000000826117cf565b50565b600f5481565b60008060005b5050600454600090815260036020526040812054909150815b600082815260036020819052604090912001548110156114a35760008281526003602081905260409091200180546114859184918490811061145f57fe5b6000918252602090912060048204015460039091166008026101000a900463ffffffff16565b1561149b5761149261161a565b600192506114a3565b600101611421565b82156114ae57611408565b505050565b60045490565b600c54600160a060020a031681565b6000806114d484611847565b60008581526002602052604090205490915060ff161580156115135750611501818463ffffffff61188516565b600154600160a060020a039081169116145b949350505050565b60105481565b600154600090600160a060020a031633146115ac576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c79207468652077686974656c6973742061646d696e206d61792063616c60448201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b5060005b818110156114ae576001600260008585858181106115ca57fe5b60209081029290920135835250810191909152604001600020805460ff19169115159190911790556001016115b0565b600054600160a060020a0316331461161157600080fd5b6113f98161195a565b6004546000908152600360205260408120549081151561163957600080fd5b50600481905560005b600082815260036020526040902060020154811015611685576000828152600360205260409020600201805461167d91908390811061145f57fe5b600101611642565b6040805183815243602082015281517fc9eebb3cf39ebcc16f7db0bac8f0e44d050159a092bc2d96fb613c7b142c1264929181900390910190a15050565b6000828211156116cf57fe5b50900390565b600081838115156116e257fe5b049392505050565b6000611513846116fa85856119d7565b6119d7565b8181018281101561055457fe5b600082151561171d57506000610554565b5081810281838281151561172d57fe5b041461055457fe5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d60208110156117c257600080fd5b505115156114ae57600080fd5b4281116117db57600080fd5b60008281526005602052604090205415156117fc576117fc826119ed611a02565b6000828152600560209081526040918290208390558151838152915184927f9f976d9bff84df26aa98d2a3a52ea3de3e05dc94cdf1962c3d6d33fa8f03f69192908290030190a25050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101839052905190819003603c019020919050565b6000806000808451604114151561189f5760009350611951565b50505060208201516040830151606084015160001a601b60ff821610156118c457601b015b8060ff16601b141580156118dc57508060ff16601c14155b156118ea5760009350611951565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af1158015611944573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b600160a060020a038116151561196f57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008183106119e65781610551565b5090919050565b60009081526005602052604090205442101590565b6000918252600360208181526040842082018054600181018255908552932060048404018054939091166008026101000a67ffffffffffffffff818102199094169290931692909202179055565b50600854600954111590565b600854158015611a6c5750600b54155b15611a7657610602565b600b546008541015611af257600d60009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611ad557600080fd5b505af1158015611ae9573d6000803e3d6000fd5b50505050611b5e565b600d60009054906101000a9004600160a060020a0316600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611b4557600080fd5b505af1158015611b59573d6000803e3d6000fd5b505050505b600d5460008054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529051919093169263f2fde38b92602480830193919282900301818387803b158015610ed857600080fd00a165627a7a72305820d820bbd03ea45e5c710ca0589d875a4f632be8582b18e91ffb50bd9ea28dc7a80029608060405234801561001057600080fd5b506040516200100f3803806200100f833981016040908152815160208084015192840151606085015160008054600160a060020a03191633179055938501805193959094910192909184918491849161006f916005919086019061015d565b50815161008390600690602085019061015d565b506007805460ff191660ff92909216919091179055505083151561010857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537570706c792073686f756c642062652067726561746572207468616e20302e604482015290519081900360640190fd5b6002849055336000818152600160209081526040808320889055805188815290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3505050506101f8565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019e57805160ff19168380011785556101cb565b828001600101855582156101cb579182015b828111156101cb5782518255916020019190600101906101b0565b506101d79291506101db565b5090565b6101f591905b808211156101d757600081556001016101e1565b90565b610e0780620002086000396000f3006080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063095ea7b31461017457806318160ddd146101ac57806323b872dd146101d3578063313ce567146101fd578063661884631461022857806370a082311461024c578063715018a61461026d5780638da5cb5b1461028457806392eefe9b146102b557806395d89b41146102d6578063a9059cbb146102eb578063d73dd6231461030f578063dd62ed3e14610333578063f2fde38b1461035a578063f77c47911461037b575b600080fd5b3480156100f657600080fd5b506100ff610390565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610139578181015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018057600080fd5b50610198600160a060020a036004351660243561041e565b604080519115158252519081900360200190f35b3480156101b857600080fd5b506101c1610484565b60408051918252519081900360200190f35b3480156101df57600080fd5b50610198600160a060020a036004358116906024351660443561048a565b34801561020957600080fd5b506102126105d6565b6040805160ff9092168252519081900360200190f35b34801561023457600080fd5b50610198600160a060020a03600435166024356105df565b34801561025857600080fd5b506101c1600160a060020a03600435166106cf565b34801561027957600080fd5b506102826106ea565b005b34801561029057600080fd5b50610299610756565b60408051600160a060020a039092168252519081900360200190f35b3480156102c157600080fd5b50610282600160a060020a0360043516610765565b3480156102e257600080fd5b506100ff610848565b3480156102f757600080fd5b50610198600160a060020a03600435166024356108a3565b34801561031b57600080fd5b50610198600160a060020a03600435166024356109e7565b34801561033f57600080fd5b506101c1600160a060020a0360043581169060243516610a80565b34801561036657600080fd5b50610282600160a060020a0360043516610aab565b34801561038757600080fd5b50610299610ace565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b505050505081565b336000818152600360209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b60048054604080517f214e52ca000000000000000000000000000000000000000000000000000000008152600160a060020a0380881694820194909452838616602482015290516000938793879391169163214e52ca9160448082019260209290919082900301818987803b15801561050257600080fd5b505af1158015610516573d6000803e3d6000fd5b505050506040513d602081101561052c57600080fd5b505115156105c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f546f6b656e20436f6e74726f6c6c657220646f6573206e6f74207065726d697460448201527f207472616e736665722e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b6105cc868686610add565b9695505050505050565b60075460ff1681565b336000908152600360209081526040808320600160a060020a03861684529091528120548083111561063457336000908152600360209081526040808320600160a060020a0388168452909152812055610669565b610644818463ffffffff610c5616565b336000908152600360209081526040808320600160a060020a03891684529091529020555b336000818152600360209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b600160a060020a031660009081526001602052604090205490565b600054600160a060020a0316331461070157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031681565b600054600160a060020a0316331461077c57600080fd5b600160a060020a038116151561081957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f436f6e74726f6c6c657220616464726573732073686f756c64206e6f7420626560448201527f207a65726f2e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104165780601f106103eb57610100808354040283529160200191610416565b60048054604080517f214e52ca00000000000000000000000000000000000000000000000000000000815233938101849052600160a060020a0380871660248301529151600094938793169163214e52ca91604480830192602092919082900301818987803b15801561091557600080fd5b505af1158015610929573d6000803e3d6000fd5b505050506040513d602081101561093f57600080fd5b505115156109d457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f546f6b656e20436f6e74726f6c6c657220646f6573206e6f74207065726d697460448201527f207472616e736665722e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b6109de8585610c68565b95945050505050565b336000908152600360209081526040808320600160a060020a0386168452909152812054610a1b908363ffffffff610d4b16565b336000818152600360209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600054600160a060020a03163314610ac257600080fd5b610acb81610d5e565b50565b600454600160a060020a031681565b6000600160a060020a0383161515610af457600080fd5b600160a060020a038416600090815260016020526040902054821115610b1957600080fd5b600160a060020a0384166000908152600360209081526040808320338452909152902054821115610b4957600080fd5b600160a060020a038416600090815260016020526040902054610b72908363ffffffff610c5616565b600160a060020a038086166000908152600160205260408082209390935590851681522054610ba7908363ffffffff610d4b16565b600160a060020a038085166000908152600160209081526040808320949094559187168152600382528281203382529091522054610beb908363ffffffff610c5616565b600160a060020a03808616600081815260036020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b600082821115610c6257fe5b50900390565b6000600160a060020a0383161515610c7f57600080fd5b33600090815260016020526040902054821115610c9b57600080fd5b33600090815260016020526040902054610cbb908363ffffffff610c5616565b3360009081526001602052604080822092909255600160a060020a03851681522054610ced908363ffffffff610d4b16565b600160a060020a0384166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b81810182811015610d5857fe5b92915050565b600160a060020a0381161515610d7357600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a723058208d803842fae1b453a2f73eb31ec2b5c603b44d8243570138e48c19ddd9d756f40029608060405234801561001057600080fd5b50604051608080610edf833981016040908152815160208301519183015160609093015160008054600160a060020a03191633179055909290600160a060020a03841615156100c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f57616c6c657420616464726573732073686f756c64206e6f7420626520302e00604482015290519081900360640190fd5b81151561015457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f44697362757273656d656e74205765692073686f756c6420626520677265617460448201527f6572207468616e20302e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b60058054600160a060020a031916600160a060020a039590951694909417909355600691909155600355600455600a805460ff19169055610d458061019a6000396000f3006080604052600436106101065763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663117d94f5811461010b57806343d726d6146101225780635495794b14610137578063570d2f8f1461015e5780635eabe01e1461018f57806362469353146101a45780636bb3130e146101b9578063715018a6146101ce5780637872e3da146101e35780638c52dc41146101f85780638da5cb5b1461020d578063b2401e1e14610222578063bf89662d14610237578063c19d93fb1461024c578063cb13cddb14610285578063f2fde38b146102a6578063f340fa01146102c7578063fa89401a146102db578063ff50abdc146102fc575b600080fd5b34801561011757600080fd5b50610120610311565b005b34801561012e57600080fd5b50610120610585565b34801561014357600080fd5b5061014c610644565b60408051918252519081900360200190f35b34801561016a57600080fd5b5061017361064a565b60408051600160a060020a039092168252519081900360200190f35b34801561019b57600080fd5b50610120610659565b3480156101b057600080fd5b5061014c6106f7565b3480156101c557600080fd5b5061014c6106fd565b3480156101da57600080fd5b50610120610703565b3480156101ef57600080fd5b5061014c61076f565b34801561020457600080fd5b50610120610775565b34801561021957600080fd5b5061017361084a565b34801561022e57600080fd5b5061014c610859565b34801561024357600080fd5b5061014c61085f565b34801561025857600080fd5b50610261610865565b6040518082600381111561027157fe5b60ff16815260200191505060405180910390f35b34801561029157600080fd5b5061014c600160a060020a036004351661086e565b3480156102b257600080fd5b50610120600160a060020a0360043516610880565b610120600160a060020a03600435166108a0565b3480156102e757600080fd5b50610120600160a060020a03600435166109cb565b34801561030857600080fd5b5061014c610b8e565b6000600380600a5460ff16600381111561032757fe5b1461037e576040805160e560020a62461bcd02815260206004820152603a6024820152600080516020610cda8339815191526044820152600080516020610cfa833981519152606482015290519081900360840190fd5b6001544290610396906224ea0063ffffffff610b9416565b1115610412576040805160e560020a62461bcd02815260206004820152603a60248201527f466972737420636f6e7472696275746f72c5843030323773206465706f73697460448201527f20776173206c657373207468616e20323820646179732061676f000000000000606482015290519081900360840190fd5b6007544210156104b8576040805160e560020a62461bcd02815260206004820152604d60248201527f4e6578742064697362757273656d656e7420706572696f642074696d6573746160448201527f6d7020686173206e6f7420796574207061737365642c20746f6f206561726c7960648201527f20746f2077697468647261772e00000000000000000000000000000000000000608482015290519081900360a40190fd5b600454151561050157600554604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156104fb573d6000803e3d6000fd5b50610581565b610539600161052d60045461052160075442610ba790919063ffffffff16565b9063ffffffff610bb916565b9063ffffffff610b9416565b915061056261055383600454610bce90919063ffffffff16565b6007549063ffffffff610b9416565b6007556003546105819061057c908463ffffffff610bce16565b610bf7565b5050565b600180600a5460ff16600381111561059957fe5b146105f0576040805160e560020a62461bcd02815260206004820152603a6024820152600080516020610cda8339815191526044820152600080516020610cfa833981519152606482015290519081900360840190fd5b600054600160a060020a0316331461060757600080fd5b600a805460ff19166003179055426007556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a150565b60065481565b600554600160a060020a031681565b600054600160a060020a0316331461067057600080fd5b600080600a5460ff16600381111561068457fe5b146106db576040805160e560020a62461bcd02815260206004820152603a6024820152600080516020610cda8339815191526044820152600080516020610cfa833981519152606482015290519081900360840190fd5b600a805460ff191660011790556006546106f490610bf7565b50565b60015481565b60035481565b600054600160a060020a0316331461071a57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60045481565b60008054600160a060020a0316331461078d57600080fd5b6002600a5460ff1660038111156107a057fe5b14156107f6576040805160e560020a62461bcd02815260206004820152601c60248201527f5661756c74207374617465206973206e6f7420526566756e64696e6700000000604482015290519081900360640190fd5b50600a805460ff191660021790556008543031908111156108195760085461081b565b805b6009556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a150565b600054600160a060020a031681565b60075481565b60095481565b600a5460ff1681565b60026020526000908152604090205481565b600054600160a060020a0316331461089757600080fd5b6106f481610c44565b600054600160a060020a031633146108b757600080fd5b6000600a5460ff1660038111156108ca57fe5b14806108e657506001600a5460ff1660038111156108e457fe5b145b1515610962576040805160e560020a62461bcd02815260206004820152602660248201527f5661756c74207374617465206d75737420626520416374697665206f7220537560448201527f63636573732e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600154151561097057426001555b600854610983903463ffffffff610b9416565b600855600160a060020a0381166000908152600260205260409020546109af903463ffffffff610b9416565b600160a060020a03909116600090815260026020526040902055565b6000600280600a5460ff1660038111156109e157fe5b14610a38576040805160e560020a62461bcd02815260206004820152603a6024820152600080516020610cda8339815191526044820152600080516020610cfa833981519152606482015290519081900360840190fd5b600160a060020a03831660009081526002602052604081205411610acc576040805160e560020a62461bcd02815260206004820152602f60248201527f526566756e64206e6f7420616c6c6f77656420696620636f6e7472696275746f60448201527f72206465706f73697420697320302e0000000000000000000000000000000000606482015290519081900360840190fd5b600854600954600160a060020a038516600090815260026020526040902054610b009291610521919063ffffffff610bce16565b600160a060020a03841660008181526002602052604080822082905551929450909184156108fc0291859190818181858888f19350505050158015610b49573d6000803e3d6000fd5b50604080518381529051600160a060020a038516917fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651919081900360200190a2505050565b60085481565b81810182811015610ba157fe5b92915050565b600082821115610bb357fe5b50900390565b60008183811515610bc657fe5b049392505050565b6000821515610bdf57506000610ba1565b50818102818382811515610bef57fe5b0414610ba157fe5b6000610c04823031610cc1565b600554604051919250600160a060020a03169082156108fc029083906000818181858888f19350505050158015610c3f573d6000803e3d6000fd5b505050565b600160a060020a0381161515610c5957600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000818310610cd05781610cd2565b825b93925050505600546869732066756e6374696f6e2063616e6e6f742062652063616c6c656420696e207468652063757272656e74207661756c742073746174652e000000000000a165627a7a723058206aa2de656715867b8b586b35066ae0c6b0f68e41738cc56e4c891585eb1972190029
Deployed Bytecode
0x6080604052600436106101715763ffffffff60e060020a600035041663017a91058114610176578063214e52ca146101a0578063274faa9f146101db578063279fdf6d146101f0578063311adc751461022157806332484dab1461023957806332cd724a1461024e57806337d4862814610266578063380d831b1461027b57806345af7ceb146102925780634adbe551146102aa57806358bafdbc146102bf5780636d9cdbc6146102e7578063715018a6146102fc578063762549e0146103115780638c52dc41146103265780638da5cb5b1461033b5780638f2839701461035057806395550181146103715780639918fce114610392578063af7665ce146103b3578063ba0bba40146103c8578063ccb98ffc146103dd578063d30e268b146103f5578063d525aa321461040a578063de4138de1461041f578063e3386a9814610434578063eac5a89d14610449578063eced6c57146104a7578063edacfd25146104bc578063f2fde38b146104dc575b600080fd5b34801561018257600080fd5b5061018e6004356104fd565b60408051918252519081900360200190f35b3480156101ac57600080fd5b506101c7600160a060020a036004358116906024351661051c565b604080519115158252519081900360200190f35b3480156101e757600080fd5b5061018e61055a565b3480156101fc57600080fd5b50610205610560565b60408051600160a060020a039092168252519081900360200190f35b34801561022d57600080fd5b506101c760043561056f565b34801561024557600080fd5b5061018e610584565b34801561025a57600080fd5b5061018e60043561058a565b34801561027257600080fd5b5061018e61059c565b34801561028757600080fd5b506102906105a2565b005b34801561029e57600080fd5b50610290600435610604565b3480156102b657600080fd5b506102056106a7565b61029060048035600160a060020a0316906024803591604435916064359081019101356106b6565b3480156102f357600080fd5b50610205610de4565b34801561030857600080fd5b50610290610dfc565b34801561031d57600080fd5b5061018e610e68565b34801561033257600080fd5b50610290610e6e565b34801561034757600080fd5b50610205610ef2565b34801561035c57600080fd5b50610290600160a060020a0360043516610f01565b34801561037d57600080fd5b50610290600160a060020a0360043516610fdd565b34801561039e57600080fd5b5061018e600160a060020a03600435166110f1565b3480156103bf57600080fd5b50610205611103565b3480156103d457600080fd5b50610290611112565b3480156103e957600080fd5b506102906004356112a2565b34801561040157600080fd5b5061018e6113fc565b34801561041657600080fd5b50610290611402565b34801561042b57600080fd5b5061018e6114b3565b34801561044057600080fd5b506102056114b9565b34801561045557600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526101c79583359536956044949193909101919081908401838280828437509497506114c89650505050505050565b3480156104b357600080fd5b5061018e61151b565b3480156104c857600080fd5b506102906004803560248101910135611521565b3480156104e857600080fd5b50610290600160a060020a03600435166115fa565b600680548290811061050b57fe5b600091825260209091200154905081565b6000600160a060020a03831673fe6eee8911d866f3196d9cb003ee0af50d1875c114806105515750600160a060020a03831630145b90505b92915050565b600a5481565b600d54600160a060020a031681565b60026020526000908152604090205460ff1681565b60085481565b60009081526005602052604090205490565b60095481565b600054600160a060020a031633146105b957600080fd5b6105c1611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156105fa57600080fd5b61060261161a565b565b600154600160a060020a0316331461068c576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c79207468652077686974656c6973742061646d696e206d61792063616c60448201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b6000908152600260205260409020805460ff19166001179055565b600154600160a060020a031681565b60008060008060006106c6611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156106ff57600080fd5b8989896040516020018084600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140183815260200182815260200193505050506040516020818303038152906040526040518082805190602001908083835b6020831061077f5780518252601f199092019160209182019101610760565b51815160209384036101000a600019018019909216911617905260408051929094018290038220601f8d018290048202830182019094528b825292945092508a918a9150819084018382808284378201915050505050506107e082826114c8565b151561085b576040805160e560020a62461bcd028152602060048201526024808201527f5468652070726f76696465642068617368206973206e6f742077686974656c6960448201527f7374656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a038d16146108e1576040805160e560020a62461bcd02815260206004820152603660248201527f436f6e7472696275746f72206164647265737320646966666572656e7420667260448201527f6f6d2077686974656c6973746564206164647265737300000000000000000000606482015290519081900360840190fd5b428a11610938576040805160e560020a62461bcd02815260206004820152601360248201527f5061796c6f616420686173206578706972656400000000000000000000000000604482015290519081900360640190fd5b600e60009054906101000a9004600160a060020a0316600160a060020a031663679aefce6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561098b57600080fd5b505af115801561099f573d6000803e3d6000fd5b505050506040513d60208110156109b557600080fd5b50519650861515610a10576040805160e560020a62461bcd02815260206004820181905260248201527f5765692070657220756e697420726174652066726f6d20666565642069732030604482015290519081900360640190fd5b600160a060020a038c166000908152600760205260409020549550610a68610a3e8c8863ffffffff6116c316565b600854600954610a539163ffffffff6116c316565b610a63348b63ffffffff6116d516565b6116ea565b9450841515610ae7576040805160e560020a62461bcd02815260206004820152603f60248201527f4e6f20636f6e747269627574696f6e207065726d69747465642028636f6e747260448201527f696275746f72206f722073616c65206861732072656163686564206361702900606482015290519081900360840190fd5b600a5485101580610af757508515155b1515610b4d576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d20636f6e747269627574696f6e206e6f742072656163686564604482015290519081900360640190fd5b610b5d868663ffffffff6116ff16565b600160a060020a038d16600090815260076020526040902055600854610b89908663ffffffff6116ff16565b600855610b9c858863ffffffff61170c16565b600d54604080517ff340fa010000000000000000000000000000000000000000000000000000000081523360048201529051929650600160a060020a039091169163f340fa01918791602480830192600092919082900301818588803b158015610c0557600080fd5b505af1158015610c19573d6000803e3d6000fd5b5050505050600b5460085410158015610cc75750600d54604080517fc19d93fb0000000000000000000000000000000000000000000000000000000081529051600192600160a060020a03169163c19d93fb9160048083019260209291908290030181600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b505050506040513d6020811015610cb757600080fd5b50516003811115610cc457fe5b14155b15610d3857600d60009054906101000a9004600160a060020a0316600160a060020a0316635eabe01e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050505b610d48348563ffffffff6116c316565b92506000831115610d8257604051339084156108fc029085906000818181858888f19350505050158015610d80573d6000803e3d6000fd5b505b60408051868152602081018690528082018590526060810189905290513391600160a060020a038f16917f33c94e4dd1355f388bbb4eb66a186d239a2d28bdf73cec6aa187de58a2ce17909181900360800190a3505050505050505050505050565b73fe6eee8911d866f3196d9cb003ee0af50d1875c181565b600054600160a060020a03163314610e1357600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600b5481565b600054600160a060020a03163314610e8557600080fd5b600d60009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b50505050565b600054600160a060020a031681565b600054600160a060020a03163314610f1857600080fd5b80600160a060020a0381161515610f79576040805160e560020a62461bcd02815260206004820152601960248201527f41646d696e20616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b604051600160a060020a038316907f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d90600090a2506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610ff457600080fd5b600160a060020a038116151561107a576040805160e560020a62461bcd02815260206004820152602260248201527f455448207072696365206665656420616464726573732063616e6e6f7420626560448201527f2030000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600e5460408051600160a060020a039283168152918316602083015280517ff41566bf3d02128644efdd2a51c6b4f47c28543bea4096d8c6d1526311cd2f6b9281900390910190a1600e805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205481565b600e54600160a060020a031681565b600054600160a060020a0316331461112957600080fd5b611131611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff16151561116a57600080fd5b600d54604080517f570d2f8f00000000000000000000000000000000000000000000000000000000815290516105fa92600160a060020a03169163570d2f8f9160048083019260209291908290030181600087803b1580156111cb57600080fd5b505af11580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b5051600c54604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561125d57600080fd5b505af1158015611271573d6000803e3d6000fd5b505050506040513d602081101561128757600080fd5b5051600c54600160a060020a0316919063ffffffff61173516565b600054600160a060020a031633146112b957600080fd5b6112c1611402565b6004546000908152600360209081526040808320600160e060020a0319843516845260010190915290205460ff1615156112fa57600080fd5b428111611351576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f742073657420656e642074696d6520696e20746865207061737400604482015290519081900360640190fd5b61137a7f73616c65456e646564000000000000000000000000000000000000000000000061058a565b156113cf576040805160e560020a62461bcd02815260206004820152601460248201527f456e642074696d6520616c726561647920736574000000000000000000000000604482015290519081900360640190fd5b6113f97f73616c65456e6465640000000000000000000000000000000000000000000000826117cf565b50565b600f5481565b60008060005b5050600454600090815260036020526040812054909150815b600082815260036020819052604090912001548110156114a35760008281526003602081905260409091200180546114859184918490811061145f57fe5b6000918252602090912060048204015460039091166008026101000a900463ffffffff16565b1561149b5761149261161a565b600192506114a3565b600101611421565b82156114ae57611408565b505050565b60045490565b600c54600160a060020a031681565b6000806114d484611847565b60008581526002602052604090205490915060ff161580156115135750611501818463ffffffff61188516565b600154600160a060020a039081169116145b949350505050565b60105481565b600154600090600160a060020a031633146115ac576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c79207468652077686974656c6973742061646d696e206d61792063616c60448201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b5060005b818110156114ae576001600260008585858181106115ca57fe5b60209081029290920135835250810191909152604001600020805460ff19169115159190911790556001016115b0565b600054600160a060020a0316331461161157600080fd5b6113f98161195a565b6004546000908152600360205260408120549081151561163957600080fd5b50600481905560005b600082815260036020526040902060020154811015611685576000828152600360205260409020600201805461167d91908390811061145f57fe5b600101611642565b6040805183815243602082015281517fc9eebb3cf39ebcc16f7db0bac8f0e44d050159a092bc2d96fb613c7b142c1264929181900390910190a15050565b6000828211156116cf57fe5b50900390565b600081838115156116e257fe5b049392505050565b6000611513846116fa85856119d7565b6119d7565b8181018281101561055457fe5b600082151561171d57506000610554565b5081810281838281151561172d57fe5b041461055457fe5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d60208110156117c257600080fd5b505115156114ae57600080fd5b4281116117db57600080fd5b60008281526005602052604090205415156117fc576117fc826119ed611a02565b6000828152600560209081526040918290208390558151838152915184927f9f976d9bff84df26aa98d2a3a52ea3de3e05dc94cdf1962c3d6d33fa8f03f69192908290030190a25050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101839052905190819003603c019020919050565b6000806000808451604114151561189f5760009350611951565b50505060208201516040830151606084015160001a601b60ff821610156118c457601b015b8060ff16601b141580156118dc57508060ff16601c14155b156118ea5760009350611951565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af1158015611944573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b600160a060020a038116151561196f57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008183106119e65781610551565b5090919050565b60009081526005602052604090205442101590565b6000918252600360208181526040842082018054600181018255908552932060048404018054939091166008026101000a67ffffffffffffffff818102199094169290931692909202179055565b50600854600954111590565b600854158015611a6c5750600b54155b15611a7657610602565b600b546008541015611af257600d60009054906101000a9004600160a060020a0316600160a060020a0316638c52dc416040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611ad557600080fd5b505af1158015611ae9573d6000803e3d6000fd5b50505050611b5e565b600d60009054906101000a9004600160a060020a0316600160a060020a03166343d726d66040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611b4557600080fd5b505af1158015611b59573d6000803e3d6000fd5b505050505b600d5460008054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529051919093169263f2fde38b92602480830193919282900301818387803b158015610ed857600080fd00a165627a7a72305820d820bbd03ea45e5c710ca0589d875a4f632be8582b18e91ffb50bd9ea28dc7a80029
Swarm Source
bzzr://6aa2de656715867b8b586b35066ae0c6b0f68e41738cc56e4c891585eb197219
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.