More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 21,097 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Admin Addres... | 4970193 | 2527 days ago | IN | 0 ETH | 0.00236664 | ||||
Reclaim Tokens | 4970181 | 2527 days ago | IN | 0 ETH | 0.0025176 | ||||
Set Admin Addres... | 4970142 | 2527 days ago | IN | 0 ETH | 0.00246904 | ||||
Transfer | 4943183 | 2532 days ago | IN | 1.894 ETH | 0.00197739 | ||||
Set Admin Addres... | 4732903 | 2569 days ago | IN | 0 ETH | 0.0030225 | ||||
Set Ops Address | 4732900 | 2569 days ago | IN | 0 ETH | 0.0015872 | ||||
Reclaim Tokens | 4732573 | 2569 days ago | IN | 0 ETH | 0.0032705 | ||||
Finalize | 4732543 | 2569 days ago | IN | 0 ETH | 0.002889 | ||||
Transfer | 4673013 | 2579 days ago | IN | 0.25 ETH | 0.00047153 | ||||
Transfer | 4671633 | 2580 days ago | IN | 0.4 ETH | 0.00071852 | ||||
Transfer | 4659826 | 2581 days ago | IN | 2.83 ETH | 0.00047153 | ||||
Transfer | 4659754 | 2581 days ago | IN | 2.5 ETH | 0.00047153 | ||||
Transfer | 4659733 | 2581 days ago | IN | 20 ETH | 0.00047153 | ||||
Transfer | 4657027 | 2582 days ago | IN | 3 ETH | 0.00022454 | ||||
Transfer | 4656765 | 2582 days ago | IN | 0.25 ETH | 0.00134724 | ||||
Transfer | 4656762 | 2582 days ago | IN | 0.3 ETH | 0.00047153 | ||||
Transfer | 4656319 | 2582 days ago | IN | 1 ETH | 0.00022454 | ||||
Transfer | 4656311 | 2582 days ago | IN | 23.98946063 ETH | 0.00047153 | ||||
Transfer | 4656293 | 2582 days ago | IN | 0.105 ETH | 0.00022454 | ||||
Transfer | 4656274 | 2582 days ago | IN | 3 ETH | 0.0005838 | ||||
Transfer | 4656261 | 2582 days ago | IN | 0.18 ETH | 0.00056135 | ||||
Transfer | 4656249 | 2582 days ago | IN | 0.14254079 ETH | 0.00040417 | ||||
Transfer | 4656249 | 2582 days ago | IN | 10 ETH | 0.00047153 | ||||
Transfer | 4656245 | 2582 days ago | IN | 1.3 ETH | 0.00047153 | ||||
Transfer | 4656245 | 2582 days ago | IN | 0.7 ETH | 0.00056135 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
4656238 | 2582 days ago | 2.68699556 ETH | ||||
4656238 | 2582 days ago | 3.9 ETH | ||||
4656238 | 2582 days ago | 13.47990482 ETH | ||||
4656234 | 2582 days ago | 5 ETH | ||||
4656234 | 2582 days ago | 1 ETH | ||||
4656234 | 2582 days ago | 2 ETH | ||||
4656234 | 2582 days ago | 0.4396837 ETH | ||||
4656233 | 2582 days ago | 0.5 ETH | ||||
4656232 | 2582 days ago | 3.5 ETH | ||||
4656232 | 2582 days ago | 0.5 ETH | ||||
4656232 | 2582 days ago | 0.20629221 ETH | ||||
4656232 | 2582 days ago | 0.86 ETH | ||||
4656232 | 2582 days ago | 0.2 ETH | ||||
4656232 | 2582 days ago | 9 ETH | ||||
4656232 | 2582 days ago | 1.41307173 ETH | ||||
4656232 | 2582 days ago | 0.7 ETH | ||||
4656232 | 2582 days ago | 0.5 ETH | ||||
4656232 | 2582 days ago | 0.25 ETH | ||||
4656232 | 2582 days ago | 10 ETH | ||||
4656232 | 2582 days ago | 0.16130333 ETH | ||||
4656231 | 2582 days ago | 0.25 ETH | ||||
4656231 | 2582 days ago | 0.3 ETH | ||||
4656231 | 2582 days ago | 10 ETH | ||||
4656231 | 2582 days ago | 0.32 ETH | ||||
4656231 | 2582 days ago | 4.54 ETH |
Loading...
Loading
Contract Name:
TokenSale
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2017-11-13 */ pragma solidity ^0.4.17; // ---------------------------------------------------------------------------- // Token Trustee Implementation // // Copyright (c) 2017 OpenST Ltd. // https://simpletoken.org/ // // The MIT Licence. // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // SafeMath Library Implementation // // Copyright (c) 2017 OpenST Ltd. // https://simpletoken.org/ // // The MIT Licence. // // Based on the SafeMath library by the OpenZeppelin team. // Copyright (c) 2016 Smart Contract Solutions, Inc. // https://github.com/OpenZeppelin/zeppelin-solidity // The MIT License. // ---------------------------------------------------------------------------- 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) { // 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; } } // // Implements basic ownership with 2-step transfers. // contract Owned { address public owner; address public proposedOwner; event OwnershipTransferInitiated(address indexed _proposedOwner); event OwnershipTransferCompleted(address indexed _newOwner); function Owned() public { owner = msg.sender; } modifier onlyOwner() { require(isOwner(msg.sender)); _; } function isOwner(address _address) internal view returns (bool) { return (_address == owner); } function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) { proposedOwner = _proposedOwner; OwnershipTransferInitiated(_proposedOwner); return true; } function completeOwnershipTransfer() public returns (bool) { require(msg.sender == proposedOwner); owner = proposedOwner; proposedOwner = address(0); OwnershipTransferCompleted(owner); return true; } } // // Implements a more advanced ownership and permission model based on owner, // admin and ops per Simple Token key management specification. // contract OpsManaged is Owned { address public opsAddress; address public adminAddress; event AdminAddressChanged(address indexed _newAddress); event OpsAddressChanged(address indexed _newAddress); function OpsManaged() public Owned() { } modifier onlyAdmin() { require(isAdmin(msg.sender)); _; } modifier onlyAdminOrOps() { require(isAdmin(msg.sender) || isOps(msg.sender)); _; } modifier onlyOwnerOrAdmin() { require(isOwner(msg.sender) || isAdmin(msg.sender)); _; } modifier onlyOps() { require(isOps(msg.sender)); _; } function isAdmin(address _address) internal view returns (bool) { return (adminAddress != address(0) && _address == adminAddress); } function isOps(address _address) internal view returns (bool) { return (opsAddress != address(0) && _address == opsAddress); } function isOwnerOrOps(address _address) internal view returns (bool) { return (isOwner(_address) || isOps(_address)); } // Owner and Admin can change the admin address. Address can also be set to 0 to 'disable' it. function setAdminAddress(address _adminAddress) external onlyOwnerOrAdmin returns (bool) { require(_adminAddress != owner); require(_adminAddress != address(this)); require(!isOps(_adminAddress)); adminAddress = _adminAddress; AdminAddressChanged(_adminAddress); return true; } // Owner and Admin can change the operations address. Address can also be set to 0 to 'disable' it. function setOpsAddress(address _opsAddress) external onlyOwnerOrAdmin returns (bool) { require(_opsAddress != owner); require(_opsAddress != address(this)); require(!isAdmin(_opsAddress)); opsAddress = _opsAddress; OpsAddressChanged(_opsAddress); return true; } } contract SimpleTokenConfig { string public constant TOKEN_SYMBOL = "ST"; string public constant TOKEN_NAME = "Simple Token"; uint8 public constant TOKEN_DECIMALS = 18; uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS); uint256 public constant TOKENS_MAX = 800000000 * DECIMALSFACTOR; } contract ERC20Interface { event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); function name() public view returns (string); function symbol() public view returns (string); function decimals() public view returns (uint8); function totalSupply() public view returns (uint256); function balanceOf(address _owner) public view returns (uint256 balance); function allowance(address _owner, address _spender) public view returns (uint256 remaining); function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); } // // Standard ERC20 implementation, with ownership. // contract ERC20Token is ERC20Interface, Owned { using SafeMath for uint256; string private tokenName; string private tokenSymbol; uint8 private tokenDecimals; uint256 internal tokenTotalSupply; mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed; function ERC20Token(string _symbol, string _name, uint8 _decimals, uint256 _totalSupply) public Owned() { tokenSymbol = _symbol; tokenName = _name; tokenDecimals = _decimals; tokenTotalSupply = _totalSupply; balances[owner] = _totalSupply; // According to the ERC20 standard, a token contract which creates new tokens should trigger // a Transfer event and transfers of 0 values must also fire the event. Transfer(0x0, owner, _totalSupply); } function name() public view returns (string) { return tokenName; } function symbol() public view returns (string) { return tokenSymbol; } function decimals() public view returns (uint8) { return tokenDecimals; } function totalSupply() public view returns (uint256) { return tokenTotalSupply; } function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } function transfer(address _to, uint256 _value) public returns (bool success) { // According to the EIP20 spec, "transfers of 0 values MUST be treated as normal // transfers and fire the Transfer event". // Also, should throw if not enough balance. This is taken care of by SafeMath. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { balances[_from] = balances[_from].sub(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(_from, _to, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } } // // SimpleToken is a standard ERC20 token with some additional functionality: // - It has a concept of finalize // - Before finalize, nobody can transfer tokens except: // - Owner and operations can transfer tokens // - Anybody can send back tokens to owner // - After finalize, no restrictions on token transfers // // // Permissions, according to the ST key management specification. // // Owner Admin Ops // transfer (before finalize) x x // transferForm (before finalize) x x // finalize x // contract SimpleToken is ERC20Token, OpsManaged, SimpleTokenConfig { bool public finalized; // Events event Burnt(address indexed _from, uint256 _amount); event Finalized(); function SimpleToken() public ERC20Token(TOKEN_SYMBOL, TOKEN_NAME, TOKEN_DECIMALS, TOKENS_MAX) OpsManaged() { finalized = false; } // Implementation of the standard transfer method that takes into account the finalize flag. function transfer(address _to, uint256 _value) public returns (bool success) { checkTransferAllowed(msg.sender, _to); return super.transfer(_to, _value); } // Implementation of the standard transferFrom method that takes into account the finalize flag. function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { checkTransferAllowed(msg.sender, _to); return super.transferFrom(_from, _to, _value); } function checkTransferAllowed(address _sender, address _to) private view { if (finalized) { // Everybody should be ok to transfer once the token is finalized. return; } // Owner and Ops are allowed to transfer tokens before the sale is finalized. // This allows the tokens to move from the TokenSale contract to a beneficiary. // We also allow someone to send tokens back to the owner. This is useful among other // cases, for the Trustee to transfer unlocked tokens back to the owner (reclaimTokens). require(isOwnerOrOps(_sender) || _to == owner); } // Implement a burn function to permit msg.sender to reduce its balance // which also reduces tokenTotalSupply function burn(uint256 _value) public returns (bool success) { require(_value <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(_value); tokenTotalSupply = tokenTotalSupply.sub(_value); Burnt(msg.sender, _value); return true; } // Finalize method marks the point where token transfers are finally allowed for everybody. function finalize() external onlyAdmin returns (bool success) { require(!finalized); finalized = true; Finalized(); return true; } } // // Implements a simple trustee which can release tokens based on // an explicit call from the owner. // // // Permissions, according to the ST key management specification. // // Owner Admin Ops Revoke // grantAllocation x x // revokeAllocation x // processAllocation x // reclaimTokens x // setRevokeAddress x x // contract Trustee is OpsManaged { using SafeMath for uint256; SimpleToken public tokenContract; struct Allocation { uint256 amountGranted; uint256 amountTransferred; bool revokable; } // The trustee has a special 'revoke' key which is allowed to revoke allocations. address public revokeAddress; // Total number of tokens that are currently allocated. // This does not include tokens that have been processed (sent to an address) already or // the ones in the trustee's account that have not been allocated yet. uint256 public totalLocked; mapping (address => Allocation) public allocations; // // Events // event AllocationGranted(address indexed _from, address indexed _account, uint256 _amount, bool _revokable); event AllocationRevoked(address indexed _from, address indexed _account, uint256 _amountRevoked); event AllocationProcessed(address indexed _from, address indexed _account, uint256 _amount); event RevokeAddressChanged(address indexed _newAddress); event TokensReclaimed(uint256 _amount); function Trustee(SimpleToken _tokenContract) public OpsManaged() { require(address(_tokenContract) != address(0)); tokenContract = _tokenContract; } modifier onlyOwnerOrRevoke() { require(isOwner(msg.sender) || isRevoke(msg.sender)); _; } modifier onlyRevoke() { require(isRevoke(msg.sender)); _; } function isRevoke(address _address) private view returns (bool) { return (revokeAddress != address(0) && _address == revokeAddress); } // Owner and revoke can change the revoke address. Address can also be set to 0 to 'disable' it. function setRevokeAddress(address _revokeAddress) external onlyOwnerOrRevoke returns (bool) { require(_revokeAddress != owner); require(!isAdmin(_revokeAddress)); require(!isOps(_revokeAddress)); revokeAddress = _revokeAddress; RevokeAddressChanged(_revokeAddress); return true; } // Allows admin or ops to create new allocations for a specific account. function grantAllocation(address _account, uint256 _amount, bool _revokable) public onlyAdminOrOps returns (bool) { require(_account != address(0)); require(_account != address(this)); require(_amount > 0); // Can't create an allocation if there is already one for this account. require(allocations[_account].amountGranted == 0); if (isOps(msg.sender)) { // Once the token contract is finalized, the ops key should not be able to grant allocations any longer. // Before finalized, it is used by the TokenSale contract to allocate pre-sales. require(!tokenContract.finalized()); } totalLocked = totalLocked.add(_amount); require(totalLocked <= tokenContract.balanceOf(address(this))); allocations[_account] = Allocation({ amountGranted : _amount, amountTransferred : 0, revokable : _revokable }); AllocationGranted(msg.sender, _account, _amount, _revokable); return true; } // Allows the revoke key to revoke allocations, if revoke is allowed. function revokeAllocation(address _account) external onlyRevoke returns (bool) { require(_account != address(0)); Allocation memory allocation = allocations[_account]; require(allocation.revokable); uint256 ownerRefund = allocation.amountGranted.sub(allocation.amountTransferred); delete allocations[_account]; totalLocked = totalLocked.sub(ownerRefund); AllocationRevoked(msg.sender, _account, ownerRefund); return true; } // Push model which allows ops to transfer tokens to the beneficiary. // The exact amount to transfer is calculated based on agreements with // the beneficiaries. Here we only restrict that the total amount transfered cannot // exceed what has been granted. function processAllocation(address _account, uint256 _amount) external onlyOps returns (bool) { require(_account != address(0)); require(_amount > 0); Allocation storage allocation = allocations[_account]; require(allocation.amountGranted > 0); uint256 transferable = allocation.amountGranted.sub(allocation.amountTransferred); if (transferable < _amount) { return false; } allocation.amountTransferred = allocation.amountTransferred.add(_amount); // Note that transfer will fail if the token contract has not been finalized yet. require(tokenContract.transfer(_account, _amount)); totalLocked = totalLocked.sub(_amount); AllocationProcessed(msg.sender, _account, _amount); return true; } // Allows the admin to claim back all tokens that are not currently allocated. // Note that the trustee should be able to move tokens even before the token is // finalized because SimpleToken allows sending back to owner specifically. function reclaimTokens() external onlyAdmin returns (bool) { uint256 ownBalance = tokenContract.balanceOf(address(this)); // If balance <= amount locked, there is nothing to reclaim. require(ownBalance > totalLocked); uint256 amountReclaimed = ownBalance.sub(totalLocked); address tokenOwner = tokenContract.owner(); require(tokenOwner != address(0)); require(tokenContract.transfer(tokenOwner, amountReclaimed)); TokensReclaimed(amountReclaimed); return true; } } // ---------------------------------------------------------------------------- // Pausable Contract Implementation // // Copyright (c) 2017 OpenST Ltd. // https://simpletoken.org/ // // The MIT Licence. // // Based on the Pausable contract by the OpenZeppelin team. // Copyright (c) 2016 Smart Contract Solutions, Inc. // https://github.com/OpenZeppelin/zeppelin-solidity // The MIT License. // ---------------------------------------------------------------------------- contract Pausable is OpsManaged { event Pause(); event Unpause(); bool public paused = false; modifier whenNotPaused() { require(!paused); _; } modifier whenPaused() { require(paused); _; } function pause() public onlyAdmin whenNotPaused { paused = true; Pause(); } function unpause() public onlyAdmin whenPaused { paused = false; Unpause(); } } contract TokenSaleConfig is SimpleTokenConfig { uint256 public constant PHASE1_START_TIME = 1510664400; // 2017-11-14, 13:00:00 UTC uint256 public constant PHASE2_START_TIME = 1510750800; // 2017-11-15, 13:00:00 UTC uint256 public constant END_TIME = 1512133199; // 2017-12-01, 12:59:59 UTC uint256 public constant CONTRIBUTION_MIN = 0.1 ether; uint256 public constant CONTRIBUTION_MAX = 10000.0 ether; // This is the maximum number of tokens each individual account is allowed to // buy during Phase 1 of the token sale (whitelisted phase) // Calculated based on 300 USD/ETH * 10 ETH / 0.0833 USD / token = ~36,000 uint256 public constant PHASE1_ACCOUNT_TOKENS_MAX = 36000 * DECIMALSFACTOR; uint256 public constant TOKENS_SALE = 240000000 * DECIMALSFACTOR; uint256 public constant TOKENS_FOUNDERS = 80000000 * DECIMALSFACTOR; uint256 public constant TOKENS_ADVISORS = 80000000 * DECIMALSFACTOR; uint256 public constant TOKENS_EARLY_BACKERS = 44884831 * DECIMALSFACTOR; uint256 public constant TOKENS_ACCELERATOR = 217600000 * DECIMALSFACTOR; uint256 public constant TOKENS_FUTURE = 137515169 * DECIMALSFACTOR; // We use a default for when the contract is deployed but this can be changed afterwards // by calling the setTokensPerKEther function // For the public sale, tokens are priced at 0.0833 USD/token. // So if we have 300 USD/ETH -> 300,000 USD/KETH / 0.0833 USD/token = ~3,600,000 uint256 public constant TOKENS_PER_KETHER = 3600000; // Constant used by buyTokens as part of the cost <-> tokens conversion. // 18 for ETH -> WEI, TOKEN_DECIMALS (18 for Simple Token), 3 for the K in tokensPerKEther. uint256 public constant PURCHASE_DIVIDER = 10**(uint256(18) - TOKEN_DECIMALS + 3); } // // Implementation of the 1st token sale for Simple Token // // * Lifecycle * // Initialization sequence should be as follow: // 1. Deploy SimpleToken contract // 2. Deploy Trustee contract // 3. Deploy TokenSale contract // 4. Set operationsAddress of SimpleToken contract to TokenSale contract // 5. Set operationsAddress of Trustee contract to TokenSale contract // 6. Set operationsAddress of TokenSale contract to some address // 7. Transfer tokens from owner to TokenSale contract // 8. Transfer tokens from owner to Trustee contract // 9. Initialize TokenSale contract // // Pre-sale sequence: // - Set tokensPerKEther // - Set phase1AccountTokensMax // - Add presales // - Add allocations for founders, advisors, etc. // - Update whitelist // // After-sale sequence: // 1. Finalize the TokenSale contract // 2. Finalize the SimpleToken contract // 3. Set operationsAddress of TokenSale contract to 0 // 4. Set operationsAddress of SimpleToken contract to 0 // 5. Set operationsAddress of Trustee contract to some address // // Anytime // - Add/Remove allocations // // // Permissions, according to the ST key management specification. // // Owner Admin Ops // initialize x // changeWallet x // updateWhitelist x // setTokensPerKEther x // setPhase1AccountTokensMax x // addPresale x // pause / unpause x // reclaimTokens x // burnUnsoldTokens x // finalize x // contract TokenSale is OpsManaged, Pausable, TokenSaleConfig { // Pausable is also Owned using SafeMath for uint256; // We keep track of whether the sale has been finalized, at which point // no additional contributions will be permitted. bool public finalized; // The sale end time is initially defined by the END_TIME constant but it // may get extended if the sale is paused. uint256 public endTime; uint256 public pausedTime; // Number of tokens per 1000 ETH. See TokenSaleConfig for details. uint256 public tokensPerKEther; // Keeps track of the maximum amount of tokens that an account is allowed to purchase in phase 1. uint256 public phase1AccountTokensMax; // Address where the funds collected during the sale will be forwarded. address public wallet; // Token contract that the sale contract will interact with. SimpleToken public tokenContract; // Trustee contract to hold on token balances. The following token pools will be held by trustee: // - Founders // - Advisors // - Early investors // - Presales Trustee public trusteeContract; // Total amount of tokens sold during presale + public sale. Excludes pre-sale bonuses. uint256 public totalTokensSold; // Total amount of tokens given as bonus during presale. Will influence accelerator token balance. uint256 public totalPresaleBase; uint256 public totalPresaleBonus; // Map of addresses that have been whitelisted in advance (and passed KYC). // The whitelist value indicates what phase (1 or 2) the address has been whitelisted for. // Addresses whitelisted for phase 1 can also contribute during phase 2. mapping(address => uint8) public whitelist; // // EVENTS // event Initialized(); event PresaleAdded(address indexed _account, uint256 _baseTokens, uint256 _bonusTokens); event WhitelistUpdated(address indexed _account, uint8 _phase); event TokensPurchased(address indexed _beneficiary, uint256 _cost, uint256 _tokens, uint256 _totalSold); event TokensPerKEtherUpdated(uint256 _amount); event Phase1AccountTokensMaxUpdated(uint256 _tokens); event WalletChanged(address _newWallet); event TokensReclaimed(uint256 _amount); event UnsoldTokensBurnt(uint256 _amount); event Finalized(); function TokenSale(SimpleToken _tokenContract, Trustee _trusteeContract, address _wallet) public OpsManaged() { require(address(_tokenContract) != address(0)); require(address(_trusteeContract) != address(0)); require(_wallet != address(0)); require(PHASE1_START_TIME >= currentTime()); require(PHASE2_START_TIME > PHASE1_START_TIME); require(END_TIME > PHASE2_START_TIME); require(TOKENS_PER_KETHER > 0); require(PHASE1_ACCOUNT_TOKENS_MAX > 0); // Basic check that the constants add up to TOKENS_MAX uint256 partialAllocations = TOKENS_FOUNDERS.add(TOKENS_ADVISORS).add(TOKENS_EARLY_BACKERS); require(partialAllocations.add(TOKENS_SALE).add(TOKENS_ACCELERATOR).add(TOKENS_FUTURE) == TOKENS_MAX); wallet = _wallet; pausedTime = 0; endTime = END_TIME; finalized = false; tokensPerKEther = TOKENS_PER_KETHER; phase1AccountTokensMax = PHASE1_ACCOUNT_TOKENS_MAX; tokenContract = _tokenContract; trusteeContract = _trusteeContract; } // Initialize is called to check some configuration parameters. // It expects that a certain amount of tokens have already been assigned to the sale contract address. function initialize() external onlyOwner returns (bool) { require(totalTokensSold == 0); require(totalPresaleBase == 0); require(totalPresaleBonus == 0); uint256 ownBalance = tokenContract.balanceOf(address(this)); require(ownBalance == TOKENS_SALE); // Simple check to confirm that tokens are present uint256 trusteeBalance = tokenContract.balanceOf(address(trusteeContract)); require(trusteeBalance >= TOKENS_FUTURE); Initialized(); return true; } // Allows the admin to change the wallet where ETH contributions are sent. function changeWallet(address _wallet) external onlyAdmin returns (bool) { require(_wallet != address(0)); require(_wallet != address(this)); require(_wallet != address(trusteeContract)); require(_wallet != address(tokenContract)); wallet = _wallet; WalletChanged(wallet); return true; } // // TIME // function currentTime() public view returns (uint256 _currentTime) { return now; } modifier onlyBeforeSale() { require(hasSaleEnded() == false); require(currentTime() < PHASE1_START_TIME); _; } modifier onlyDuringSale() { require(hasSaleEnded() == false && currentTime() >= PHASE1_START_TIME); _; } modifier onlyAfterSale() { // require finalized is stronger than hasSaleEnded require(finalized); _; } function hasSaleEnded() private view returns (bool) { // if sold out or finalized, sale has ended if (totalTokensSold >= TOKENS_SALE || finalized) { return true; // else if sale is not paused (pausedTime = 0) // and endtime has past, then sale has ended } else if (pausedTime == 0 && currentTime() >= endTime) { return true; // otherwise it is not past and not paused; or paused // and as such not ended } else { return false; } } // // WHITELIST // // Allows ops to add accounts to the whitelist. // Only those accounts will be allowed to contribute during the sale. // _phase = 1: Can contribute during phases 1 and 2 of the sale. // _phase = 2: Can contribute during phase 2 of the sale only. // _phase = 0: Cannot contribute at all (not whitelisted). function updateWhitelist(address _account, uint8 _phase) external onlyOps returns (bool) { require(_account != address(0)); require(_phase <= 2); require(!hasSaleEnded()); whitelist[_account] = _phase; WhitelistUpdated(_account, _phase); return true; } // // PURCHASES / CONTRIBUTIONS // // Allows the admin to set the price for tokens sold during phases 1 and 2 of the sale. function setTokensPerKEther(uint256 _tokensPerKEther) external onlyAdmin onlyBeforeSale returns (bool) { require(_tokensPerKEther > 0); tokensPerKEther = _tokensPerKEther; TokensPerKEtherUpdated(_tokensPerKEther); return true; } // Allows the admin to set the maximum amount of tokens that an account can buy during phase 1 of the sale. function setPhase1AccountTokensMax(uint256 _tokens) external onlyAdmin onlyBeforeSale returns (bool) { require(_tokens > 0); phase1AccountTokensMax = _tokens; Phase1AccountTokensMaxUpdated(_tokens); return true; } function () external payable whenNotPaused onlyDuringSale { buyTokens(); } // This is the main function to process incoming ETH contributions. function buyTokens() public payable whenNotPaused onlyDuringSale returns (bool) { require(msg.value >= CONTRIBUTION_MIN); require(msg.value <= CONTRIBUTION_MAX); require(totalTokensSold < TOKENS_SALE); // All accounts need to be whitelisted to purchase. uint8 whitelistedPhase = whitelist[msg.sender]; require(whitelistedPhase > 0); uint256 tokensMax = TOKENS_SALE.sub(totalTokensSold); if (currentTime() < PHASE2_START_TIME) { // We are in phase 1 of the sale require(whitelistedPhase == 1); uint256 accountBalance = tokenContract.balanceOf(msg.sender); // Can only purchase up to a maximum per account. // Calculate how much of that amount is still available. uint256 phase1Balance = phase1AccountTokensMax.sub(accountBalance); if (phase1Balance < tokensMax) { tokensMax = phase1Balance; } } require(tokensMax > 0); uint256 tokensBought = msg.value.mul(tokensPerKEther).div(PURCHASE_DIVIDER); require(tokensBought > 0); uint256 cost = msg.value; uint256 refund = 0; if (tokensBought > tokensMax) { // Not enough tokens available for full contribution, we will do partial. tokensBought = tokensMax; // Calculate actual cost for partial amount of tokens. cost = tokensBought.mul(PURCHASE_DIVIDER).div(tokensPerKEther); // Calculate refund for contributor. refund = msg.value.sub(cost); } totalTokensSold = totalTokensSold.add(tokensBought); // Transfer tokens to the account require(tokenContract.transfer(msg.sender, tokensBought)); // Issue a ETH refund for any unused portion of the funds. if (refund > 0) { msg.sender.transfer(refund); } // Transfer the contribution to the wallet wallet.transfer(msg.value.sub(refund)); TokensPurchased(msg.sender, cost, tokensBought, totalTokensSold); // If all tokens available for sale have been sold out, finalize the sale automatically. if (totalTokensSold == TOKENS_SALE) { finalizeInternal(); } return true; } // // PRESALES // // Allows the admin to record pre-sales, before the public sale starts. Presale base tokens come out of the // main sale pool (the 30% allocation) while bonus tokens come from the remaining token pool. function addPresale(address _account, uint256 _baseTokens, uint256 _bonusTokens) external onlyAdmin onlyBeforeSale returns (bool) { require(_account != address(0)); // Presales may have 0 bonus tokens but need to have a base amount of tokens sold. require(_baseTokens > 0); require(_bonusTokens < _baseTokens); // We do not count bonus tokens as part of the sale cap. totalTokensSold = totalTokensSold.add(_baseTokens); require(totalTokensSold <= TOKENS_SALE); uint256 ownBalance = tokenContract.balanceOf(address(this)); require(_baseTokens <= ownBalance); totalPresaleBase = totalPresaleBase.add(_baseTokens); totalPresaleBonus = totalPresaleBonus.add(_bonusTokens); // Move base tokens to the trustee require(tokenContract.transfer(address(trusteeContract), _baseTokens)); // Presale allocations are marked as locked, they cannot be removed by the owner. uint256 tokens = _baseTokens.add(_bonusTokens); require(trusteeContract.grantAllocation(_account, tokens, false /* revokable */)); PresaleAdded(_account, _baseTokens, _bonusTokens); return true; } // // PAUSE / UNPAUSE // // Allows the owner or admin to pause the sale for any reason. function pause() public onlyAdmin whenNotPaused { require(hasSaleEnded() == false); pausedTime = currentTime(); return super.pause(); } // Unpause may extend the end time of the public sale. // Note that we do not extend the start time of each phase. // Currently does not extend phase 1 end time, only final end time. function unpause() public onlyAdmin whenPaused { // If owner unpauses before sale starts, no impact on end time. uint256 current = currentTime(); // If owner unpauses after sale starts, calculate how to extend end. if (current > PHASE1_START_TIME) { uint256 timeDelta; if (pausedTime < PHASE1_START_TIME) { // Pause was triggered before the start time, extend by time that // passed from proposed start time until now. timeDelta = current.sub(PHASE1_START_TIME); } else { // Pause was triggered while the sale was already started. // Extend end time by amount of time since pause. timeDelta = current.sub(pausedTime); } endTime = endTime.add(timeDelta); } pausedTime = 0; return super.unpause(); } // Allows the admin to move bonus tokens still available in the sale contract // out before burning all remaining unsold tokens in burnUnsoldTokens(). // Used to distribute bonuses to token sale participants when the sale has ended // and all bonuses are known. function reclaimTokens(uint256 _amount) external onlyAfterSale onlyAdmin returns (bool) { uint256 ownBalance = tokenContract.balanceOf(address(this)); require(_amount <= ownBalance); address tokenOwner = tokenContract.owner(); require(tokenOwner != address(0)); require(tokenContract.transfer(tokenOwner, _amount)); TokensReclaimed(_amount); return true; } // Allows the admin to burn all unsold tokens in the sale contract. function burnUnsoldTokens() external onlyAfterSale onlyAdmin returns (bool) { uint256 ownBalance = tokenContract.balanceOf(address(this)); require(tokenContract.burn(ownBalance)); UnsoldTokensBurnt(ownBalance); return true; } // Allows the admin to finalize the sale and complete allocations. // The SimpleToken.admin also needs to finalize the token contract // so that token transfers are enabled. function finalize() external onlyAdmin returns (bool) { return finalizeInternal(); } // The internal one will be called if tokens are sold out or // the end time for the sale is reached, in addition to being called // from the public version of finalize(). function finalizeInternal() private returns (bool) { require(!finalized); finalized = true; Finalized(); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"PHASE1_START_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokensPerKEther","type":"uint256"}],"name":"setTokensPerKEther","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PURCHASE_DIVIDER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRIBUTION_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_ACCELERATOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPresaleBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_adminAddress","type":"address"}],"name":"setAdminAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_SALE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PHASE2_START_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_phase","type":"uint8"}],"name":"updateWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"uint256"}],"name":"setPhase1AccountTokensMax","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_EARLY_BACKERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_baseTokens","type":"uint256"},{"name":"_bonusTokens","type":"uint256"}],"name":"addPresale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_opsAddress","type":"address"}],"name":"setOpsAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"reclaimTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DECIMALSFACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"burnUnsoldTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"changeWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_ADVISORS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPresaleBase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensPerKEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PHASE1_ACCOUNT_TOKENS_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pausedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRIBUTION_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trusteeContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposedOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"buyTokens","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"proposedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentTime","outputs":[{"name":"_currentTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"phase1AccountTokensMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_PER_KETHER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_FOUNDERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKENS_FUTURE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_trusteeContract","type":"address"},{"name":"_wallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"},{"indexed":false,"name":"_baseTokens","type":"uint256"},{"indexed":false,"name":"_bonusTokens","type":"uint256"}],"name":"PresaleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"},{"indexed":false,"name":"_phase","type":"uint8"}],"name":"WhitelistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_beneficiary","type":"address"},{"indexed":false,"name":"_cost","type":"uint256"},{"indexed":false,"name":"_tokens","type":"uint256"},{"indexed":false,"name":"_totalSold","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensPerKEtherUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_tokens","type":"uint256"}],"name":"Phase1AccountTokensMaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newWallet","type":"address"}],"name":"WalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensReclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"UnsoldTokensBurnt","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":"_newAddress","type":"address"}],"name":"AdminAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newAddress","type":"address"}],"name":"OpsAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_proposedOwner","type":"address"}],"name":"OwnershipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnershipTransferCompleted","type":"event"}]
Contract Creation Code
60606040526003805460a060020a60ff021916905534156200002057600080fd5b6040516060806200207383398101604052808051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911782559193509150841615156200007557600080fd5b600160a060020a03831615156200008b57600080fd5b600160a060020a0382161515620000a157600080fd5b620000b96401000000006200081e620001e482021704565b635a0ae8d01015620000ca57600080fd5b620001146a2520bb90685948ca1c0000620000ff6a422ca8b0a00a42500000008064010000000062001c52620001e882021704565b9064010000000062001c52620001e882021704565b90506b0295be96e640669720000000620001656a71bff83fbcdcd385e40000620000ff6ab3fe97a2fafd2f4000000081866ac685fa11e01ec6f000000064010000000062001c52620001e882021704565b146200017057600080fd5b5060088054600160a060020a0319908116600160a060020a03938416179091556000600555635a21524f6004556003805460a860020a60ff02191690556236ee8060065569079f905c6fd34e80000060075560098054821694831694909417909355600a80549093169116179055620001ff565b4290565b600082820183811015620001f857fe5b9392505050565b611e64806200020f6000396000f3006060604052600436106102635763ffffffff60e060020a6000350416630e4d591981146102b05780630e9d02cc146102d557806317393f04146102ff57806318821400146103125780631a2309f01461039c57806322bcabcd146103af5780632820d6a5146103c25780632a905318146103d55780632c1e816d146103e85780633197cbb6146104075780633280922b1461041a57806336484ea01461042d57806337ba682d146104405780633f4ba83a146104535780634bb278f3146104685780634d399cb31461047b578063521eb273146104a057806355a373d6146104cf5780635b7f415c146104e25780635c975abb1461050b57806363b201171461051e57806369a68f5f1461053157806369be51bb1461054757806369d0292d1461055a578063707789c51461057f5780637760da7f1461059e5780638129fc1c146105b45780638456cb59146105c75780638bc04eb7146105da5780638da5cb5b146105ed5780638ea6437614610600578063940bb3441461061357806398b9a2dc146106265780639978be95146106455780639b19251a14610658578063a09b7e2b14610677578063a5bc770c1461068a578063a67e91a81461069d578063a6e53b99146106b0578063b2cca39d146106c3578063b3f05b97146106d6578063ba9bb827146106e9578063bb133331146106fc578063c0b6f5611461070f578063d0febe4c1461072e578063d153b60c14610736578063d18e81b314610749578063e71a78111461075c578063e87a9d841461076f578063f527c85614610782578063f653279c14610645578063f92c9b4714610795578063fc6f9468146107a8575b60035460a060020a900460ff161561027a57600080fd5b6102826107bb565b15801561029a5750635a0ae8d061029761081e565b10155b15156102a557600080fd5b6102ad610822565b50005b34156102bb57600080fd5b6102c3610bdb565b60405190815260200160405180910390f35b34156102e057600080fd5b6102eb600435610be3565b604051901515815260200160405180910390f35b341561030a57600080fd5b6102c3610c6f565b341561031d57600080fd5b610325610c75565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610361578082015183820152602001610349565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6102c3610cac565b34156103ba57600080fd5b6102c3610cba565b34156103cd57600080fd5b6102c3610cc9565b34156103e057600080fd5b610325610ccf565b34156103f357600080fd5b6102eb600160a060020a0360043516610d06565b341561041257600080fd5b6102c3610dd9565b341561042557600080fd5b6102c3610ddf565b341561043857600080fd5b6102c3610dee565b341561044b57600080fd5b6102c3610df6565b341561045e57600080fd5b610466610dfe565b005b341561047357600080fd5b6102eb610eab565b341561048657600080fd5b6102eb600160a060020a036004351660ff60243516610ece565b34156104ab57600080fd5b6104b3610f83565b604051600160a060020a03909116815260200160405180910390f35b34156104da57600080fd5b6104b3610f92565b34156104ed57600080fd5b6104f5610fa1565b60405160ff909116815260200160405180910390f35b341561051657600080fd5b6102eb610fa6565b341561052957600080fd5b6102c3610fb6565b341561053c57600080fd5b6102eb600435610fbc565b341561055257600080fd5b6102c3611048565b341561056557600080fd5b6102eb600160a060020a0360043516602435604435611057565b341561058a57600080fd5b6102eb600160a060020a0360043516611324565b34156105a957600080fd5b6102eb6004356113f7565b34156105bf57600080fd5b6102eb6115e8565b34156105d257600080fd5b61046661177d565b34156105e557600080fd5b6102c36117cf565b34156105f857600080fd5b6104b36117db565b341561060b57600080fd5b6104b36117ea565b341561061e57600080fd5b6102eb6117f9565b341561063157600080fd5b6102eb600160a060020a0360043516611953565b341561065057600080fd5b6102c3611a49565b341561066357600080fd5b6104f5600160a060020a0360043516611a58565b341561068257600080fd5b6102c3611a6d565b341561069557600080fd5b6102c3611a73565b34156106a857600080fd5b6102c3611a79565b34156106bb57600080fd5b6102c3611a89565b34156106ce57600080fd5b6102c3611a97565b34156106e157600080fd5b6102eb611a9d565b34156106f457600080fd5b6102c3611aad565b341561070757600080fd5b6104b3611ab9565b341561071a57600080fd5b6102eb600160a060020a0360043516611ac8565b6102eb610822565b341561074157600080fd5b6104b3611b3d565b341561075457600080fd5b6102c361081e565b341561076757600080fd5b6102eb611b4c565b341561077a57600080fd5b6102c3611bd3565b341561078d57600080fd5b6102c3611bd9565b34156107a057600080fd5b6102c3611be0565b34156107b357600080fd5b6104b3611bef565b600b546000906ac685fa11e01ec6f0000000901015806107e4575060035460a860020a900460ff165b156107f15750600161081b565b60055415801561080a575060045461080761081e565b10155b156108175750600161081b565b5060005b90565b4290565b600080600080600080600080600360149054906101000a900460ff1615151561084a57600080fd5b6108526107bb565b15801561086a5750635a0ae8d061086761081e565b10155b151561087557600080fd5b67016345785d8a000034101561088a57600080fd5b69021e19e0c9bab24000003411156108a157600080fd5b600b546ac685fa11e01ec6f000000090106108bb57600080fd5b600160a060020a0333166000908152600e602052604081205460ff16975087116108e457600080fd5b600b54610903906ac685fa11e01ec6f00000009063ffffffff611bfe16565b9550635a0c3a5061091261081e565b10156109bf57600160ff88161461092857600080fd5b600954600160a060020a03166370a082313360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561098157600080fd5b6102c65a03f1151561099257600080fd5b50505060405180516007549096506109b191508663ffffffff611bfe16565b9350858410156109bf578395505b600086116109cc57600080fd5b6006546109f4906103e8906109e890349063ffffffff611c1016565b9063ffffffff611c3b16565b925060008311610a0357600080fd5b50349050600085831115610a4257600654869350610a2d906109e8856103e863ffffffff611c1016565b9150610a3f348363ffffffff611bfe16565b90505b600b54610a55908463ffffffff611c5216565b600b55600954600160a060020a031663a9059cbb338560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ab757600080fd5b6102c65a03f11515610ac857600080fd5b505050604051805190501515610add57600080fd5b6000811115610b1757600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610b1757600080fd5b600854600160a060020a03166108fc610b36348463ffffffff611bfe16565b9081150290604051600060405180830381858888f193505050501515610b5b57600080fd5b33600160a060020a03167f0d1a0d5e3d583a0e92588799dd06e50fd78c07daf05f0cc06d7b848b1ca445f18385600b5460405180848152602001838152602001828152602001935050505060405180910390a2600b546ac685fa11e01ec6f00000001415610bcd57610bcb611c61565b505b600197505050505050505090565b635a0ae8d081565b6000610bee33611cd2565b1515610bf957600080fd5b610c016107bb565b15610c0b57600080fd5b635a0ae8d0610c1861081e565b10610c2257600080fd5b60008211610c2f57600080fd5b60068290557fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab8260405190815260200160405180910390a1506001919050565b6103e881565b60408051908101604052600c81527f53696d706c6520546f6b656e0000000000000000000000000000000000000000602082015281565b69021e19e0c9bab240000081565b6ab3fe97a2fafd2f4000000081565b600d5481565b60408051908101604052600281527f5354000000000000000000000000000000000000000000000000000000000000602082015281565b6000610d1133611d02565b80610d205750610d2033611cd2565b1515610d2b57600080fd5b600054600160a060020a0383811691161415610d4657600080fd5b30600160a060020a031682600160a060020a031614151515610d6757600080fd5b610d7082611d16565b15610d7a57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557f17bb0532ac84902a52bb6799529153f5ea501fc54fbcf3ea00dbd42bceb6b0f460405160405180910390a2506001919050565b60045481565b6ac685fa11e01ec6f000000081565b635a0c3a5081565b635a21524f81565b600080610e0a33611cd2565b1515610e1557600080fd5b60035460a060020a900460ff161515610e2d57600080fd5b610e3561081e565b9150635a0ae8d0821115610e9a57635a0ae8d06005541015610e6c57610e6582635a0ae8d063ffffffff611bfe16565b9050610e83565b600554610e8090839063ffffffff611bfe16565b90505b600454610e96908263ffffffff611c5216565b6004555b6000600555610ea7611d43565b5050565b6000610eb633611cd2565b1515610ec157600080fd5b610ec9611c61565b905090565b6000610ed933611d16565b1515610ee457600080fd5b600160a060020a0383161515610ef957600080fd5b600260ff83161115610f0a57600080fd5b610f126107bb565b15610f1c57600080fd5b600160a060020a0383166000818152600e602052604090819020805460ff191660ff86161790557f7ed18aa59a2962897d3e7ed3da887dfb6a03cca6c3cfe8d74e55130f631791c89084905160ff909116815260200160405180910390a250600192915050565b600854600160a060020a031681565b600954600160a060020a031681565b601281565b60035460a060020a900460ff1681565b600b5481565b6000610fc733611cd2565b1515610fd257600080fd5b610fda6107bb565b15610fe457600080fd5b635a0ae8d0610ff161081e565b10610ffb57600080fd5b6000821161100857600080fd5b60078290557f744598cd73b148cd670bce32eb1ef87a62ed5b38792946e86f562d0860213ed48260405190815260200160405180910390a1506001919050565b6a2520bb90685948ca1c000081565b600080600061106533611cd2565b151561107057600080fd5b6110786107bb565b1561108257600080fd5b635a0ae8d061108f61081e565b1061109957600080fd5b600160a060020a03861615156110ae57600080fd5b600085116110bb57600080fd5b8484106110c757600080fd5b600b546110da908663ffffffff611c5216565b600b8190556ac685fa11e01ec6f00000009011156110f757600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561115057600080fd5b6102c65a03f1151561116157600080fd5b50505060405180519250508185111561117957600080fd5b600c5461118c908663ffffffff611c5216565b600c55600d546111a2908563ffffffff611c5216565b600d55600954600a54600160a060020a039182169163a9059cbb91168760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561120b57600080fd5b6102c65a03f1151561121c57600080fd5b50505060405180519050151561123157600080fd5b611241858563ffffffff611c5216565b600a54909150600160a060020a03166395c8d4ee87836000806040516020015260405160e060020a63ffffffff8616028152600160a060020a039093166004840152602483019190915215156044820152606401602060405180830381600087803b15156112ae57600080fd5b6102c65a03f115156112bf57600080fd5b5050506040518051905015156112d457600080fd5b85600160a060020a03167ffdd0298ea259dd9c953110328b22720e53774c2027c9667a5b275dc5e460cb12868660405191825260208201526040908101905180910390a250600195945050505050565b600061132f33611d02565b8061133e575061133e33611cd2565b151561134957600080fd5b600054600160a060020a038381169116141561136457600080fd5b30600160a060020a031682600160a060020a03161415151561138557600080fd5b61138e82611cd2565b1561139857600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557fac46a4511b8366ae3b7cf3cf342e31556274975598dcae03c866f8f0f55d51c460405160405180910390a2506001919050565b6000806000600360159054906101000a900460ff16151561141757600080fd5b61142033611cd2565b151561142b57600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561148457600080fd5b6102c65a03f1151561149557600080fd5b5050506040518051925050818411156114ad57600080fd5b600954600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156114f557600080fd5b6102c65a03f1151561150657600080fd5b5050506040518051915050600160a060020a038116151561152657600080fd5b600954600160a060020a031663a9059cbb828660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b7fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8460405190815260200160405180910390a15060019392505050565b60008060006115f633611d02565b151561160157600080fd5b600b541561160e57600080fd5b600c541561161b57600080fd5b600d541561162857600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561168157600080fd5b6102c65a03f1151561169257600080fd5b50505060405180519250506ac685fa11e01ec6f000000082146116b457600080fd5b600954600a54600160a060020a03918216916370a08231911660006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561171457600080fd5b6102c65a03f1151561172557600080fd5b50505060405180519150506a71bff83fbcdcd385e4000081101561174857600080fd5b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a160019250505090565b61178633611cd2565b151561179157600080fd5b60035460a060020a900460ff16156117a857600080fd5b6117b06107bb565b156117ba57600080fd5b6117c261081e565b6005556117cd611dbb565b565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b600354600090819060a860020a900460ff16151561181657600080fd5b61181f33611cd2565b151561182a57600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561188357600080fd5b6102c65a03f1151561189457600080fd5b5050506040518051600954909250600160a060020a031690506342966c688260006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156118f257600080fd5b6102c65a03f1151561190357600080fd5b50505060405180519050151561191857600080fd5b7f8a18a804523143af3d2399b3fdf76bf116e01d31987f8e774d8f1282f013cb7e8160405190815260200160405180910390a1600191505090565b600061195e33611cd2565b151561196957600080fd5b600160a060020a038216151561197e57600080fd5b30600160a060020a031682600160a060020a03161415151561199f57600080fd5b600a54600160a060020a03838116911614156119ba57600080fd5b600954600160a060020a03838116911614156119d557600080fd5b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290557f3ce716f94fe275e52428cbf6b7f388e5a65976d4edabc34355a77f5e89655bdc9116604051600160a060020a03909116815260200160405180910390a1506001919050565b6a422ca8b0a00a425000000081565b600e6020526000908152604090205460ff1681565b600c5481565b60065481565b6b0295be96e64066972000000081565b69079f905c6fd34e80000081565b60055481565b60035460a860020a900460ff1681565b67016345785d8a000081565b600a54600160a060020a031681565b6000611ad333611d02565b1515611ade57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b600154600160a060020a031681565b60015460009033600160a060020a03908116911614611b6a57600080fd5b6001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617928390559216909255167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b60075481565b6236ee8081565b6a71bff83fbcdcd385e4000081565b600354600160a060020a031681565b600082821115611c0a57fe5b50900390565b6000828202831580611c2c5750828482811515611c2957fe5b04145b1515611c3457fe5b9392505050565b6000808284811515611c4957fe5b04949350505050565b600082820183811015611c3457fe5b60035460009060a860020a900460ff1615611c7b57600080fd5b6003805475ff000000000000000000000000000000000000000000191660a860020a1790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b600354600090600160a060020a031615801590611cfc5750600354600160a060020a038381169116145b92915050565b600054600160a060020a0390811691161490565b600254600090600160a060020a031615801590611cfc575050600254600160a060020a0390811691161490565b611d4c33611cd2565b1515611d5757600080fd5b60035460a060020a900460ff161515611d6f57600080fd5b6003805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b611dc433611cd2565b1515611dcf57600080fd5b60035460a060020a900460ff1615611de657600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a15600a165627a7a72305820d70335dbd36e2892b2e69a9407bafe127794d39bc50a6ce104a0561861dad2e200290000000000000000000000002c4e8f2d746113d0696ce89b35f0d8bf88e0aeca0000000000000000000000004288f043370910c923f7a600526ca8064da05d0d0000000000000000000000002ef2782905830533d218b7ff4d15b8c0981ce84b
Deployed Bytecode
0x6060604052600436106102635763ffffffff60e060020a6000350416630e4d591981146102b05780630e9d02cc146102d557806317393f04146102ff57806318821400146103125780631a2309f01461039c57806322bcabcd146103af5780632820d6a5146103c25780632a905318146103d55780632c1e816d146103e85780633197cbb6146104075780633280922b1461041a57806336484ea01461042d57806337ba682d146104405780633f4ba83a146104535780634bb278f3146104685780634d399cb31461047b578063521eb273146104a057806355a373d6146104cf5780635b7f415c146104e25780635c975abb1461050b57806363b201171461051e57806369a68f5f1461053157806369be51bb1461054757806369d0292d1461055a578063707789c51461057f5780637760da7f1461059e5780638129fc1c146105b45780638456cb59146105c75780638bc04eb7146105da5780638da5cb5b146105ed5780638ea6437614610600578063940bb3441461061357806398b9a2dc146106265780639978be95146106455780639b19251a14610658578063a09b7e2b14610677578063a5bc770c1461068a578063a67e91a81461069d578063a6e53b99146106b0578063b2cca39d146106c3578063b3f05b97146106d6578063ba9bb827146106e9578063bb133331146106fc578063c0b6f5611461070f578063d0febe4c1461072e578063d153b60c14610736578063d18e81b314610749578063e71a78111461075c578063e87a9d841461076f578063f527c85614610782578063f653279c14610645578063f92c9b4714610795578063fc6f9468146107a8575b60035460a060020a900460ff161561027a57600080fd5b6102826107bb565b15801561029a5750635a0ae8d061029761081e565b10155b15156102a557600080fd5b6102ad610822565b50005b34156102bb57600080fd5b6102c3610bdb565b60405190815260200160405180910390f35b34156102e057600080fd5b6102eb600435610be3565b604051901515815260200160405180910390f35b341561030a57600080fd5b6102c3610c6f565b341561031d57600080fd5b610325610c75565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610361578082015183820152602001610349565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6102c3610cac565b34156103ba57600080fd5b6102c3610cba565b34156103cd57600080fd5b6102c3610cc9565b34156103e057600080fd5b610325610ccf565b34156103f357600080fd5b6102eb600160a060020a0360043516610d06565b341561041257600080fd5b6102c3610dd9565b341561042557600080fd5b6102c3610ddf565b341561043857600080fd5b6102c3610dee565b341561044b57600080fd5b6102c3610df6565b341561045e57600080fd5b610466610dfe565b005b341561047357600080fd5b6102eb610eab565b341561048657600080fd5b6102eb600160a060020a036004351660ff60243516610ece565b34156104ab57600080fd5b6104b3610f83565b604051600160a060020a03909116815260200160405180910390f35b34156104da57600080fd5b6104b3610f92565b34156104ed57600080fd5b6104f5610fa1565b60405160ff909116815260200160405180910390f35b341561051657600080fd5b6102eb610fa6565b341561052957600080fd5b6102c3610fb6565b341561053c57600080fd5b6102eb600435610fbc565b341561055257600080fd5b6102c3611048565b341561056557600080fd5b6102eb600160a060020a0360043516602435604435611057565b341561058a57600080fd5b6102eb600160a060020a0360043516611324565b34156105a957600080fd5b6102eb6004356113f7565b34156105bf57600080fd5b6102eb6115e8565b34156105d257600080fd5b61046661177d565b34156105e557600080fd5b6102c36117cf565b34156105f857600080fd5b6104b36117db565b341561060b57600080fd5b6104b36117ea565b341561061e57600080fd5b6102eb6117f9565b341561063157600080fd5b6102eb600160a060020a0360043516611953565b341561065057600080fd5b6102c3611a49565b341561066357600080fd5b6104f5600160a060020a0360043516611a58565b341561068257600080fd5b6102c3611a6d565b341561069557600080fd5b6102c3611a73565b34156106a857600080fd5b6102c3611a79565b34156106bb57600080fd5b6102c3611a89565b34156106ce57600080fd5b6102c3611a97565b34156106e157600080fd5b6102eb611a9d565b34156106f457600080fd5b6102c3611aad565b341561070757600080fd5b6104b3611ab9565b341561071a57600080fd5b6102eb600160a060020a0360043516611ac8565b6102eb610822565b341561074157600080fd5b6104b3611b3d565b341561075457600080fd5b6102c361081e565b341561076757600080fd5b6102eb611b4c565b341561077a57600080fd5b6102c3611bd3565b341561078d57600080fd5b6102c3611bd9565b34156107a057600080fd5b6102c3611be0565b34156107b357600080fd5b6104b3611bef565b600b546000906ac685fa11e01ec6f0000000901015806107e4575060035460a860020a900460ff165b156107f15750600161081b565b60055415801561080a575060045461080761081e565b10155b156108175750600161081b565b5060005b90565b4290565b600080600080600080600080600360149054906101000a900460ff1615151561084a57600080fd5b6108526107bb565b15801561086a5750635a0ae8d061086761081e565b10155b151561087557600080fd5b67016345785d8a000034101561088a57600080fd5b69021e19e0c9bab24000003411156108a157600080fd5b600b546ac685fa11e01ec6f000000090106108bb57600080fd5b600160a060020a0333166000908152600e602052604081205460ff16975087116108e457600080fd5b600b54610903906ac685fa11e01ec6f00000009063ffffffff611bfe16565b9550635a0c3a5061091261081e565b10156109bf57600160ff88161461092857600080fd5b600954600160a060020a03166370a082313360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561098157600080fd5b6102c65a03f1151561099257600080fd5b50505060405180516007549096506109b191508663ffffffff611bfe16565b9350858410156109bf578395505b600086116109cc57600080fd5b6006546109f4906103e8906109e890349063ffffffff611c1016565b9063ffffffff611c3b16565b925060008311610a0357600080fd5b50349050600085831115610a4257600654869350610a2d906109e8856103e863ffffffff611c1016565b9150610a3f348363ffffffff611bfe16565b90505b600b54610a55908463ffffffff611c5216565b600b55600954600160a060020a031663a9059cbb338560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610ab757600080fd5b6102c65a03f11515610ac857600080fd5b505050604051805190501515610add57600080fd5b6000811115610b1757600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610b1757600080fd5b600854600160a060020a03166108fc610b36348463ffffffff611bfe16565b9081150290604051600060405180830381858888f193505050501515610b5b57600080fd5b33600160a060020a03167f0d1a0d5e3d583a0e92588799dd06e50fd78c07daf05f0cc06d7b848b1ca445f18385600b5460405180848152602001838152602001828152602001935050505060405180910390a2600b546ac685fa11e01ec6f00000001415610bcd57610bcb611c61565b505b600197505050505050505090565b635a0ae8d081565b6000610bee33611cd2565b1515610bf957600080fd5b610c016107bb565b15610c0b57600080fd5b635a0ae8d0610c1861081e565b10610c2257600080fd5b60008211610c2f57600080fd5b60068290557fee386bebbe46d39825c2b93313aa1ab1dc57d4774cac81c6debb8c611c9227ab8260405190815260200160405180910390a1506001919050565b6103e881565b60408051908101604052600c81527f53696d706c6520546f6b656e0000000000000000000000000000000000000000602082015281565b69021e19e0c9bab240000081565b6ab3fe97a2fafd2f4000000081565b600d5481565b60408051908101604052600281527f5354000000000000000000000000000000000000000000000000000000000000602082015281565b6000610d1133611d02565b80610d205750610d2033611cd2565b1515610d2b57600080fd5b600054600160a060020a0383811691161415610d4657600080fd5b30600160a060020a031682600160a060020a031614151515610d6757600080fd5b610d7082611d16565b15610d7a57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557f17bb0532ac84902a52bb6799529153f5ea501fc54fbcf3ea00dbd42bceb6b0f460405160405180910390a2506001919050565b60045481565b6ac685fa11e01ec6f000000081565b635a0c3a5081565b635a21524f81565b600080610e0a33611cd2565b1515610e1557600080fd5b60035460a060020a900460ff161515610e2d57600080fd5b610e3561081e565b9150635a0ae8d0821115610e9a57635a0ae8d06005541015610e6c57610e6582635a0ae8d063ffffffff611bfe16565b9050610e83565b600554610e8090839063ffffffff611bfe16565b90505b600454610e96908263ffffffff611c5216565b6004555b6000600555610ea7611d43565b5050565b6000610eb633611cd2565b1515610ec157600080fd5b610ec9611c61565b905090565b6000610ed933611d16565b1515610ee457600080fd5b600160a060020a0383161515610ef957600080fd5b600260ff83161115610f0a57600080fd5b610f126107bb565b15610f1c57600080fd5b600160a060020a0383166000818152600e602052604090819020805460ff191660ff86161790557f7ed18aa59a2962897d3e7ed3da887dfb6a03cca6c3cfe8d74e55130f631791c89084905160ff909116815260200160405180910390a250600192915050565b600854600160a060020a031681565b600954600160a060020a031681565b601281565b60035460a060020a900460ff1681565b600b5481565b6000610fc733611cd2565b1515610fd257600080fd5b610fda6107bb565b15610fe457600080fd5b635a0ae8d0610ff161081e565b10610ffb57600080fd5b6000821161100857600080fd5b60078290557f744598cd73b148cd670bce32eb1ef87a62ed5b38792946e86f562d0860213ed48260405190815260200160405180910390a1506001919050565b6a2520bb90685948ca1c000081565b600080600061106533611cd2565b151561107057600080fd5b6110786107bb565b1561108257600080fd5b635a0ae8d061108f61081e565b1061109957600080fd5b600160a060020a03861615156110ae57600080fd5b600085116110bb57600080fd5b8484106110c757600080fd5b600b546110da908663ffffffff611c5216565b600b8190556ac685fa11e01ec6f00000009011156110f757600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561115057600080fd5b6102c65a03f1151561116157600080fd5b50505060405180519250508185111561117957600080fd5b600c5461118c908663ffffffff611c5216565b600c55600d546111a2908563ffffffff611c5216565b600d55600954600a54600160a060020a039182169163a9059cbb91168760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561120b57600080fd5b6102c65a03f1151561121c57600080fd5b50505060405180519050151561123157600080fd5b611241858563ffffffff611c5216565b600a54909150600160a060020a03166395c8d4ee87836000806040516020015260405160e060020a63ffffffff8616028152600160a060020a039093166004840152602483019190915215156044820152606401602060405180830381600087803b15156112ae57600080fd5b6102c65a03f115156112bf57600080fd5b5050506040518051905015156112d457600080fd5b85600160a060020a03167ffdd0298ea259dd9c953110328b22720e53774c2027c9667a5b275dc5e460cb12868660405191825260208201526040908101905180910390a250600195945050505050565b600061132f33611d02565b8061133e575061133e33611cd2565b151561134957600080fd5b600054600160a060020a038381169116141561136457600080fd5b30600160a060020a031682600160a060020a03161415151561138557600080fd5b61138e82611cd2565b1561139857600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557fac46a4511b8366ae3b7cf3cf342e31556274975598dcae03c866f8f0f55d51c460405160405180910390a2506001919050565b6000806000600360159054906101000a900460ff16151561141757600080fd5b61142033611cd2565b151561142b57600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561148457600080fd5b6102c65a03f1151561149557600080fd5b5050506040518051925050818411156114ad57600080fd5b600954600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156114f557600080fd5b6102c65a03f1151561150657600080fd5b5050506040518051915050600160a060020a038116151561152657600080fd5b600954600160a060020a031663a9059cbb828660006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b7fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8460405190815260200160405180910390a15060019392505050565b60008060006115f633611d02565b151561160157600080fd5b600b541561160e57600080fd5b600c541561161b57600080fd5b600d541561162857600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561168157600080fd5b6102c65a03f1151561169257600080fd5b50505060405180519250506ac685fa11e01ec6f000000082146116b457600080fd5b600954600a54600160a060020a03918216916370a08231911660006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561171457600080fd5b6102c65a03f1151561172557600080fd5b50505060405180519150506a71bff83fbcdcd385e4000081101561174857600080fd5b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a160019250505090565b61178633611cd2565b151561179157600080fd5b60035460a060020a900460ff16156117a857600080fd5b6117b06107bb565b156117ba57600080fd5b6117c261081e565b6005556117cd611dbb565b565b670de0b6b3a764000081565b600054600160a060020a031681565b600254600160a060020a031681565b600354600090819060a860020a900460ff16151561181657600080fd5b61181f33611cd2565b151561182a57600080fd5b600954600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561188357600080fd5b6102c65a03f1151561189457600080fd5b5050506040518051600954909250600160a060020a031690506342966c688260006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156118f257600080fd5b6102c65a03f1151561190357600080fd5b50505060405180519050151561191857600080fd5b7f8a18a804523143af3d2399b3fdf76bf116e01d31987f8e774d8f1282f013cb7e8160405190815260200160405180910390a1600191505090565b600061195e33611cd2565b151561196957600080fd5b600160a060020a038216151561197e57600080fd5b30600160a060020a031682600160a060020a03161415151561199f57600080fd5b600a54600160a060020a03838116911614156119ba57600080fd5b600954600160a060020a03838116911614156119d557600080fd5b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290557f3ce716f94fe275e52428cbf6b7f388e5a65976d4edabc34355a77f5e89655bdc9116604051600160a060020a03909116815260200160405180910390a1506001919050565b6a422ca8b0a00a425000000081565b600e6020526000908152604090205460ff1681565b600c5481565b60065481565b6b0295be96e64066972000000081565b69079f905c6fd34e80000081565b60055481565b60035460a860020a900460ff1681565b67016345785d8a000081565b600a54600160a060020a031681565b6000611ad333611d02565b1515611ade57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091557f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b600154600160a060020a031681565b60015460009033600160a060020a03908116911614611b6a57600080fd5b6001805460008054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff1992831617928390559216909255167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b60075481565b6236ee8081565b6a71bff83fbcdcd385e4000081565b600354600160a060020a031681565b600082821115611c0a57fe5b50900390565b6000828202831580611c2c5750828482811515611c2957fe5b04145b1515611c3457fe5b9392505050565b6000808284811515611c4957fe5b04949350505050565b600082820183811015611c3457fe5b60035460009060a860020a900460ff1615611c7b57600080fd5b6003805475ff000000000000000000000000000000000000000000191660a860020a1790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b600354600090600160a060020a031615801590611cfc5750600354600160a060020a038381169116145b92915050565b600054600160a060020a0390811691161490565b600254600090600160a060020a031615801590611cfc575050600254600160a060020a0390811691161490565b611d4c33611cd2565b1515611d5757600080fd5b60035460a060020a900460ff161515611d6f57600080fd5b6003805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b611dc433611cd2565b1515611dcf57600080fd5b60035460a060020a900460ff1615611de657600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a15600a165627a7a72305820d70335dbd36e2892b2e69a9407bafe127794d39bc50a6ce104a0561861dad2e20029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002c4e8f2d746113d0696ce89b35f0d8bf88e0aeca0000000000000000000000004288f043370910c923f7a600526ca8064da05d0d0000000000000000000000002ef2782905830533d218b7ff4d15b8c0981ce84b
-----Decoded View---------------
Arg [0] : _tokenContract (address): 0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA
Arg [1] : _trusteeContract (address): 0x4288F043370910c923f7a600526CA8064Da05d0d
Arg [2] : _wallet (address): 0x2Ef2782905830533d218b7fF4D15b8c0981Ce84B
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c4e8f2d746113d0696ce89b35f0d8bf88e0aeca
Arg [1] : 0000000000000000000000004288f043370910c923f7a600526ca8064da05d0d
Arg [2] : 0000000000000000000000002ef2782905830533d218b7ff4d15b8c0981ce84b
Swarm Source
bzzr://d70335dbd36e2892b2e69a9407bafe127794d39bc50a6ce104a0561861dad2e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.