ETH Price: $3,372.87 (-2.46%)

Contract

0x58b7056DeB51eD292614F0DA1E94E7e9c589828d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Admin Addres...49701932018-01-25 13:23:092527 days ago1516886589IN
SimpleToken: Token Sale
0 ETH0.0023666480
Reclaim Tokens49701812018-01-25 13:19:392527 days ago1516886379IN
SimpleToken: Token Sale
0 ETH0.002517680
Set Admin Addres...49701422018-01-25 13:11:482527 days ago1516885908IN
SimpleToken: Token Sale
0 ETH0.0024690480
Transfer49431832018-01-20 23:16:412532 days ago1516490201IN
SimpleToken: Token Sale
1.894 ETH0.0019773990
Set Admin Addres...47329032017-12-14 19:56:032569 days ago1513281363IN
SimpleToken: Token Sale
0 ETH0.0030225100
Set Ops Address47329002017-12-14 19:55:082569 days ago1513281308IN
SimpleToken: Token Sale
0 ETH0.0015872100
Reclaim Tokens47325732017-12-14 18:30:472569 days ago1513276247IN
SimpleToken: Token Sale
0 ETH0.0032705100
Finalize47325432017-12-14 18:24:452569 days ago1513275885IN
SimpleToken: Token Sale
0 ETH0.002889100
Transfer46730132017-12-04 7:44:152579 days ago1512373455IN
SimpleToken: Token Sale
0.25 ETH0.0004715321
Transfer46716332017-12-04 2:06:412580 days ago1512353201IN
SimpleToken: Token Sale
0.4 ETH0.0007185232
Transfer46598262017-12-02 3:08:212581 days ago1512184101IN
SimpleToken: Token Sale
2.83 ETH0.0004715321
Transfer46597542017-12-02 2:49:312581 days ago1512182971IN
SimpleToken: Token Sale
2.5 ETH0.0004715321
Transfer46597332017-12-02 2:44:302581 days ago1512182670IN
SimpleToken: Token Sale
20 ETH0.0004715321
Transfer46570272017-12-01 15:58:232582 days ago1512143903IN
SimpleToken: Token Sale
3 ETH0.0002245410
Transfer46567652017-12-01 15:00:472582 days ago1512140447IN
SimpleToken: Token Sale
0.25 ETH0.0013472460
Transfer46567622017-12-01 14:59:582582 days ago1512140398IN
SimpleToken: Token Sale
0.3 ETH0.0004715321
Transfer46563192017-12-01 13:20:062582 days ago1512134406IN
SimpleToken: Token Sale
1 ETH0.0002245410
Transfer46563112017-12-01 13:17:142582 days ago1512134234IN
SimpleToken: Token Sale
23.98946063 ETH0.0004715321
Transfer46562932017-12-01 13:13:122582 days ago1512133992IN
SimpleToken: Token Sale
0.105 ETH0.0002245410
Transfer46562742017-12-01 13:08:262582 days ago1512133706IN
SimpleToken: Token Sale
3 ETH0.000583826
Transfer46562612017-12-01 13:04:092582 days ago1512133449IN
SimpleToken: Token Sale
0.18 ETH0.0005613525
Transfer46562492017-12-01 13:01:422582 days ago1512133302IN
SimpleToken: Token Sale
0.14254079 ETH0.0004041718
Transfer46562492017-12-01 13:01:422582 days ago1512133302IN
SimpleToken: Token Sale
10 ETH0.0004715321
Transfer46562452017-12-01 13:00:572582 days ago1512133257IN
SimpleToken: Token Sale
1.3 ETH0.0004715321
Transfer46562452017-12-01 13:00:572582 days ago1512133257IN
SimpleToken: Token Sale
0.7 ETH0.0005613525
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
46562382017-12-01 12:59:562582 days ago1512133196
SimpleToken: Token Sale
2.68699556 ETH
46562382017-12-01 12:59:562582 days ago1512133196
SimpleToken: Token Sale
3.9 ETH
46562382017-12-01 12:59:562582 days ago1512133196
SimpleToken: Token Sale
13.47990482 ETH
46562342017-12-01 12:59:132582 days ago1512133153
SimpleToken: Token Sale
5 ETH
46562342017-12-01 12:59:132582 days ago1512133153
SimpleToken: Token Sale
1 ETH
46562342017-12-01 12:59:132582 days ago1512133153
SimpleToken: Token Sale
2 ETH
46562342017-12-01 12:59:132582 days ago1512133153
SimpleToken: Token Sale
0.4396837 ETH
46562332017-12-01 12:59:082582 days ago1512133148
SimpleToken: Token Sale
0.5 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
3.5 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.5 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.20629221 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.86 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.2 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
9 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
1.41307173 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.7 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.5 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.25 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
10 ETH
46562322017-12-01 12:58:412582 days ago1512133121
SimpleToken: Token Sale
0.16130333 ETH
46562312017-12-01 12:58:132582 days ago1512133093
SimpleToken: Token Sale
0.25 ETH
46562312017-12-01 12:58:132582 days ago1512133093
SimpleToken: Token Sale
0.3 ETH
46562312017-12-01 12:58:132582 days ago1512133093
SimpleToken: Token Sale
10 ETH
46562312017-12-01 12:58:132582 days ago1512133093
SimpleToken: Token Sale
0.32 ETH
46562312017-12-01 12:58:132582 days ago1512133093
SimpleToken: Token Sale
4.54 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.