Source Code
Latest 25 from a total of 56 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Many Token... | 6036240 | 2764 days ago | IN | 0 ETH | 0.00682161 | ||||
| Claim Many Token... | 6036077 | 2764 days ago | IN | 0 ETH | 0.00773894 | ||||
| Claim Many Token... | 6036076 | 2764 days ago | IN | 0 ETH | 0.01318022 | ||||
| Claim Many Token... | 6036063 | 2764 days ago | IN | 0 ETH | 0.01318009 | ||||
| Claim Many Token... | 6036025 | 2764 days ago | IN | 0 ETH | 0.0131147 | ||||
| Claim Many Token... | 6036019 | 2764 days ago | IN | 0 ETH | 0.01298416 | ||||
| Claim Many Token... | 6036005 | 2764 days ago | IN | 0 ETH | 0.01311495 | ||||
| Claim Many Token... | 6035984 | 2764 days ago | IN | 0 ETH | 0.00978717 | ||||
| Claim Many Token... | 6035969 | 2764 days ago | IN | 0 ETH | 0.01289434 | ||||
| Claim Many Token... | 6035962 | 2764 days ago | IN | 0 ETH | 0.00497484 | ||||
| Claim Many Token... | 6035959 | 2764 days ago | IN | 0 ETH | 0.00738124 | ||||
| Claim Many Token... | 6035957 | 2764 days ago | IN | 0 ETH | 0.00350209 | ||||
| Claim Many Token... | 6035950 | 2764 days ago | IN | 0 ETH | 0.00277985 | ||||
| Finalize | 6035930 | 2764 days ago | IN | 0 ETH | 0.00021759 | ||||
| Move Tokens | 6035911 | 2764 days ago | IN | 0 ETH | 0.00021941 | ||||
| Deposit Offchain | 6014902 | 2768 days ago | IN | 0 ETH | 0.00092205 | ||||
| Deposit Offchain | 6014900 | 2768 days ago | IN | 0 ETH | 0.00176175 | ||||
| Deposit Offchain | 6014897 | 2768 days ago | IN | 0 ETH | 0.00092205 | ||||
| Deposit Offchain | 6014897 | 2768 days ago | IN | 0 ETH | 0.00176175 | ||||
| Deposit Offchain | 6014895 | 2768 days ago | IN | 0 ETH | 0.00176166 | ||||
| Deposit Offchain | 6014888 | 2768 days ago | IN | 0 ETH | 0.00211676 | ||||
| Set Bonus Extra | 6012642 | 2768 days ago | IN | 0 ETH | 0.00008767 | ||||
| Deposit Offchain | 6012640 | 2768 days ago | IN | 0 ETH | 0.0001204 | ||||
| Deposit Offchain | 6012562 | 2768 days ago | IN | 0 ETH | 0.00023455 | ||||
| Set Times | 6012421 | 2768 days ago | IN | 0 ETH | 0.00006758 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 6014921 | 2768 days ago | 0.5 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 0.5 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 1 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 1 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 0.28 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 0.28 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 10 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 10 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 6.24099402 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 6.24099402 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 1 ETH | ||||
| Transfer | 6014921 | 2768 days ago | 1 ETH | ||||
| Transfer | 6014697 | 2768 days ago | 1 ETH | ||||
| Transfer | 6014578 | 2768 days ago | 0.1 ETH | ||||
| Transfer | 6014578 | 2768 days ago | 0.1 ETH | ||||
| Transfer | 6014294 | 2768 days ago | 0.9 ETH | ||||
| Transfer | 6014294 | 2768 days ago | 0.9 ETH | ||||
| Transfer | 6014000 | 2768 days ago | 0.15839143 ETH | ||||
| Transfer | 6014000 | 2768 days ago | 0.15839143 ETH | ||||
| Transfer | 6012669 | 2768 days ago | 1.69372144 ETH | ||||
| Transfer | 6012669 | 2768 days ago | 1.69372144 ETH | ||||
| Transfer | 6012656 | 2768 days ago | 0.32 ETH | ||||
| Transfer | 6012656 | 2768 days ago | 0.32 ETH | ||||
| Transfer | 6012656 | 2768 days ago | 0.2998257 ETH | ||||
| Transfer | 6012656 | 2768 days ago | 0.2998257 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EthealNormalSale
Compiler Version
v0.4.19+commit.c4cbbb05
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-03-29
*/
pragma solidity ^0.4.17;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) onlyOwner public {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20
* @dev ERC20 interface
*/
contract ERC20 {
function balanceOf(address who) public constant returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function allowance(address owner, address spender) public constant returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract Controlled {
/// @notice The address of the controller is the only address that can call
/// a function with this modifier
modifier onlyController { require(msg.sender == controller); _; }
address public controller;
function Controlled() public { controller = msg.sender;}
/// @notice Changes the controller of the contract
/// @param _newController The new controller of the contract
function changeController(address _newController) public onlyController {
controller = _newController;
}
}
/**
* @title MiniMe interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20MiniMe is ERC20, Controlled {
function approveAndCall(address _spender, uint256 _amount, bytes _extraData) public returns (bool);
function totalSupply() public constant returns (uint);
function balanceOfAt(address _owner, uint _blockNumber) public constant returns (uint);
function totalSupplyAt(uint _blockNumber) public constant returns(uint);
function createCloneToken(string _cloneTokenName, uint8 _cloneDecimalUnits, string _cloneTokenSymbol, uint _snapshotBlock, bool _transfersEnabled) public returns(address);
function generateTokens(address _owner, uint _amount) public returns (bool);
function destroyTokens(address _owner, uint _amount) public returns (bool);
function enableTransfers(bool _transfersEnabled) public;
function isContract(address _addr) constant internal returns(bool);
function claimTokens(address _token) public;
event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount);
event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);
}
/**
* @title Crowdsale
* @dev Crowdsale is a base contract for managing a token crowdsale.
* Crowdsales have a start and end timestamps, where investors can make
* token purchases and the crowdsale will assign them tokens based
* on a token per ETH rate. Funds collected are forwarded to a wallet
* as they arrive.
*/
contract Crowdsale {
using SafeMath for uint256;
// The token being sold
ERC20MiniMe public token;
// start and end timestamps where investments are allowed (both inclusive)
uint256 public startTime;
uint256 public endTime;
// address where funds are collected
address public wallet;
// how many token units a buyer gets per wei
uint256 public rate;
// amount of raised money in wei
uint256 public weiRaised;
/**
* event for token purchase logging
* @param purchaser who paid for the tokens
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
*/
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) {
require(_startTime >= now);
require(_endTime >= _startTime);
require(_rate > 0);
require(_wallet != 0x0);
startTime = _startTime;
endTime = _endTime;
rate = _rate;
wallet = _wallet;
}
// fallback function can be used to buy tokens
function () payable {
buyTokens(msg.sender);
}
// low level token purchase function
function buyTokens(address beneficiary) public payable {
buyTokens(beneficiary, msg.value);
}
// implementation of low level token purchase function
function buyTokens(address beneficiary, uint256 weiAmount) internal {
require(beneficiary != 0x0);
require(validPurchase(weiAmount));
transferToken(beneficiary, weiAmount);
// update state
weiRaised = weiRaised.add(weiAmount);
forwardFunds(weiAmount);
}
// low level transfer token
// override to create custom token transfer mechanism, eg. pull pattern
function transferToken(address beneficiary, uint256 weiAmount) internal {
// calculate token amount to be created
uint256 tokens = weiAmount.mul(rate);
token.generateTokens(beneficiary, tokens);
TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
}
// send ether to the fund collection wallet
// override to create custom fund forwarding mechanisms
function forwardFunds(uint256 weiAmount) internal {
wallet.transfer(weiAmount);
}
// @return true if the transaction can buy tokens
function validPurchase(uint256 weiAmount) internal constant returns (bool) {
bool withinPeriod = now >= startTime && now <= endTime;
bool nonZeroPurchase = weiAmount != 0;
return withinPeriod && nonZeroPurchase;
}
// @return true if crowdsale event has ended
function hasEnded() public constant returns (bool) {
return now > endTime;
}
// @return true if crowdsale has started
function hasStarted() public constant returns (bool) {
return now >= startTime;
}
}
/**
* @title CappedCrowdsale
* @dev Extension of Crowdsale with a max amount of funds raised
*/
contract CappedCrowdsale is Crowdsale {
using SafeMath for uint256;
uint256 public cap;
function CappedCrowdsale(uint256 _cap) {
require(_cap > 0);
cap = _cap;
}
// overriding Crowdsale#validPurchase to add extra cap logic
// @return true if investors can buy at the moment
function validPurchase(uint256 weiAmount) internal constant returns (bool) {
return super.validPurchase(weiAmount) && !capReached();
}
// overriding Crowdsale#hasEnded to add cap logic
// @return true if crowdsale event has ended
function hasEnded() public constant returns (bool) {
return super.hasEnded() || capReached();
}
// @return true if cap has been reached
function capReached() internal constant returns (bool) {
return weiRaised >= cap;
}
// overriding Crowdsale#buyTokens to add partial refund logic
function buyTokens(address beneficiary) public payable {
uint256 weiToCap = cap.sub(weiRaised);
uint256 weiAmount = weiToCap < msg.value ? weiToCap : msg.value;
buyTokens(beneficiary, weiAmount);
uint256 refund = msg.value.sub(weiAmount);
if (refund > 0) {
msg.sender.transfer(refund);
}
}
}
/// @dev The token controller contract must implement these functions
contract TokenController {
ERC20MiniMe public ethealToken;
address public SALE; // address where sale tokens are located
/// @notice needed for hodler handling
function addHodlerStake(address _beneficiary, uint256 _stake) public;
function setHodlerStake(address _beneficiary, uint256 _stake) public;
function setHodlerTime(uint256 _time) public;
/// @notice Called when `_owner` sends ether to the MiniMe Token contract
/// @param _owner The address that sent the ether to create tokens
/// @return True if the ether is accepted, false if it throws
function proxyPayment(address _owner) public payable returns(bool);
/// @notice Notifies the controller about a token transfer allowing the
/// controller to react if desired
/// @param _from The origin of the transfer
/// @param _to The destination of the transfer
/// @param _amount The amount of the transfer
/// @return False if the controller does not authorize the transfer
function onTransfer(address _from, address _to, uint _amount) public returns(bool);
/// @notice Notifies the controller about an approval allowing the
/// controller to react if desired
/// @param _owner The address that calls `approve()`
/// @param _spender The spender in the `approve()` call
/// @param _amount The amount in the `approve()` call
/// @return False if the controller does not authorize the approval
function onApprove(address _owner, address _spender, uint _amount) public returns(bool);
}
/**
* @title FinalizableCrowdsale
* @dev Extension of Crowdsale where an owner can do extra work
* after finishing.
*/
contract FinalizableCrowdsale is Crowdsale, Ownable {
using SafeMath for uint256;
bool public isFinalized = false;
event Finalized();
/**
* @dev Must be called after crowdsale ends, to do some extra finalization
* work. Calls the contract's finalization function.
*/
function finalize() onlyOwner public {
require(!isFinalized);
require(hasEnded());
finalization();
Finalized();
isFinalized = true;
}
/**
* @dev Can be overridden to add finalization logic. The overriding function
* should call super.finalization() to ensure the chain of finalization is
* executed entirely.
*/
function finalization() internal {
}
}
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is Ownable {
event Pause();
event Unpause();
bool public paused = false;
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyOwner whenNotPaused public {
paused = true;
Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() onlyOwner whenPaused public {
paused = false;
Unpause();
}
}
/**
* @title Eliptic curve signature operations
*
* @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
*/
library ECRecovery {
/**
* @dev Recover signer address from a message by using his 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) public 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
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 {
return ecrecover(hash, v, r, s);
}
}
}
/**
* @title EthealWhitelist
* @author thesved
* @notice EthealWhitelist contract which handles KYC
*/
contract EthealWhitelist is Ownable {
using ECRecovery for bytes32;
// signer address for offchain whitelist signing
address public signer;
// storing whitelisted addresses
mapping(address => bool) public isWhitelisted;
event WhitelistSet(address indexed _address, bool _state);
////////////////
// Constructor
////////////////
function EthealWhitelist(address _signer) {
require(_signer != address(0));
signer = _signer;
}
/// @notice set signing address after deployment
function setSigner(address _signer) public onlyOwner {
require(_signer != address(0));
signer = _signer;
}
////////////////
// Whitelisting: only owner
////////////////
/// @notice Set whitelist state for an address.
function setWhitelist(address _addr, bool _state) public onlyOwner {
require(_addr != address(0));
isWhitelisted[_addr] = _state;
WhitelistSet(_addr, _state);
}
/// @notice Set whitelist state for multiple addresses
function setManyWhitelist(address[] _addr, bool _state) public onlyOwner {
for (uint256 i = 0; i < _addr.length; i++) {
setWhitelist(_addr[i], _state);
}
}
/// @notice offchain whitelist check
function isOffchainWhitelisted(address _addr, bytes _sig) public view returns (bool) {
bytes32 hash = keccak256("\x19Ethereum Signed Message:\n20",_addr);
return hash.recover(_sig) == signer;
}
}
/**
* @title EthealNormalSale
* @author thesved
* @notice Etheal Token Sale contract, with softcap and hardcap (cap)
* @dev This contract has to be finalized before token claims are enabled
*/
contract EthealNormalSale is Pausable, FinalizableCrowdsale, CappedCrowdsale {
// the token is here
TokenController public ethealController;
// after reaching {weiRaised} >= {softCap}, there is {softCapTime} seconds until the sale closes
// {softCapClose} contains the closing time
uint256 public rate = 700;
uint256 public softCap = 6800 ether;
uint256 public softCapTime = 120 hours;
uint256 public softCapClose;
uint256 public cap = 14300 ether;
// how many token is sold and not claimed, used for refunding to token controller
uint256 public tokenBalance;
// total token sold
uint256 public tokenSold;
// minimum contribution, 0.1ETH
uint256 public minContribution = 0.1 ether;
// whitelist: above threshold the contract has to approve each transaction
EthealWhitelist public whitelist;
uint256 public whitelistThreshold = 1 ether;
// deposit address from which it can get funds before sale
address public deposit;
// stakes contains token bought and contirbutions contains the value in wei
mapping (address => uint256) public stakes;
mapping (address => uint256) public contributions;
// promo token bonus
address public promoTokenController;
mapping (address => uint256) public bonusExtra;
// addresses of contributors to handle finalization after token sale end (refunds or token claims)
address[] public contributorsKeys;
// events for token purchase during sale and claiming tokens after sale
event LogTokenClaimed(address indexed _claimer, address indexed _beneficiary, uint256 _amount);
event LogTokenPurchase(address indexed _purchaser, address indexed _beneficiary, uint256 _value, uint256 _amount, uint256 _participants, uint256 _weiRaised);
event LogTokenSoftCapReached(uint256 _closeTime);
event LogTokenHardCapReached();
////////////////
// Constructor and inherited function overrides
////////////////
/// @notice Constructor to create PreSale contract
/// @param _ethealController Address of ethealController
/// @param _startTime The start time of token sale in seconds.
/// @param _endTime The end time of token sale in seconds.
/// @param _minContribution The minimum contribution per transaction in wei (0.1 ETH)
/// @param _rate Number of HEAL tokens per 1 ETH
/// @param _softCap Softcap in wei, reaching it ends the sale in _softCapTime seconds
/// @param _softCapTime Seconds until the sale remains open after reaching _softCap
/// @param _cap Maximum cap in wei, we can't raise more funds
/// @param _wallet Address of multisig wallet, which will get all the funds after successful sale
function EthealNormalSale(
address _ethealController,
uint256 _startTime,
uint256 _endTime,
uint256 _minContribution,
uint256 _rate,
uint256 _softCap,
uint256 _softCapTime,
uint256 _cap,
address _wallet
)
CappedCrowdsale(_cap)
FinalizableCrowdsale()
Crowdsale(_startTime, _endTime, _rate, _wallet)
{
// ethealController must be valid
require(_ethealController != address(0));
ethealController = TokenController(_ethealController);
// caps have to be consistent with each other
require(_softCap <= _cap);
softCap = _softCap;
softCapTime = _softCapTime;
// this is needed since super constructor wont overwite overriden variables
cap = _cap;
rate = _rate;
minContribution = _minContribution;
}
////////////////
// Administer contract details
////////////////
/// @notice Sets min contribution
function setMinContribution(uint256 _minContribution) public onlyOwner {
minContribution = _minContribution;
}
/// @notice Sets soft cap and max cap
function setCaps(uint256 _softCap, uint256 _softCapTime, uint256 _cap) public onlyOwner {
require(_softCap <= _cap);
softCap = _softCap;
softCapTime = _softCapTime;
cap = _cap;
}
/// @notice Sets crowdsale start and end time
function setTimes(uint256 _startTime, uint256 _endTime) public onlyOwner {
require(_startTime <= _endTime);
require(!hasEnded());
startTime = _startTime;
endTime = _endTime;
}
/// @notice Set rate
function setRate(uint256 _rate) public onlyOwner {
require(_rate > 0);
rate = _rate;
}
/// @notice Set address of promo token
function setPromoTokenController(address _addr) public onlyOwner {
require(_addr != address(0));
promoTokenController = _addr;
}
/// @notice Set whitelist contract address and minimum threshold
function setWhitelist(address _whitelist, uint256 _threshold) public onlyOwner {
// if whitelist contract address is provided we set it
if (_whitelist != address(0)) {
whitelist = EthealWhitelist(_whitelist);
}
whitelistThreshold = _threshold;
}
/// @notice Set deposit contract address from which it can receive money before sale
function setDeposit(address _deposit) public onlyOwner {
deposit = _deposit;
}
/// @notice move excess tokens, eg to hodler/sale contract
function moveTokens(address _to, uint256 _amount) public onlyOwner {
require(_to != address(0));
require(_amount <= getHealBalance().sub(tokenBalance));
require(ethealController.ethealToken().transfer(_to, _amount));
}
////////////////
// Purchase functions
////////////////
/// @dev Overriding Crowdsale#buyTokens to add partial refund
/// @param _beneficiary Beneficiary of the token purchase
function buyTokens(address _beneficiary) public payable whenNotPaused {
handlePayment(_beneficiary, msg.value, now, "");
}
/// @dev buying tokens for someone with offchain whitelist signature
function buyTokensSigned(address _beneficiary, bytes _whitelistSign) public payable whenNotPaused {
handlePayment(_beneficiary, msg.value, now, _whitelistSign);
}
/// @dev Internal function for handling transactions with ether.
function handlePayment(address _beneficiary, uint256 _amount, uint256 _time, bytes memory _whitelistSign) internal {
require(_beneficiary != address(0));
uint256 weiAmount = handleContribution(_beneficiary, _amount, _time, _whitelistSign);
forwardFunds(weiAmount);
// handle refund excess tokens
uint256 refund = _amount.sub(weiAmount);
if (refund > 0) {
_beneficiary.transfer(refund);
}
}
/// @dev Handling the amount of contribution and cap logic. Internal function.
/// @return Wei successfully contributed.
function handleContribution(address _beneficiary, uint256 _amount, uint256 _time, bytes memory _whitelistSign) internal returns (uint256) {
require(_beneficiary != address(0));
uint256 weiToCap = howMuchCanXContributeNow(_beneficiary);
uint256 weiAmount = uint256Min(weiToCap, _amount);
// account the new contribution
transferToken(_beneficiary, weiAmount, _time, _whitelistSign);
// close sale in softCapTime seconds after reaching softCap
if (weiRaised >= softCap && softCapClose == 0) {
softCapClose = now.add(softCapTime);
LogTokenSoftCapReached(uint256Min(softCapClose, endTime));
}
// event for hard cap reached
if (weiRaised >= cap) {
LogTokenHardCapReached();
}
return weiAmount;
}
/// @dev Handling token distribution and accounting. Overriding Crowdsale#transferToken.
/// @param _beneficiary Address of the recepient of the tokens
/// @param _weiAmount Contribution in wei
/// @param _time When the contribution was made
function transferToken(address _beneficiary, uint256 _weiAmount, uint256 _time, bytes memory _whitelistSign) internal {
require(_beneficiary != address(0));
require(validPurchase(_weiAmount));
// increase wei Raised
weiRaised = weiRaised.add(_weiAmount);
// require whitelist above threshold
contributions[_beneficiary] = contributions[_beneficiary].add(_weiAmount);
require(contributions[_beneficiary] <= whitelistThreshold
|| whitelist.isWhitelisted(_beneficiary)
|| whitelist.isOffchainWhitelisted(_beneficiary, _whitelistSign)
);
// calculate tokens, so we can refund excess tokens to EthealController after token sale
uint256 _bonus = getBonus(_beneficiary, _weiAmount, _time);
uint256 tokens = _weiAmount.mul(rate).mul(_bonus).div(100);
tokenBalance = tokenBalance.add(tokens);
if (stakes[_beneficiary] == 0) {
contributorsKeys.push(_beneficiary);
}
stakes[_beneficiary] = stakes[_beneficiary].add(tokens);
LogTokenPurchase(msg.sender, _beneficiary, _weiAmount, tokens, contributorsKeys.length, weiRaised);
}
/// @dev Get eth deposit from Deposit contract
function depositEth(address _beneficiary, uint256 _time, bytes _whitelistSign) public payable whenNotPaused {
require(msg.sender == deposit);
handlePayment(_beneficiary, msg.value, _time, _whitelistSign);
}
/// @dev Deposit from other currencies
function depositOffchain(address _beneficiary, uint256 _amount, uint256 _time, bytes _whitelistSign) public onlyOwner whenNotPaused {
handleContribution(_beneficiary, _amount, _time, _whitelistSign);
}
/// @dev Overriding Crowdsale#validPurchase to add min contribution logic
/// @param _weiAmount Contribution amount in wei
/// @return true if contribution is okay
function validPurchase(uint256 _weiAmount) internal constant returns (bool) {
bool nonEnded = !hasEnded();
bool nonZero = _weiAmount != 0;
bool enoughContribution = _weiAmount >= minContribution;
return nonEnded && nonZero && enoughContribution;
}
/// @dev Overriding Crowdsale#hasEnded to add soft cap logic
/// @return true if crowdsale event has ended or a softCapClose time is set and passed
function hasEnded() public constant returns (bool) {
return super.hasEnded() || softCapClose > 0 && now > softCapClose;
}
/// @dev Extending RefundableCrowdsale#finalization sending back excess tokens to ethealController
function finalization() internal {
uint256 _balance = getHealBalance();
// saving token balance for future reference
tokenSold = tokenBalance;
// send back the excess token to ethealController
if (_balance > tokenBalance) {
ethealController.ethealToken().transfer(ethealController.SALE(), _balance.sub(tokenBalance));
}
// hodler stake counting starts 14 days after closing normal sale
ethealController.setHodlerTime(now + 14 days);
super.finalization();
}
////////////////
// AFTER token sale
////////////////
/// @notice Modifier for after sale finalization
modifier afterSale() {
require(isFinalized);
_;
}
/// @notice Claim token for msg.sender after token sale based on stake.
function claimToken() public afterSale {
claimTokenFor(msg.sender);
}
/// @notice Claim token after token sale based on stake.
/// @dev Anyone can call this function and distribute tokens after successful token sale
/// @param _beneficiary Address of the beneficiary who gets the token
function claimTokenFor(address _beneficiary) public afterSale whenNotPaused {
uint256 tokens = stakes[_beneficiary];
require(tokens > 0);
// set the stake 0 for beneficiary
stakes[_beneficiary] = 0;
// decrease tokenBalance, to make it possible to withdraw excess HEAL funds
tokenBalance = tokenBalance.sub(tokens);
// distribute hodlr stake
ethealController.addHodlerStake(_beneficiary, tokens);
// distribute token
require(ethealController.ethealToken().transfer(_beneficiary, tokens));
LogTokenClaimed(msg.sender, _beneficiary, tokens);
}
/// @notice claimToken() for multiple addresses
/// @dev Anyone can call this function and distribute tokens after successful token sale
/// @param _beneficiaries Array of addresses for which we want to claim tokens
function claimManyTokenFor(address[] _beneficiaries) external afterSale {
for (uint256 i = 0; i < _beneficiaries.length; i++) {
claimTokenFor(_beneficiaries[i]);
}
}
////////////////
// Bonus functions
////////////////
/// @notice Sets extra 5% bonus for those addresses who send back a promo token
/// @notice It contains an easter egg.
/// @param _addr this address gets the bonus
/// @param _value how many tokens are transferred
function setPromoBonus(address _addr, uint256 _value) public {
require(msg.sender == promoTokenController || msg.sender == owner);
require(_value>0);
uint256 _bonus = keccak256(_value) == 0xbeced09521047d05b8960b7e7bcc1d1292cf3e4b2a6b63f48335cbde5f7545d2 ? 6 : 5;
if (bonusExtra[ _addr ] < _bonus) {
bonusExtra[ _addr ] = _bonus;
}
}
/// @notice Manual set extra bonus for addresses
function setBonusExtra(address _addr, uint256 _bonus) public onlyOwner {
require(_addr != address(0));
bonusExtra[_addr] = _bonus;
}
/// @notice Mass set extra bonus for addresses
function setManyBonusExtra(address[] _addr, uint256 _bonus) external onlyOwner {
for (uint256 i = 0; i < _addr.length; i++) {
setBonusExtra(_addr[i],_bonus);
}
}
/// @notice Returns bonus for now
function getBonusNow(address _addr, uint256 _size) public view returns (uint256) {
return getBonus(_addr, _size, now);
}
/// @notice Returns the bonus in percentage, eg 130 means 30% bonus
function getBonus(address _addr, uint256 _size, uint256 _time) public view returns (uint256 _bonus) {
// detailed bonus structure: https://etheal.com/#heal-token
_bonus = 100;
// time based bonuses
uint256 _day = getSaleDay(_time);
uint256 _hour = getSaleHour(_time);
if (_day <= 1) {
if (_hour <= 1) _bonus = 130;
else if (_hour <= 5) _bonus = 125;
else if (_hour <= 8) _bonus = 120;
else _bonus = 118;
}
else if (_day <= 2) { _bonus = 116; }
else if (_day <= 3) { _bonus = 115; }
else if (_day <= 5) { _bonus = 114; }
else if (_day <= 7) { _bonus = 113; }
else if (_day <= 9) { _bonus = 112; }
else if (_day <= 11) { _bonus = 111; }
else if (_day <= 13) { _bonus = 110; }
else if (_day <= 15) { _bonus = 108; }
else if (_day <= 17) { _bonus = 107; }
else if (_day <= 19) { _bonus = 106; }
else if (_day <= 21) { _bonus = 105; }
else if (_day <= 23) { _bonus = 104; }
else if (_day <= 25) { _bonus = 103; }
else if (_day <= 27) { _bonus = 102; }
// size based bonuses
if (_size >= 100 ether) { _bonus = _bonus + 4; }
else if (_size >= 10 ether) { _bonus = _bonus + 2; }
// manual bonus
_bonus += bonusExtra[ _addr ];
return _bonus;
}
////////////////
// Constant, helper functions
////////////////
/// @notice How many wei can the msg.sender contribute now.
function howMuchCanIContributeNow() view public returns (uint256) {
return howMuchCanXContributeNow(msg.sender);
}
/// @notice How many wei can an ethereum address contribute now.
/// @param _beneficiary Ethereum address
/// @return Number of wei the _beneficiary can contribute now.
function howMuchCanXContributeNow(address _beneficiary) view public returns (uint256) {
require(_beneficiary != address(0));
if (hasEnded() || paused)
return 0;
// wei to hard cap
uint256 weiToCap = cap.sub(weiRaised);
return weiToCap;
}
/// @notice For a give date how many 24 hour blocks have ellapsed since token sale start
/// Before sale return 0, first day 1, second day 2, ...
/// @param _time Date in seconds for which we want to know which sale day it is
/// @return Number of 24 hour blocks ellapsing since token sale start starting from 1
function getSaleDay(uint256 _time) view public returns (uint256) {
uint256 _day = 0;
if (_time > startTime) {
_day = _time.sub(startTime).div(60*60*24).add(1);
}
return _day;
}
/// @notice How many 24 hour blocks have ellapsed since token sale start
/// @return Number of 24 hour blocks ellapsing since token sale start starting from 1
function getSaleDayNow() view public returns (uint256) {
return getSaleDay(now);
}
/// @notice Returns sale hour: 0 before sale, 1 for the first hour, ...
/// @param _time Date in seconds for which we want to know which sale hour it is
/// @return Number of 1 hour blocks ellapsing since token sale start starting from 1
function getSaleHour(uint256 _time) view public returns (uint256) {
uint256 _hour = 0;
if (_time > startTime) {
_hour = _time.sub(startTime).div(60*60).add(1);
}
return _hour;
}
/// @notice How many 1 hour blocks have ellapsed since token sale start
/// @return Number of 1 hour blocks ellapsing since token sale start starting from 1
function getSaleHourNow() view public returns (uint256) {
return getSaleHour(now);
}
/// @notice Minimum between two uint256 numbers
function uint256Min(uint256 a, uint256 b) pure internal returns (uint256) {
return a > b ? b : a;
}
////////////////
// Test and contribution web app, NO audit is needed
////////////////
/// @notice How many contributors we have.
/// @return Number of different contributor ethereum addresses
function getContributorsCount() view public returns (uint256) {
return contributorsKeys.length;
}
/// @notice Get contributor addresses to manage refunds or token claims.
/// @dev If the sale is not yet successful, then it searches in the RefundVault.
/// If the sale is successful, it searches in contributors.
/// @param _pending If true, then returns addresses which didn't get their tokens distributed to them
/// @param _claimed If true, then returns already distributed addresses
/// @return Array of addresses of contributors
function getContributors(bool _pending, bool _claimed) view public returns (address[] contributors) {
uint256 i = 0;
uint256 results = 0;
address[] memory _contributors = new address[](contributorsKeys.length);
// search in contributors
for (i = 0; i < contributorsKeys.length; i++) {
if (_pending && stakes[contributorsKeys[i]] > 0 || _claimed && stakes[contributorsKeys[i]] == 0) {
_contributors[results] = contributorsKeys[i];
results++;
}
}
contributors = new address[](results);
for (i = 0; i < results; i++) {
contributors[i] = _contributors[i];
}
return contributors;
}
/// @notice How many HEAL tokens do this contract have
function getHealBalance() view public returns (uint256) {
return ethealController.ethealToken().balanceOf(address(this));
}
/// @notice Get current date for web3
function getNow() view public returns (uint256) {
return now;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_size","type":"uint256"}],"name":"getBonusNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address[]"},{"name":"_bonus","type":"uint256"}],"name":"setManyBonusExtra","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"moveTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_whitelist","type":"address"},{"name":"_threshold","type":"uint256"}],"name":"setWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"softCapTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"stakes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_bonus","type":"uint256"}],"name":"setBonusExtra","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_time","type":"uint256"},{"name":"_whitelistSign","type":"bytes"}],"name":"depositEth","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"}],"name":"setTimes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getHealBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_time","type":"uint256"}],"name":"getSaleHour","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pending","type":"bool"},{"name":"_claimed","type":"bool"}],"name":"getContributors","outputs":[{"name":"contributors","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"}],"name":"setDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasStarted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contributorsKeys","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minContribution","type":"uint256"}],"name":"setMinContribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiaries","type":"address[]"}],"name":"claimManyTokenFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"howMuchCanIContributeNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_time","type":"uint256"},{"name":"_whitelistSign","type":"bytes"}],"name":"depositOffchain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_size","type":"uint256"},{"name":"_time","type":"uint256"}],"name":"getBonus","outputs":[{"name":"_bonus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethealController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"softCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whitelist","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_whitelistSign","type":"bytes"}],"name":"buyTokensSigned","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tokenBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSaleDayNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minContribution","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bonusExtra","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"softCapClose","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSaleHourNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whitelistThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"howMuchCanXContributeNow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setPromoTokenController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"promoTokenController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_time","type":"uint256"}],"name":"getSaleDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"claimTokenFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_softCap","type":"uint256"},{"name":"_softCapTime","type":"uint256"},{"name":"_cap","type":"uint256"}],"name":"setCaps","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deposit","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"name":"setPromoBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getContributorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_ethealController","type":"address"},{"name":"_startTime","type":"uint256"},{"name":"_endTime","type":"uint256"},{"name":"_minContribution","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_softCap","type":"uint256"},{"name":"_softCapTime","type":"uint256"},{"name":"_cap","type":"uint256"},{"name":"_wallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_claimer","type":"address"},{"indexed":true,"name":"_beneficiary","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"LogTokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_purchaser","type":"address"},{"indexed":true,"name":"_beneficiary","type":"address"},{"indexed":false,"name":"_value","type":"uint256"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_participants","type":"uint256"},{"indexed":false,"name":"_weiRaised","type":"uint256"}],"name":"LogTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_closeTime","type":"uint256"}],"name":"LogTokenSoftCapReached","type":"event"},{"anonymous":false,"inputs":[],"name":"LogTokenHardCapReached","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"}]Contract Creation Code
60606040526006805460a060020a61ffff02191690556102bc600955690170a0f5040e50400000600a5562069780600b55690307345d9b5a55f00000600d5567016345785d8a0000601055670de0b6b3a764000060125534156200006257600080fd5b604051610120806200248e83398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191508290508888878442841015620000c657600080fd5b83831015620000d457600080fd5b60008211620000e257600080fd5b600160a060020a0381161515620000f857600080fd5b60019390935560029190915560045560038054600160a060020a0319908116600160a060020a03938416179091556006805490911633909216919091179055600081116200014557600080fd5b600755600160a060020a03891615156200015e57600080fd5b60088054600160a060020a031916600160a060020a038b16179055818411156200018757600080fd5b50600a92909255600b55600d556009556010555050506122e180620001ad6000396000f3006060604052600436106102bb5763ffffffff60e060020a6000350416630bf5361381146102c65780630e288064146102fa57806310c1b4141461031c5780631302d03a1461033e57806314cf12d51461036057806316934fc41461037357806320f320d0146103925780632109cf80146103b4578063224348361461040e57806323867979146104275780632674899b1461043a5780632c4e722e146104505780633197cbb614610463578063332e1a811461047657806334fcf437146104e6578063355274ea146104fc5780633b80938e1461050f5780633f4ba83a1461052e5780634042b66f1461054157806342e94c90146105545780634451d89f1461057357806344691f7e1461058657806344a2d0d2146105ad578063473b0d46146105df5780634bb278f3146105f5578063519ee19e14610608578063521eb2731461061b5780635549563c1461062e57806356afd6e31461064c5780635c975abb1461065f57806376cfc3661461067257806378e97925146106da57806379544754146106ed57806379caf670146107125780638456cb59146107255780638d4e4083146107385780638da5cb5b1461074b578063906a26e01461075e57806393e59dc1146107715780639781c3ca146107845780639e1a4d19146107d8578063a7a957ff146107eb578063aaffadf3146107fe578063ab01ba4914610811578063ad1be7c114610830578063b56797fd14610843578063b5dadb1714610856578063bbe4fd5014610869578063bdcbd9d11461087c578063c00757721461089b578063c04ecdb8146108ba578063c7efa689146108cd578063c83261bd146108e3578063caefb79e14610902578063d0e30db01461091e578063ec8ac4d814610931578063ecb70fb714610945578063f2fde38b14610958578063fc0c546a14610977578063fe6129d51461098a578063feed5561146109ac575b6102c4336109bf565b005b34156102d157600080fd5b6102e8600160a060020a03600435166024356109f3565b60405190815260200160405180910390f35b341561030557600080fd5b6102c4602460048035828101929101359035610a07565b341561032757600080fd5b6102c4600160a060020a0360043516602435610a64565b341561034957600080fd5b6102c4600160a060020a0360043516602435610ba3565b341561036b57600080fd5b6102e8610bfc565b341561037e57600080fd5b6102e8600160a060020a0360043516610c02565b341561039d57600080fd5b6102c4600160a060020a0360043516602435610c14565b6102c460048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610c6095505050505050565b341561041957600080fd5b6102c4600435602435610ca3565b341561043257600080fd5b6102e8610ce8565b341561044557600080fd5b6102e8600435610dc3565b341561045b57600080fd5b6102e8610e17565b341561046e57600080fd5b6102e8610e1d565b341561048157600080fd5b61049360043515156024351515610e23565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104d25780820151838201526020016104ba565b505050509050019250505060405180910390f35b34156104f157600080fd5b6102c4600435610fd3565b341561050757600080fd5b6102e8611000565b341561051a57600080fd5b6102c4600160a060020a0360043516611006565b341561053957600080fd5b6102c4611050565b341561054c57600080fd5b6102e86110cf565b341561055f57600080fd5b6102e8600160a060020a03600435166110d5565b341561057e57600080fd5b6102c46110e7565b341561059157600080fd5b61059961110a565b604051901515815260200160405180910390f35b34156105b857600080fd5b6105c3600435611113565b604051600160a060020a03909116815260200160405180910390f35b34156105ea57600080fd5b6102c460043561113b565b341561060057600080fd5b6102c461115b565b341561061357600080fd5b6102e86111fb565b341561062657600080fd5b6105c3611201565b341561063957600080fd5b6102c46004803560248101910135611210565b341561065757600080fd5b6102e8611263565b341561066a57600080fd5b610599611273565b341561067d57600080fd5b6102c460048035600160a060020a03169060248035916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061128395505050505050565b34156106e557600080fd5b6102e86112c8565b34156106f857600080fd5b6102e8600160a060020a03600435166024356044356112ce565b341561071d57600080fd5b6105c3611470565b341561073057600080fd5b6102c461147f565b341561074357600080fd5b610599611503565b341561075657600080fd5b6105c3611513565b341561076957600080fd5b6102e8611522565b341561077c57600080fd5b6105c3611528565b6102c460048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061153795505050505050565b34156107e357600080fd5b6102e861155a565b34156107f657600080fd5b6102e8611560565b341561080957600080fd5b6102e861156b565b341561081c57600080fd5b6102e8600160a060020a0360043516611571565b341561083b57600080fd5b6102e8611583565b341561084e57600080fd5b6102e8611589565b341561086157600080fd5b6102e8611594565b341561087457600080fd5b6102e861159a565b341561088757600080fd5b6102e8600160a060020a036004351661159e565b34156108a657600080fd5b6102c4600160a060020a03600435166115f5565b34156108c557600080fd5b6105c3611654565b34156108d857600080fd5b6102e8600435611663565b34156108ee57600080fd5b6102c4600160a060020a0360043516611693565b341561090d57600080fd5b6102c46004356024356044356118b5565b341561092957600080fd5b6105c36118eb565b6102c4600160a060020a03600435166109bf565b341561095057600080fd5b6105996118fa565b341561096357600080fd5b6102c4600160a060020a0360043516611920565b341561098257600080fd5b6105c36119bb565b341561099557600080fd5b6102c4600160a060020a03600435166024356119ca565b34156109b757600080fd5b6102e8611a9c565b60065460a060020a900460ff16156109d657600080fd5b6109f0813442602060405190810160405260008152611aa2565b50565b6000610a008383426112ce565b9392505050565b60065460009033600160a060020a03908116911614610a2557600080fd5b5060005b82811015610a5e57610a56848483818110610a4057fe5b90506020020135600160a060020a031683610c14565b600101610a29565b50505050565b60065433600160a060020a03908116911614610a7f57600080fd5b600160a060020a0382161515610a9457600080fd5b610aae600e54610aa2610ce8565b9063ffffffff611b2516565b811115610aba57600080fd5b600854600160a060020a03166303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610b0257600080fd5b6102c65a03f11515610b1357600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b7957600080fd5b6102c65a03f11515610b8a57600080fd5b505050604051805190501515610b9f57600080fd5b5050565b60065433600160a060020a03908116911614610bbe57600080fd5b600160a060020a03821615610bf6576011805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b60125550565b600b5481565b60146020526000908152604090205481565b60065433600160a060020a03908116911614610c2f57600080fd5b600160a060020a0382161515610c4457600080fd5b600160a060020a03909116600090815260176020526040902055565b60065460a060020a900460ff1615610c7757600080fd5b60135433600160a060020a03908116911614610c9257600080fd5b610c9e83348484611aa2565b505050565b60065433600160a060020a03908116911614610cbe57600080fd5b80821115610ccb57600080fd5b610cd36118fa565b15610cdd57600080fd5b600191909155600255565b600854600090600160a060020a03166303d756cb82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d3257600080fd5b6102c65a03f11515610d4357600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610da357600080fd5b6102c65a03f11515610db457600080fd5b50505060405180519150505b90565b6001546000908190831115610e0d57610e0a6001610dfe610e10610df260015488611b2590919063ffffffff16565b9063ffffffff611b3716565b9063ffffffff611b4e16565b90505b8091505b50919050565b60095481565b60025481565b610e2b612266565b600080610e36612266565b60185460009350839250604051805910610e4d5750595b90808252806020026020018201604052509050600092505b601854831015610f5857858015610eb35750600060146000601886815481101515610e8c57fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054115b80610efb5750848015610efb575060146000601885815481101515610ed457fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054155b15610f4d576018805484908110610f0e57fe5b600091825260209091200154600160a060020a0316818381518110610f2f57fe5b600160a060020a039092166020928302909101909101526001909101905b600190920191610e65565b81604051805910610f665750595b90808252806020026020018201604052509350600092505b81831015610fca57808381518110610f9257fe5b90602001906020020151848481518110610fa857fe5b600160a060020a03909216602092830290910190910152600190920191610f7e565b50505092915050565b60065433600160a060020a03908116911614610fee57600080fd5b60008111610ffb57600080fd5b600955565b600d5481565b60065433600160a060020a0390811691161461102157600080fd5b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60065433600160a060020a0390811691161461106b57600080fd5b60065460a060020a900460ff16151561108357600080fd5b6006805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055481565b60156020526000908152604090205481565b60065460a860020a900460ff1615156110ff57600080fd5b61110833611693565b565b60015442101590565b601880548290811061112157fe5b600091825260209091200154600160a060020a0316905081565b60065433600160a060020a0390811691161461115657600080fd5b601055565b60065433600160a060020a0390811691161461117657600080fd5b60065460a860020a900460ff161561118d57600080fd5b6111956118fa565b15156111a057600080fd5b6111a8611b5d565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a16006805475ff000000000000000000000000000000000000000000191660a860020a179055565b600f5481565b600354600160a060020a031681565b60065460009060a860020a900460ff16151561122b57600080fd5b5060005b81811015610c9e5761125b83838381811061124657fe5b90506020020135600160a060020a0316611693565b60010161122f565b600061126e3361159e565b905090565b60065460a060020a900460ff1681565b60065433600160a060020a0390811691161461129e57600080fd5b60065460a060020a900460ff16156112b557600080fd5b6112c184848484611d2e565b5050505050565b60015481565b60646000806112dc84611663565b91506112e784610dc3565b90506001821161132e57600181116113025760829250611329565b6005811161131357607d9250611329565b600881116113245760789250611329565b607692505b611418565b6002821161133f5760749250611418565b600382116113505760739250611418565b600582116113615760729250611418565b600782116113725760719250611418565b600982116113835760709250611418565b600b821161139457606f9250611418565b600d82116113a557606e9250611418565b600f82116113b657606c9250611418565b601182116113c757606b9250611418565b601382116113d857606a9250611418565b601582116113e95760699250611418565b601782116113fa5760689250611418565b6019821161140b5760679250611418565b601b821161141857606692505b68056bc75e2d63100000851061143357826004019250611449565b678ac7230489e800008510611449578260020192505b600160a060020a038616600090815260176020526040902054929092019150509392505050565b600854600160a060020a031681565b60065433600160a060020a0390811691161461149a57600080fd5b60065460a060020a900460ff16156114b157600080fd5b6006805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60065460a860020a900460ff1681565b600654600160a060020a031681565b600a5481565b601154600160a060020a031681565b60065460a060020a900460ff161561154e57600080fd5b610b9f82344284611aa2565b600e5481565b600061126e42611663565b60105481565b60176020526000908152604090205481565b600c5481565b600061126e42610dc3565b60125481565b4290565b600080600160a060020a03831615156115b657600080fd5b6115be6118fa565b806115d2575060065460a060020a900460ff165b156115e05760009150610e11565b600554600d54610e0a9163ffffffff611b2516565b60065433600160a060020a0390811691161461161057600080fd5b600160a060020a038116151561162557600080fd5b6016805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b601654600160a060020a031681565b6001546000908190831115610e0d57610e0a6001610dfe62015180610df260015488611b2590919063ffffffff16565b60065460009060a860020a900460ff1615156116ae57600080fd5b60065460a060020a900460ff16156116c557600080fd5b50600160a060020a0381166000908152601460205260408120549081116116eb57600080fd5b600160a060020a038216600090815260146020526040812055600e54611717908263ffffffff611b2516565b600e55600854600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b5050600854600160a060020a031690506303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156117cd57600080fd5b6102c65a03f115156117de57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561184457600080fd5b6102c65a03f1151561185557600080fd5b50505060405180519050151561186a57600080fd5b81600160a060020a031633600160a060020a03167f745f0808907a1633a7823cd566251e5cba0343095ab069646aedeeef4b21db7e8360405190815260200160405180910390a35050565b60065433600160a060020a039081169116146118d057600080fd5b808311156118dd57600080fd5b600a92909255600b55600d55565b601354600160a060020a031681565b6000611904611e1e565b8061126e57506000600c5411801561126e575050600c54421190565b60065433600160a060020a0390811691161461193b57600080fd5b600160a060020a038116151561195057600080fd5b600654600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b60165460009033600160a060020a03908116911614806119f8575060065433600160a060020a039081169116145b1515611a0357600080fd5b60008211611a1057600080fd5b816040519081526020016040519081900390207fbeced09521047d05b8960b7e7bcc1d1292cf3e4b2a6b63f48335cbde5f7545d214611a50576005611a53565b60065b600160a060020a03841660009081526017602052604090205460ff91909116915081901015610c9e57600160a060020a0383166000908152601760205260409020819055505050565b60185490565b600080600160a060020a0386161515611aba57600080fd5b611ac686868686611d2e565b9150611ad182611e36565b611ae1858363ffffffff611b2516565b90506000811115611b1d57600160a060020a03861681156108fc0282604051600060405180830381858888f193505050501515611b1d57600080fd5b505050505050565b600082821115611b3157fe5b50900390565b6000808284811515611b4557fe5b04949350505050565b600082820183811015610a0057fe5b6000611b67610ce8565b600e54600f819055909150811115611cc557600854600160a060020a03166303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611bc157600080fd5b6102c65a03f11515611bd257600080fd5b5050506040518051600854600160a060020a03918216925063a9059cbb9116634db08aea6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611c2d57600080fd5b6102c65a03f11515611c3e57600080fd5b50505060405180519050611c5d600e5485611b2590919063ffffffff16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ca957600080fd5b6102c65a03f11515611cba57600080fd5b505050604051805150505b600854600160a060020a031663b0e9a1ef62127500420160405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515611d1257600080fd5b6102c65a03f11515611d2357600080fd5b5050506109f0611108565b60008080600160a060020a0387161515611d4757600080fd5b611d508761159e565b9150611d5c8287611e69565b9050611d6a87828787611e78565b600a5460055410158015611d7e5750600c54155b15611ddc57600b54611d9790429063ffffffff611b4e16565b600c8190556002547f3812a5cf05e3a3e326f849747010fac31638a04bcc715d65b7456c64bfcf29d591611dca91611e69565b60405190815260200160405180910390a15b600d5460055410611e14577f66621f0543c2b9a9a0f8a2705df5c21104202b029dc22c3c0e07507e5b13cc5b60405160405180910390a15b9695505050505050565b6000611e286121f3565b8061126e575061126e6121fb565b600354600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156109f057600080fd5b6000818311610e115782610a00565b600080600160a060020a0386161515611e9057600080fd5b611e9985612206565b1515611ea457600080fd5b600554611eb7908663ffffffff611b4e16565b600555600160a060020a038616600090815260156020526040902054611ee3908663ffffffff611b4e16565b600160a060020a038716600090815260156020526040902081905560125490111580611f7f5750601154600160a060020a0316633af32abf8760006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611f6357600080fd5b6102c65a03f11515611f7457600080fd5b505050604051805190505b806120705750601154600160a060020a031663a30bdea487856000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612008578082015183820152602001611ff0565b50505050905090810190601f1680156120355780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151561205457600080fd5b6102c65a03f1151561206557600080fd5b505050604051805190505b151561207b57600080fd5b6120868686866112ce565b91506120b26064610df2846120a66009548a61224290919063ffffffff16565b9063ffffffff61224216565b600e549091506120c8908263ffffffff611b4e16565b600e55600160a060020a038616600090815260146020526040902054151561212f5760188054600181016120fc8382612278565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b600160a060020a038616600090815260146020526040902054612158908263ffffffff611b4e16565b6014600088600160a060020a0316600160a060020a031681526020019081526020016000208190555085600160a060020a031633600160a060020a03167fffff2a5737230ff40ffd57ba6d06d4ca8e5ea76c5d25aefe5538c9942346b7d087846018805490506005546040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050505050565b600254421190565b600754600554101590565b6000806000806122146118fa565b1592508460001415915060105485101590508280156122305750815b80156122395750805b95945050505050565b600082820283158061225e575082848281151561225b57fe5b04145b1515610a0057fe5b60206040519081016040526000815290565b815481835581811511610c9e57600083815260209020610c9e918101908301610dc091905b808211156122b1576000815560010161229d565b50905600a165627a7a72305820f6fcdff934a92a2e554c996651bf834b7f60f12831e1855cf0b25720ce49fb080029000000000000000000000000b565726e2e44e4ae9e3ce750fc4ba8fa65e701e0000000000000000000000000000000000000000000000000000000005b108c80000000000000000000000000000000000000000000000000000000005b381980000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000028a857425466f800000000000000000000000000000000000000000000000000000000000000028de8000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833
Deployed Bytecode
0x6060604052600436106102bb5763ffffffff60e060020a6000350416630bf5361381146102c65780630e288064146102fa57806310c1b4141461031c5780631302d03a1461033e57806314cf12d51461036057806316934fc41461037357806320f320d0146103925780632109cf80146103b4578063224348361461040e57806323867979146104275780632674899b1461043a5780632c4e722e146104505780633197cbb614610463578063332e1a811461047657806334fcf437146104e6578063355274ea146104fc5780633b80938e1461050f5780633f4ba83a1461052e5780634042b66f1461054157806342e94c90146105545780634451d89f1461057357806344691f7e1461058657806344a2d0d2146105ad578063473b0d46146105df5780634bb278f3146105f5578063519ee19e14610608578063521eb2731461061b5780635549563c1461062e57806356afd6e31461064c5780635c975abb1461065f57806376cfc3661461067257806378e97925146106da57806379544754146106ed57806379caf670146107125780638456cb59146107255780638d4e4083146107385780638da5cb5b1461074b578063906a26e01461075e57806393e59dc1146107715780639781c3ca146107845780639e1a4d19146107d8578063a7a957ff146107eb578063aaffadf3146107fe578063ab01ba4914610811578063ad1be7c114610830578063b56797fd14610843578063b5dadb1714610856578063bbe4fd5014610869578063bdcbd9d11461087c578063c00757721461089b578063c04ecdb8146108ba578063c7efa689146108cd578063c83261bd146108e3578063caefb79e14610902578063d0e30db01461091e578063ec8ac4d814610931578063ecb70fb714610945578063f2fde38b14610958578063fc0c546a14610977578063fe6129d51461098a578063feed5561146109ac575b6102c4336109bf565b005b34156102d157600080fd5b6102e8600160a060020a03600435166024356109f3565b60405190815260200160405180910390f35b341561030557600080fd5b6102c4602460048035828101929101359035610a07565b341561032757600080fd5b6102c4600160a060020a0360043516602435610a64565b341561034957600080fd5b6102c4600160a060020a0360043516602435610ba3565b341561036b57600080fd5b6102e8610bfc565b341561037e57600080fd5b6102e8600160a060020a0360043516610c02565b341561039d57600080fd5b6102c4600160a060020a0360043516602435610c14565b6102c460048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610c6095505050505050565b341561041957600080fd5b6102c4600435602435610ca3565b341561043257600080fd5b6102e8610ce8565b341561044557600080fd5b6102e8600435610dc3565b341561045b57600080fd5b6102e8610e17565b341561046e57600080fd5b6102e8610e1d565b341561048157600080fd5b61049360043515156024351515610e23565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104d25780820151838201526020016104ba565b505050509050019250505060405180910390f35b34156104f157600080fd5b6102c4600435610fd3565b341561050757600080fd5b6102e8611000565b341561051a57600080fd5b6102c4600160a060020a0360043516611006565b341561053957600080fd5b6102c4611050565b341561054c57600080fd5b6102e86110cf565b341561055f57600080fd5b6102e8600160a060020a03600435166110d5565b341561057e57600080fd5b6102c46110e7565b341561059157600080fd5b61059961110a565b604051901515815260200160405180910390f35b34156105b857600080fd5b6105c3600435611113565b604051600160a060020a03909116815260200160405180910390f35b34156105ea57600080fd5b6102c460043561113b565b341561060057600080fd5b6102c461115b565b341561061357600080fd5b6102e86111fb565b341561062657600080fd5b6105c3611201565b341561063957600080fd5b6102c46004803560248101910135611210565b341561065757600080fd5b6102e8611263565b341561066a57600080fd5b610599611273565b341561067d57600080fd5b6102c460048035600160a060020a03169060248035916044359160849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061128395505050505050565b34156106e557600080fd5b6102e86112c8565b34156106f857600080fd5b6102e8600160a060020a03600435166024356044356112ce565b341561071d57600080fd5b6105c3611470565b341561073057600080fd5b6102c461147f565b341561074357600080fd5b610599611503565b341561075657600080fd5b6105c3611513565b341561076957600080fd5b6102e8611522565b341561077c57600080fd5b6105c3611528565b6102c460048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061153795505050505050565b34156107e357600080fd5b6102e861155a565b34156107f657600080fd5b6102e8611560565b341561080957600080fd5b6102e861156b565b341561081c57600080fd5b6102e8600160a060020a0360043516611571565b341561083b57600080fd5b6102e8611583565b341561084e57600080fd5b6102e8611589565b341561086157600080fd5b6102e8611594565b341561087457600080fd5b6102e861159a565b341561088757600080fd5b6102e8600160a060020a036004351661159e565b34156108a657600080fd5b6102c4600160a060020a03600435166115f5565b34156108c557600080fd5b6105c3611654565b34156108d857600080fd5b6102e8600435611663565b34156108ee57600080fd5b6102c4600160a060020a0360043516611693565b341561090d57600080fd5b6102c46004356024356044356118b5565b341561092957600080fd5b6105c36118eb565b6102c4600160a060020a03600435166109bf565b341561095057600080fd5b6105996118fa565b341561096357600080fd5b6102c4600160a060020a0360043516611920565b341561098257600080fd5b6105c36119bb565b341561099557600080fd5b6102c4600160a060020a03600435166024356119ca565b34156109b757600080fd5b6102e8611a9c565b60065460a060020a900460ff16156109d657600080fd5b6109f0813442602060405190810160405260008152611aa2565b50565b6000610a008383426112ce565b9392505050565b60065460009033600160a060020a03908116911614610a2557600080fd5b5060005b82811015610a5e57610a56848483818110610a4057fe5b90506020020135600160a060020a031683610c14565b600101610a29565b50505050565b60065433600160a060020a03908116911614610a7f57600080fd5b600160a060020a0382161515610a9457600080fd5b610aae600e54610aa2610ce8565b9063ffffffff611b2516565b811115610aba57600080fd5b600854600160a060020a03166303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610b0257600080fd5b6102c65a03f11515610b1357600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b7957600080fd5b6102c65a03f11515610b8a57600080fd5b505050604051805190501515610b9f57600080fd5b5050565b60065433600160a060020a03908116911614610bbe57600080fd5b600160a060020a03821615610bf6576011805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b60125550565b600b5481565b60146020526000908152604090205481565b60065433600160a060020a03908116911614610c2f57600080fd5b600160a060020a0382161515610c4457600080fd5b600160a060020a03909116600090815260176020526040902055565b60065460a060020a900460ff1615610c7757600080fd5b60135433600160a060020a03908116911614610c9257600080fd5b610c9e83348484611aa2565b505050565b60065433600160a060020a03908116911614610cbe57600080fd5b80821115610ccb57600080fd5b610cd36118fa565b15610cdd57600080fd5b600191909155600255565b600854600090600160a060020a03166303d756cb82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d3257600080fd5b6102c65a03f11515610d4357600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610da357600080fd5b6102c65a03f11515610db457600080fd5b50505060405180519150505b90565b6001546000908190831115610e0d57610e0a6001610dfe610e10610df260015488611b2590919063ffffffff16565b9063ffffffff611b3716565b9063ffffffff611b4e16565b90505b8091505b50919050565b60095481565b60025481565b610e2b612266565b600080610e36612266565b60185460009350839250604051805910610e4d5750595b90808252806020026020018201604052509050600092505b601854831015610f5857858015610eb35750600060146000601886815481101515610e8c57fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054115b80610efb5750848015610efb575060146000601885815481101515610ed457fe5b6000918252602080832090910154600160a060020a03168352820192909252604001902054155b15610f4d576018805484908110610f0e57fe5b600091825260209091200154600160a060020a0316818381518110610f2f57fe5b600160a060020a039092166020928302909101909101526001909101905b600190920191610e65565b81604051805910610f665750595b90808252806020026020018201604052509350600092505b81831015610fca57808381518110610f9257fe5b90602001906020020151848481518110610fa857fe5b600160a060020a03909216602092830290910190910152600190920191610f7e565b50505092915050565b60065433600160a060020a03908116911614610fee57600080fd5b60008111610ffb57600080fd5b600955565b600d5481565b60065433600160a060020a0390811691161461102157600080fd5b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60065433600160a060020a0390811691161461106b57600080fd5b60065460a060020a900460ff16151561108357600080fd5b6006805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60055481565b60156020526000908152604090205481565b60065460a860020a900460ff1615156110ff57600080fd5b61110833611693565b565b60015442101590565b601880548290811061112157fe5b600091825260209091200154600160a060020a0316905081565b60065433600160a060020a0390811691161461115657600080fd5b601055565b60065433600160a060020a0390811691161461117657600080fd5b60065460a860020a900460ff161561118d57600080fd5b6111956118fa565b15156111a057600080fd5b6111a8611b5d565b7f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a16006805475ff000000000000000000000000000000000000000000191660a860020a179055565b600f5481565b600354600160a060020a031681565b60065460009060a860020a900460ff16151561122b57600080fd5b5060005b81811015610c9e5761125b83838381811061124657fe5b90506020020135600160a060020a0316611693565b60010161122f565b600061126e3361159e565b905090565b60065460a060020a900460ff1681565b60065433600160a060020a0390811691161461129e57600080fd5b60065460a060020a900460ff16156112b557600080fd5b6112c184848484611d2e565b5050505050565b60015481565b60646000806112dc84611663565b91506112e784610dc3565b90506001821161132e57600181116113025760829250611329565b6005811161131357607d9250611329565b600881116113245760789250611329565b607692505b611418565b6002821161133f5760749250611418565b600382116113505760739250611418565b600582116113615760729250611418565b600782116113725760719250611418565b600982116113835760709250611418565b600b821161139457606f9250611418565b600d82116113a557606e9250611418565b600f82116113b657606c9250611418565b601182116113c757606b9250611418565b601382116113d857606a9250611418565b601582116113e95760699250611418565b601782116113fa5760689250611418565b6019821161140b5760679250611418565b601b821161141857606692505b68056bc75e2d63100000851061143357826004019250611449565b678ac7230489e800008510611449578260020192505b600160a060020a038616600090815260176020526040902054929092019150509392505050565b600854600160a060020a031681565b60065433600160a060020a0390811691161461149a57600080fd5b60065460a060020a900460ff16156114b157600080fd5b6006805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60065460a860020a900460ff1681565b600654600160a060020a031681565b600a5481565b601154600160a060020a031681565b60065460a060020a900460ff161561154e57600080fd5b610b9f82344284611aa2565b600e5481565b600061126e42611663565b60105481565b60176020526000908152604090205481565b600c5481565b600061126e42610dc3565b60125481565b4290565b600080600160a060020a03831615156115b657600080fd5b6115be6118fa565b806115d2575060065460a060020a900460ff165b156115e05760009150610e11565b600554600d54610e0a9163ffffffff611b2516565b60065433600160a060020a0390811691161461161057600080fd5b600160a060020a038116151561162557600080fd5b6016805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b601654600160a060020a031681565b6001546000908190831115610e0d57610e0a6001610dfe62015180610df260015488611b2590919063ffffffff16565b60065460009060a860020a900460ff1615156116ae57600080fd5b60065460a060020a900460ff16156116c557600080fd5b50600160a060020a0381166000908152601460205260408120549081116116eb57600080fd5b600160a060020a038216600090815260146020526040812055600e54611717908263ffffffff611b2516565b600e55600854600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b5050600854600160a060020a031690506303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156117cd57600080fd5b6102c65a03f115156117de57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561184457600080fd5b6102c65a03f1151561185557600080fd5b50505060405180519050151561186a57600080fd5b81600160a060020a031633600160a060020a03167f745f0808907a1633a7823cd566251e5cba0343095ab069646aedeeef4b21db7e8360405190815260200160405180910390a35050565b60065433600160a060020a039081169116146118d057600080fd5b808311156118dd57600080fd5b600a92909255600b55600d55565b601354600160a060020a031681565b6000611904611e1e565b8061126e57506000600c5411801561126e575050600c54421190565b60065433600160a060020a0390811691161461193b57600080fd5b600160a060020a038116151561195057600080fd5b600654600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b60165460009033600160a060020a03908116911614806119f8575060065433600160a060020a039081169116145b1515611a0357600080fd5b60008211611a1057600080fd5b816040519081526020016040519081900390207fbeced09521047d05b8960b7e7bcc1d1292cf3e4b2a6b63f48335cbde5f7545d214611a50576005611a53565b60065b600160a060020a03841660009081526017602052604090205460ff91909116915081901015610c9e57600160a060020a0383166000908152601760205260409020819055505050565b60185490565b600080600160a060020a0386161515611aba57600080fd5b611ac686868686611d2e565b9150611ad182611e36565b611ae1858363ffffffff611b2516565b90506000811115611b1d57600160a060020a03861681156108fc0282604051600060405180830381858888f193505050501515611b1d57600080fd5b505050505050565b600082821115611b3157fe5b50900390565b6000808284811515611b4557fe5b04949350505050565b600082820183811015610a0057fe5b6000611b67610ce8565b600e54600f819055909150811115611cc557600854600160a060020a03166303d756cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611bc157600080fd5b6102c65a03f11515611bd257600080fd5b5050506040518051600854600160a060020a03918216925063a9059cbb9116634db08aea6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611c2d57600080fd5b6102c65a03f11515611c3e57600080fd5b50505060405180519050611c5d600e5485611b2590919063ffffffff16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ca957600080fd5b6102c65a03f11515611cba57600080fd5b505050604051805150505b600854600160a060020a031663b0e9a1ef62127500420160405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515611d1257600080fd5b6102c65a03f11515611d2357600080fd5b5050506109f0611108565b60008080600160a060020a0387161515611d4757600080fd5b611d508761159e565b9150611d5c8287611e69565b9050611d6a87828787611e78565b600a5460055410158015611d7e5750600c54155b15611ddc57600b54611d9790429063ffffffff611b4e16565b600c8190556002547f3812a5cf05e3a3e326f849747010fac31638a04bcc715d65b7456c64bfcf29d591611dca91611e69565b60405190815260200160405180910390a15b600d5460055410611e14577f66621f0543c2b9a9a0f8a2705df5c21104202b029dc22c3c0e07507e5b13cc5b60405160405180910390a15b9695505050505050565b6000611e286121f3565b8061126e575061126e6121fb565b600354600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156109f057600080fd5b6000818311610e115782610a00565b600080600160a060020a0386161515611e9057600080fd5b611e9985612206565b1515611ea457600080fd5b600554611eb7908663ffffffff611b4e16565b600555600160a060020a038616600090815260156020526040902054611ee3908663ffffffff611b4e16565b600160a060020a038716600090815260156020526040902081905560125490111580611f7f5750601154600160a060020a0316633af32abf8760006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611f6357600080fd5b6102c65a03f11515611f7457600080fd5b505050604051805190505b806120705750601154600160a060020a031663a30bdea487856000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612008578082015183820152602001611ff0565b50505050905090810190601f1680156120355780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151561205457600080fd5b6102c65a03f1151561206557600080fd5b505050604051805190505b151561207b57600080fd5b6120868686866112ce565b91506120b26064610df2846120a66009548a61224290919063ffffffff16565b9063ffffffff61224216565b600e549091506120c8908263ffffffff611b4e16565b600e55600160a060020a038616600090815260146020526040902054151561212f5760188054600181016120fc8382612278565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b600160a060020a038616600090815260146020526040902054612158908263ffffffff611b4e16565b6014600088600160a060020a0316600160a060020a031681526020019081526020016000208190555085600160a060020a031633600160a060020a03167fffff2a5737230ff40ffd57ba6d06d4ca8e5ea76c5d25aefe5538c9942346b7d087846018805490506005546040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505050505050565b600254421190565b600754600554101590565b6000806000806122146118fa565b1592508460001415915060105485101590508280156122305750815b80156122395750805b95945050505050565b600082820283158061225e575082848281151561225b57fe5b04145b1515610a0057fe5b60206040519081016040526000815290565b815481835581811511610c9e57600083815260209020610c9e918101908301610dc091905b808211156122b1576000815560010161229d565b50905600a165627a7a72305820f6fcdff934a92a2e554c996651bf834b7f60f12831e1855cf0b25720ce49fb080029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b565726e2e44e4ae9e3ce750fc4ba8fa65e701e0000000000000000000000000000000000000000000000000000000005b108c80000000000000000000000000000000000000000000000000000000005b381980000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000028a857425466f800000000000000000000000000000000000000000000000000000000000000028de8000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833
-----Decoded View---------------
Arg [0] : _ethealController (address): 0xB565726e2e44e4aE9e3CE750fc4ba8fA65e701e0
Arg [1] : _startTime (uint256): 1527811200
Arg [2] : _endTime (uint256): 1530403200
Arg [3] : _minContribution (uint256): 100000000000000000
Arg [4] : _rate (uint256): 700
Arg [5] : _softCap (uint256): 12000000000000000000000
Arg [6] : _softCapTime (uint256): 2678400
Arg [7] : _cap (uint256): 25000000000000000000000
Arg [8] : _wallet (address): 0xFc5c6c8015962E7035f3BDc5fE7eC94BEDc77833
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000b565726e2e44e4ae9e3ce750fc4ba8fa65e701e0
Arg [1] : 000000000000000000000000000000000000000000000000000000005b108c80
Arg [2] : 000000000000000000000000000000000000000000000000000000005b381980
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [5] : 00000000000000000000000000000000000000000000028a857425466f800000
Arg [6] : 000000000000000000000000000000000000000000000000000000000028de80
Arg [7] : 00000000000000000000000000000000000000000000054b40b1f852bda00000
Arg [8] : 000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833
Swarm Source
bzzr://f6fcdff934a92a2e554c996651bf834b7f60f12831e1855cf0b25720ce49fb08
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.