Sponsored Link:   Learn and build dApps today without code using Crowd Machine's Crowd App Studio.
 Latest 25 txns from a total Of 14809 transactions

TxHash Age From To Value [TxFee]
0xe364114392d4cef2999a1378e96bd5e5d14385dccff1730dd7626720283efeb027 days 6 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.00039366
0x3e0ac1ea3ca5354f28bded5621d1b274970023f2d119c398932b8e4122cbb34f27 days 23 hrs ago0x58e4d6d475e580840bfd21de2515bd5882e84438  IN   TheAbyssDAICO0.021 Ether0.00002497
0xc551484e4887f317d1955814499145334bee18d865e8c71703d7d6a72813b1ae28 days 4 hrs ago0x58e4d6d475e580840bfd21de2515bd5882e84438  IN   TheAbyssDAICO0.025 Ether0.00002497
0x2fed6fc75e2507c05cd55644a468ee25db5321257b79a154556396535b6cdeb653 days 7 hrs ago0x6bddbd1d6bbe36aff9a1dff1e4067148425a76d9  IN   TheAbyssDAICO0.06 Ether0.0002497
0x487443daba6af16927bc4dba5b5eb0bdd7c9805dff61e93dae53d3b26f90903760 days 7 hrs ago0x53e3477bb74a908e1f3c165532dc63b00543c7fd  IN   TheAbyssDAICO0.3 Ether0.00047443
0x8d6ee592f2cda01b59a37e3598fa56d8a1b303ca5c37879ec1f31170207c82eb60 days 8 hrs ago0x9f361f3a3beadf479acee07df20e0327162e93e8  IN   TheAbyssDAICO2.65 Ether0.002162952
0x183d9fcd7c254768ca2987d47501ab939a3b83e352ab76a1492daebaf475c2f460 days 8 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.000573264
0xbf4042c10dc141e1a051a90fc29b51cf20bda26d11bd77b644c6df11e6d164a760 days 8 hrs ago0x8c6e3b2af1f9d8508b3b953d03246d0b55421c59  IN   TheAbyssDAICO0 Ether0.0011159
0x0d92135e24ba33abb4d05388fc51c8b9eac8c97fe2f25fc18ba71817f924c67460 days 8 hrs ago0xede59e683f59519eeabd9c872633e68ed2f17f46  IN   TheAbyssDAICO0.51 Ether0.002162952
0x378a9f5518c26c1d0b49e3a9c805eee3fa2c71c203e9d5bb9b66785075f6e37360 days 8 hrs ago0xede59e683f59519eeabd9c872633e68ed2f17f46  IN   TheAbyssDAICO0.51 Ether0.00076468
0x95581c074ac47e7386a7d9065e5da3553053a8538e45c2c6355460cf9eb8a98760 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.006547692
0x15189cb42b7f54dee08c5cc6da633d0761467e3da5145c73fd11314ef6d8e1ea60 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.000322596
0x1359322bfc935d7977317fbbd40bae0bf87a23caf04d8b3b2da0cb5023019fa660 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.001897224
0x120098be77c26cbda1f84d4a6defe02becaaf521c08ca3c9968e98759c8ac45860 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.001897224
0x655cafb6916b8bc2c452e585c3114e8c2e22aabc6dcaf93448cc6e71b65157b760 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.001897224
0x8fabb3898c5113b9e219ac143f43b011efeb9be427679bc01c3aac640f7b251760 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.000618072
0x25efc2211ef5405ed9da9ac816c743cddc5fb565b88930f8fb6b1c84c13d939260 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.002077224
0x6692873219d1898894d0e55dd9156487d49c23f4f5cda49e44e3ff76a8a179ea60 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.002077224
0x81fab133fcf31da4343818a747d3ea47b2676376c1a9a393d7faa1718e7c2bf260 days 9 hrs ago0x29251185b15456d877ec2fcb7139c5b1e5da58da  IN   TheAbyssDAICO0.35384615 Ether0.00610555
0xadd847f375f5af5ccc79d479bc77c4c64bbbd3b0b3ea19b3a54e199c147e913360 days 9 hrs ago0x25e2505d83aa6c2e063a051af343394e00493852  IN   TheAbyssDAICO1.7 Ether0.003475898
0x7aa8ddf52d3038487e9534a84e8a34549d96b2c27aeca2ad45c42699b7a67cb060 days 9 hrs ago0xa2c9f98a262c29a74b698f6956acde1cdf8701c4  IN   TheAbyssDAICO0.65 Ether0.007633989
0x4a4357b7f33e7f1bfe9a024ac0883420ae98be891302bbd567d3fb0ac50b776160 days 9 hrs ago0xed5ac8bbb0748f436d317bb6bd094b5741a7518f  IN   TheAbyssDAICO0.5 Ether0.00169556
0x5ae49ef7efbea234130c5873bbc39cacb36718d1bbb0b30563782315ceca0a5b60 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.002077224
0xb582d20f8d7eb32e4c267874f82d7532716fa22eb37089882d3811592d20fb8660 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.001897224
0xf70d61b291b2415ffdb79d0aa6895b36d74b11be490c4d8a3544d417d0e62d6c60 days 9 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssDAICO0 Ether0.001896456
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0x1359322bfc935d7977317fbbd40bae0bf87a23caf04d8b3b2da0cb5023019fa6562392560 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282 Ether
0x1359322bfc935d7977317fbbd40bae0bf87a23caf04d8b3b2da0cb5023019fa6562392560 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b2 Ether
0x120098be77c26cbda1f84d4a6defe02becaaf521c08ca3c9968e98759c8ac458562392260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282.8983354 Ether
0x120098be77c26cbda1f84d4a6defe02becaaf521c08ca3c9968e98759c8ac458562392260 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b2.8983354 Ether
0x655cafb6916b8bc2c452e585c3114e8c2e22aabc6dcaf93448cc6e71b65157b7562392060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285 Ether
0x655cafb6916b8bc2c452e585c3114e8c2e22aabc6dcaf93448cc6e71b65157b7562392060 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b5 Ether
0x25efc2211ef5405ed9da9ac816c743cddc5fb565b88930f8fb6b1c84c13d9392562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672817 Ether
0x25efc2211ef5405ed9da9ac816c743cddc5fb565b88930f8fb6b1c84c13d9392562391260 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b17 Ether
0x6692873219d1898894d0e55dd9156487d49c23f4f5cda49e44e3ff76a8a179ea562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672810 Ether
0x6692873219d1898894d0e55dd9156487d49c23f4f5cda49e44e3ff76a8a179ea562391260 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b10 Ether
0x81fab133fcf31da4343818a747d3ea47b2676376c1a9a393d7faa1718e7c2bf2562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.35384615 Ether
0xadd847f375f5af5ccc79d479bc77c4c64bbbd3b0b3ea19b3a54e199c147e9133562391060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x035611f47a13f3603109152952f0034c674959ba1.7 Ether
0x7aa8ddf52d3038487e9534a84e8a34549d96b2c27aeca2ad45c42699b7a67cb0562391060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.65 Ether
0x4a4357b7f33e7f1bfe9a024ac0883420ae98be891302bbd567d3fb0ac50b7761562390960 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x035611f47a13f3603109152952f0034c674959ba0.5 Ether
0x5ae49ef7efbea234130c5873bbc39cacb36718d1bbb0b30563782315ceca0a5b562390860 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281 Ether
0x5ae49ef7efbea234130c5873bbc39cacb36718d1bbb0b30563782315ceca0a5b562390860 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b1 Ether
0xb582d20f8d7eb32e4c267874f82d7532716fa22eb37089882d3811592d20fb86562390760 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281.5 Ether
0xb582d20f8d7eb32e4c267874f82d7532716fa22eb37089882d3811592d20fb86562390760 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b1.5 Ether
0xf70d61b291b2415ffdb79d0aa6895b36d74b11be490c4d8a3544d417d0e62d6c562390660 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0xf70d61b291b2415ffdb79d0aa6895b36d74b11be490c4d8a3544d417d0e62d6c562390660 days 9 hrs ago0x035611f47a13f3603109152952f0034c674959ba0xb84e224216fec19d8631a0ad187326bc48f91b6b0.2 Ether
0x68ac1cb2f597cf43713b3faf0f3fd2787c19741280846c1e22efbcc2c1a973b5562390460 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.32 Ether
0xd6cb72fca32c0c48979b749ccdef63a8e4c58f7476acd9527861cda78aaa8863562390260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.3 Ether
0xe7fddb0c94c1207ffd7315348436aaca3a1452e90260196da445579d5a524ea2562390160 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0x80b3e374ac31bacc3627f2a80ef119cb379866fd560659e18274ce08aa9756e9562390160 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.38 Ether
0xee5cf5a310531be5ca8d92dfe48a439010480e2cfbbb3fffa8cc069f5f850cfe562389760 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867286.4 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact match)
Contract Name: TheAbyssDAICO
Compiler Version: v0.4.21+commit.dfe3193c
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.21;

// File: contracts/ISimpleCrowdsale.sol

interface ISimpleCrowdsale {
    function getSoftCap() external view returns(uint256);
    function isContributorInLists(address contributorAddress) external view returns(bool);
    function processReservationFundContribution(
        address contributor,
        uint256 tokenAmount,
        uint256 tokenBonusAmount
    ) external payable;
}

// File: contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;
    address public newOwner;

    event OwnershipTransferred(address previousOwner, address newOwner);

    /**
    * @dev The Ownable constructor sets the original `owner` of the contract.
    */
    function Ownable(address _owner) public {
        owner = _owner == address(0) ? msg.sender : _owner;
    }

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != owner);
        newOwner = _newOwner;
    }

    /**
    * @dev confirm ownership by a new owner
    */
    function confirmOwnership() public {
        require(msg.sender == newOwner);
        OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        newOwner = 0x0;
    }
}

// File: contracts/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;


    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() onlyOwner whenNotPaused public {
        paused = true;
        Pause();
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() onlyOwner whenPaused public {
        paused = false;
        Unpause();
    }
}

// File: contracts/fund/ICrowdsaleFund.sol

/**
 * @title ICrowdsaleFund
 * @dev Fund methods used by crowdsale contract
 */
interface ICrowdsaleFund {
    /**
    * @dev Function accepts user`s contributed ether and logs contribution
    * @param contributor Contributor wallet address.
    */
    function processContribution(address contributor) external payable;
    /**
    * @dev Function is called on the end of successful crowdsale
    */
    function onCrowdsaleEnd() external;
    /**
    * @dev Function is called if crowdsale failed to reach soft cap
    */
    function enableCrowdsaleRefund() external;
}

// File: contracts/fund/ICrowdsaleReservationFund.sol

/**
 * @title ICrowdsaleReservationFund
 * @dev ReservationFund methods used by crowdsale contract
 */
interface ICrowdsaleReservationFund {
    /**
     * @dev Check if contributor has transactions
     */
    function canCompleteContribution(address contributor) external returns(bool);
    /**
     * @dev Complete contribution
     * @param contributor Contributor`s address
     */
    function completeContribution(address contributor) external;
    /**
     * @dev Function accepts user`s contributed ether and amount of tokens to issue
     * @param contributor Contributor wallet address.
     * @param _tokensToIssue Token amount to issue
     * @param _bonusTokensToIssue Bonus token amount to issue
     */
    function processContribution(address contributor, uint256 _tokensToIssue, uint256 _bonusTokensToIssue) external payable;

    /**
     * @dev Function returns current user`s contributed ether amount
     */
    function contributionsOf(address contributor) external returns(uint256);

    /**
     * @dev Function is called on the end of successful crowdsale
     */
    function onCrowdsaleEnd() external;
}

// File: contracts/token/IERC20Token.sol

/**
 * @title IERC20Token - ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract IERC20Token {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    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);
    function allowance(address _owner, address _spender)  public constant returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// File: contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
contract SafeMath {
    /**
    * @dev constructor
    */
    function SafeMath() public {
    }

    function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        return c;
    }

    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(a >= b);
        return a - b;
    }

    function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

// File: contracts/token/LockedTokens.sol

/**
 * @title LockedTokens
 * @dev Lock tokens for certain period of time
 */
contract LockedTokens is SafeMath {
    struct Tokens {
        uint256 amount;
        uint256 lockEndTime;
        bool released;
    }

    event TokensUnlocked(address _to, uint256 _value);

    IERC20Token public token;
    address public crowdsaleAddress;
    mapping(address => Tokens[]) public walletTokens;

    /**
     * @dev LockedTokens constructor
     * @param _token ERC20 compatible token contract
     * @param _crowdsaleAddress Crowdsale contract address
     */
    function LockedTokens(IERC20Token _token, address _crowdsaleAddress) public {
        token = _token;
        crowdsaleAddress = _crowdsaleAddress;
    }

    /**
     * @dev Functions locks tokens
     * @param _to Wallet address to transfer tokens after _lockEndTime
     * @param _amount Amount of tokens to lock
     * @param _lockEndTime End of lock period
     */
    function addTokens(address _to, uint256 _amount, uint256 _lockEndTime) external {
        require(msg.sender == crowdsaleAddress);
        walletTokens[_to].push(Tokens({amount: _amount, lockEndTime: _lockEndTime, released: false}));
    }

    /**
     * @dev Called by owner of locked tokens to release them
     */
    function releaseTokens() public {
        require(walletTokens[msg.sender].length > 0);

        for(uint256 i = 0; i < walletTokens[msg.sender].length; i++) {
            if(!walletTokens[msg.sender][i].released && now >= walletTokens[msg.sender][i].lockEndTime) {
                walletTokens[msg.sender][i].released = true;
                token.transfer(msg.sender, walletTokens[msg.sender][i].amount);
                TokensUnlocked(msg.sender, walletTokens[msg.sender][i].amount);
            }
        }
    }
}

// File: contracts/ownership/MultiOwnable.sol

/**
 * @title MultiOwnable
 * @dev The MultiOwnable contract has owners addresses and provides basic authorization control
 * functions, this simplifies the implementation of "users permissions".
 */
contract MultiOwnable {
    address public manager; // address used to set owners
    address[] public owners;
    mapping(address => bool) public ownerByAddress;

    event SetOwners(address[] owners);

    modifier onlyOwner() {
        require(ownerByAddress[msg.sender] == true);
        _;
    }

    /**
     * @dev MultiOwnable constructor sets the manager
     */
    function MultiOwnable() public {
        manager = msg.sender;
    }

    /**
     * @dev Function to set owners addresses
     */
    function setOwners(address[] _owners) public {
        require(msg.sender == manager);
        _setOwners(_owners);

    }

    function _setOwners(address[] _owners) internal {
        for(uint256 i = 0; i < owners.length; i++) {
            ownerByAddress[owners[i]] = false;
        }


        for(uint256 j = 0; j < _owners.length; j++) {
            ownerByAddress[_owners[j]] = true;
        }
        owners = _owners;
        SetOwners(_owners);
    }

    function getOwners() public constant returns (address[]) {
        return owners;
    }
}

// File: contracts/token/ERC20Token.sol

/**
 * @title ERC20Token - ERC20 base implementation
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Token is IERC20Token, SafeMath {
    mapping (address => uint256) public balances;
    mapping (address => mapping (address => uint256)) public allowed;

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[msg.sender] >= _value);

        balances[msg.sender] = safeSub(balances[msg.sender], _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);

        balances[_to] = safeAdd(balances[_to], _value);
        balances[_from] = safeSub(balances[_from], _value);
        allowed[_from][msg.sender] = safeSub(allowed[_from][msg.sender], _value);
        Transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address _owner) public constant returns (uint256) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256) {
      return allowed[_owner][_spender];
    }
}

// File: contracts/token/ITokenEventListener.sol

/**
 * @title ITokenEventListener
 * @dev Interface which should be implemented by token listener
 */
interface ITokenEventListener {
    /**
     * @dev Function is called after token transfer/transferFrom
     * @param _from Sender address
     * @param _to Receiver address
     * @param _value Amount of tokens
     */
    function onTokenTransfer(address _from, address _to, uint256 _value) external;
}

// File: contracts/token/ManagedToken.sol

/**
 * @title ManagedToken
 * @dev ERC20 compatible token with issue and destroy facilities
 * @dev All transfers can be monitored by token event listener
 */
contract ManagedToken is ERC20Token, MultiOwnable {
    bool public allowTransfers = false;
    bool public issuanceFinished = false;

    ITokenEventListener public eventListener;

    event AllowTransfersChanged(bool _newState);
    event Issue(address indexed _to, uint256 _value);
    event Destroy(address indexed _from, uint256 _value);
    event IssuanceFinished();

    modifier transfersAllowed() {
        require(allowTransfers);
        _;
    }

    modifier canIssue() {
        require(!issuanceFinished);
        _;
    }

    /**
     * @dev ManagedToken constructor
     * @param _listener Token listener(address can be 0x0)
     * @param _owners Owners list
     */
    function ManagedToken(address _listener, address[] _owners) public {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        }
        _setOwners(_owners);
    }

    /**
     * @dev Enable/disable token transfers. Can be called only by owners
     * @param _allowTransfers True - allow False - disable
     */
    function setAllowTransfers(bool _allowTransfers) external onlyOwner {
        allowTransfers = _allowTransfers;
        AllowTransfersChanged(_allowTransfers);
    }

    /**
     * @dev Set/remove token event listener
     * @param _listener Listener address (Contract must implement ITokenEventListener interface)
     */
    function setListener(address _listener) public onlyOwner {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        } else {
            delete eventListener;
        }
    }

    function transfer(address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transfer(_to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(msg.sender, _to, _value);
        }
        return success;
    }

    function transferFrom(address _from, address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transferFrom(_from, _to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(_from, _to, _value);
        }
        return success;
    }

    function hasListener() internal view returns(bool) {
        if(eventListener == address(0)) {
            return false;
        }
        return true;
    }

    /**
     * @dev Issue tokens to specified wallet
     * @param _to Wallet address
     * @param _value Amount of tokens
     */
    function issue(address _to, uint256 _value) external onlyOwner canIssue {
        totalSupply = safeAdd(totalSupply, _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Issue(_to, _value);
        Transfer(address(0), _to, _value);
    }

    /**
     * @dev Destroy tokens on specified address (Called by owner or token holder)
     * @dev Fund contract address must be in the list of owners to burn token during refund
     * @param _from Wallet address
     * @param _value Amount of tokens to destroy
     */
    function destroy(address _from, uint256 _value) external {
        require(ownerByAddress[msg.sender] || msg.sender == _from);
        require(balances[_from] >= _value);
        totalSupply = safeSub(totalSupply, _value);
        balances[_from] = safeSub(balances[_from], _value);
        Transfer(_from, address(0), _value);
        Destroy(_from, _value);
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     */
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = safeAdd(allowed[msg.sender][_spender], _addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = safeSub(oldValue, _subtractedValue);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Finish token issuance
     * @return True if success
     */
    function finishIssuance() public onlyOwner returns (bool) {
        issuanceFinished = true;
        IssuanceFinished();
        return true;
    }
}

// File: contracts/token/TransferLimitedToken.sol

/**
 * @title TransferLimitedToken
 * @dev Token with ability to limit transfers within wallets included in limitedWallets list for certain period of time
 */
contract TransferLimitedToken is ManagedToken {
    uint256 public constant LIMIT_TRANSFERS_PERIOD = 365 days;

    mapping(address => bool) public limitedWallets;
    uint256 public limitEndDate;
    address public limitedWalletsManager;
    bool public isLimitEnabled;

    event TransfersEnabled();

    modifier onlyManager() {
        require(msg.sender == limitedWalletsManager);
        _;
    }

    /**
     * @dev Check if transfer between addresses is available
     * @param _from From address
     * @param _to To address
     */
    modifier canTransfer(address _from, address _to)  {
        require(now >= limitEndDate || !isLimitEnabled || (!limitedWallets[_from] && !limitedWallets[_to]));
        _;
    }

    /**
     * @dev TransferLimitedToken constructor
     * @param _limitStartDate Limit start date
     * @param _listener Token listener(address can be 0x0)
     * @param _owners Owners list
     * @param _limitedWalletsManager Address used to add/del wallets from limitedWallets
     */
    function TransferLimitedToken(
        uint256 _limitStartDate,
        address _listener,
        address[] _owners,
        address _limitedWalletsManager
    ) public ManagedToken(_listener, _owners)
    {
        limitEndDate = _limitStartDate + LIMIT_TRANSFERS_PERIOD;
        isLimitEnabled = true;
        limitedWalletsManager = _limitedWalletsManager;
    }

    /**
     * @dev Enable token transfers
     */
    function enableTransfers() public {
        require(msg.sender == limitedWalletsManager);
        allowTransfers = true;
        TransfersEnabled();
    }

    /**
     * @dev Add address to limitedWallets
     * @dev Can be called only by manager
     */
    function addLimitedWalletAddress(address _wallet) public {
        require(msg.sender == limitedWalletsManager || ownerByAddress[msg.sender]);
        limitedWallets[_wallet] = true;
    }

    /**
     * @dev Del address from limitedWallets
     * @dev Can be called only by manager
     */
    function delLimitedWalletAddress(address _wallet) public onlyManager {
        limitedWallets[_wallet] = false;
    }

    /**
     * @dev Disable transfer limit manually. Can be called only by manager
     */
    function disableLimit() public onlyManager {
        isLimitEnabled = false;
    }

    function transfer(address _to, uint256 _value) public canTransfer(msg.sender, _to) returns (bool) {
        return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public canTransfer(_from, _to) returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }

    function approve(address _spender, uint256 _value) public canTransfer(msg.sender, _spender) returns (bool) {
        return super.approve(_spender,_value);
    }
}

// File: contracts/Crowdsale.sol

contract TheAbyssDAICO is Ownable, SafeMath, Pausable, ISimpleCrowdsale {
    enum AdditionalBonusState {
        Unavailable,
        Active,
        Applied
    }

    uint256 public constant ADDITIONAL_BONUS_NUM = 3;
    uint256 public constant ADDITIONAL_BONUS_DENOM = 100;

    uint256 public constant ETHER_MIN_CONTRIB = 0.2 ether;
    uint256 public constant ETHER_MAX_CONTRIB = 20 ether;

    uint256 public constant ETHER_MIN_CONTRIB_PRIVATE = 100 ether;
    uint256 public constant ETHER_MAX_CONTRIB_PRIVATE = 3000 ether;

    uint256 public constant ETHER_MIN_CONTRIB_USA = 0.2 ether;
    uint256 public constant ETHER_MAX_CONTRIB_USA = 20 ether;

    uint256 public constant SALE_START_TIME = 1524060000; // 18.04.2018 14:00:00 UTC
    uint256 public constant SALE_END_TIME = 1526479200; // 16.05.2018 14:00:00 UTC

    uint256 public constant BONUS_WINDOW_1_END_TIME = SALE_START_TIME + 2 days;
    uint256 public constant BONUS_WINDOW_2_END_TIME = SALE_START_TIME + 7 days;
    uint256 public constant BONUS_WINDOW_3_END_TIME = SALE_START_TIME + 14 days;
    uint256 public constant BONUS_WINDOW_4_END_TIME = SALE_START_TIME + 21 days;

    uint256 public constant MAX_CONTRIB_CHECK_END_TIME = SALE_START_TIME + 1 days;

    uint256 public constant BNB_TOKEN_PRICE_NUM = 169;
    uint256 public constant BNB_TOKEN_PRICE_DENOM = 1;

    uint256 public tokenPriceNum = 0;
    uint256 public tokenPriceDenom = 0;
    
    TransferLimitedToken public token;
    ICrowdsaleFund public fund;
    ICrowdsaleReservationFund public reservationFund;
    LockedTokens public lockedTokens;

    mapping(address => bool) public whiteList;
    mapping(address => bool) public privilegedList;
    mapping(address => AdditionalBonusState) public additionalBonusOwnerState;
    mapping(address => uint256) public userTotalContributed;

    address public bnbTokenWallet;
    address public referralTokenWallet;
    address public foundationTokenWallet;
    address public advisorsTokenWallet;
    address public companyTokenWallet;
    address public reserveTokenWallet;
    address public bountyTokenWallet;

    uint256 public totalEtherContributed = 0;
    uint256 public rawTokenSupply = 0;

    // BNB
    IERC20Token public bnbToken;
    uint256 public BNB_HARD_CAP = 300000 ether; // 300K BNB
    uint256 public BNB_MIN_CONTRIB = 1000 ether; // 1K BNB
    mapping(address => uint256) public bnbContributions;
    uint256 public totalBNBContributed = 0;
    bool public bnbWithdrawEnabled = false;

    uint256 public hardCap = 0; // World hard cap will be set right before Token Sale
    uint256 public softCap = 0; // World soft cap will be set right before Token Sale

    bool public bnbRefundEnabled = false;

    event LogContribution(address contributor, uint256 amountWei, uint256 tokenAmount, uint256 tokenBonus, bool additionalBonusApplied, uint256 timestamp);
    event ReservationFundContribution(address contributor, uint256 amountWei, uint256 tokensToIssue, uint256 bonusTokensToIssue, uint256 timestamp);
    event LogBNBContribution(address contributor, uint256 amountBNB, uint256 tokenAmount, uint256 tokenBonus, bool additionalBonusApplied, uint256 timestamp);

    modifier checkContribution() {
        require(isValidContribution());
        _;
    }

    modifier checkBNBContribution() {
        require(isValidBNBContribution());
        _;
    }

    modifier checkCap() {
        require(validateCap());
        _;
    }

    modifier checkTime() {
        require(now >= SALE_START_TIME && now <= SALE_END_TIME);
        _;
    }

    function TheAbyssDAICO(
        address bnbTokenAddress,
        address tokenAddress,
        address fundAddress,
        address reservationFundAddress,
        address _bnbTokenWallet,
        address _referralTokenWallet,
        address _foundationTokenWallet,
        address _advisorsTokenWallet,
        address _companyTokenWallet,
        address _reserveTokenWallet,
        address _bountyTokenWallet,
        address _owner
    ) public
        Ownable(_owner)
    {
        require(tokenAddress != address(0));

        bnbToken = IERC20Token(bnbTokenAddress);
        token = TransferLimitedToken(tokenAddress);
        fund = ICrowdsaleFund(fundAddress);
        reservationFund = ICrowdsaleReservationFund(reservationFundAddress);

        bnbTokenWallet = _bnbTokenWallet;
        referralTokenWallet = _referralTokenWallet;
        foundationTokenWallet = _foundationTokenWallet;
        advisorsTokenWallet = _advisorsTokenWallet;
        companyTokenWallet = _companyTokenWallet;
        reserveTokenWallet = _reserveTokenWallet;
        bountyTokenWallet = _bountyTokenWallet;
    }

    /**
     * @dev check if address can contribute
     */
    function isContributorInLists(address contributor) external view returns(bool) {
        return whiteList[contributor] || privilegedList[contributor] || token.limitedWallets(contributor);
    }

    /**
     * @dev check contribution amount and time
     */
    function isValidContribution() internal view returns(bool) {
        uint256 currentUserContribution = safeAdd(msg.value, userTotalContributed[msg.sender]);
        if(whiteList[msg.sender] && msg.value >= ETHER_MIN_CONTRIB) {
            if(now <= MAX_CONTRIB_CHECK_END_TIME && currentUserContribution > ETHER_MAX_CONTRIB ) {
                    return false;
            }
            return true;

        }
        if(privilegedList[msg.sender] && msg.value >= ETHER_MIN_CONTRIB_PRIVATE) {
            if(now <= MAX_CONTRIB_CHECK_END_TIME && currentUserContribution > ETHER_MAX_CONTRIB_PRIVATE ) {
                    return false;
            }
            return true;
        }

        if(token.limitedWallets(msg.sender) && msg.value >= ETHER_MIN_CONTRIB_USA) {
            if(now <= MAX_CONTRIB_CHECK_END_TIME && currentUserContribution > ETHER_MAX_CONTRIB_USA) {
                    return false;
            }
            return true;
        }

        return false;
    }

    /**
     * @dev Check hard cap overflow
     */
    function validateCap() internal view returns(bool){
        if(msg.value <= safeSub(hardCap, totalEtherContributed)) {
            return true;
        }
        return false;
    }

    /**
     * @dev Set token price once before start of crowdsale
     */
    function setTokenPrice(uint256 _tokenPriceNum, uint256 _tokenPriceDenom) public onlyOwner {
        require(tokenPriceNum == 0 && tokenPriceDenom == 0);
        require(_tokenPriceNum > 0 && _tokenPriceDenom > 0);
        tokenPriceNum = _tokenPriceNum;
        tokenPriceDenom = _tokenPriceDenom;
    }

    /**
     * @dev Set hard cap.
     * @param _hardCap - Hard cap value
     */
    function setHardCap(uint256 _hardCap) public onlyOwner {
        require(hardCap == 0);
        hardCap = _hardCap;
    }

    /**
     * @dev Set soft cap.
     * @param _softCap - Soft cap value
     */
    function setSoftCap(uint256 _softCap) public onlyOwner {
        require(softCap == 0);
        softCap = _softCap;
    }

    /**
     * @dev Get soft cap amount
     **/
    function getSoftCap() external view returns(uint256) {
        return softCap;
    }

    /**
     * @dev Check bnb contribution time, amount and hard cap overflow
     */
    function isValidBNBContribution() internal view returns(bool) {
        if(token.limitedWallets(msg.sender)) {
            return false;
        }
        if(!whiteList[msg.sender] && !privilegedList[msg.sender]) {
            return false;
        }
        uint256 amount = bnbToken.allowance(msg.sender, address(this));
        if(amount < BNB_MIN_CONTRIB || safeAdd(totalBNBContributed, amount) > BNB_HARD_CAP) {
            return false;
        }
        return true;

    }

    /**
     * @dev Calc bonus amount by contribution time
     */
    function getBonus() internal constant returns (uint256, uint256) {
        uint256 numerator = 0;
        uint256 denominator = 100;

        if(now < BONUS_WINDOW_1_END_TIME) {
            numerator = 25;
        } else if(now < BONUS_WINDOW_2_END_TIME) {
            numerator = 15;
        } else if(now < BONUS_WINDOW_3_END_TIME) {
            numerator = 10;
        } else if(now < BONUS_WINDOW_4_END_TIME) {
            numerator = 5;
        } else {
            numerator = 0;
        }

        return (numerator, denominator);
    }

    function addToLists(
        address _wallet,
        bool isInWhiteList,
        bool isInPrivilegedList,
        bool isInLimitedList,
        bool hasAdditionalBonus
    ) public onlyOwner {
        if(isInWhiteList) {
            whiteList[_wallet] = true;
        }
        if(isInPrivilegedList) {
            privilegedList[_wallet] = true;
        }
        if(isInLimitedList) {
            token.addLimitedWalletAddress(_wallet);
        }
        if(hasAdditionalBonus) {
            additionalBonusOwnerState[_wallet] = AdditionalBonusState.Active;
        }
        if(reservationFund.canCompleteContribution(_wallet)) {
            reservationFund.completeContribution(_wallet);
        }
    }

    /**
     * @dev Add wallet to whitelist. For contract owner only.
     */
    function addToWhiteList(address _wallet) public onlyOwner {
        whiteList[_wallet] = true;
    }

    /**
     * @dev Add wallet to additional bonus members. For contract owner only.
     */
    function addAdditionalBonusMember(address _wallet) public onlyOwner {
        additionalBonusOwnerState[_wallet] = AdditionalBonusState.Active;
    }

    /**
     * @dev Add wallet to privileged list. For contract owner only.
     */
    function addToPrivilegedList(address _wallet) public onlyOwner {
        privilegedList[_wallet] = true;
    }

    /**
     * @dev Set LockedTokens contract address
     */
    function setLockedTokens(address lockedTokensAddress) public onlyOwner {
        lockedTokens = LockedTokens(lockedTokensAddress);
    }

    /**
     * @dev Fallback function to receive ether contributions
     */
    function () payable public whenNotPaused {
        if(whiteList[msg.sender] || privilegedList[msg.sender] || token.limitedWallets(msg.sender)) {
            processContribution(msg.sender, msg.value);
        } else {
            processReservationContribution(msg.sender, msg.value);
        }
    }

    function processReservationContribution(address contributor, uint256 amount) private checkTime checkCap {
        require(amount >= ETHER_MIN_CONTRIB);

        if(now <= MAX_CONTRIB_CHECK_END_TIME) {
            uint256 currentUserContribution = safeAdd(amount, reservationFund.contributionsOf(contributor));
            require(currentUserContribution <= ETHER_MAX_CONTRIB);
        }
        uint256 bonusNum = 0;
        uint256 bonusDenom = 100;
        (bonusNum, bonusDenom) = getBonus();
        uint256 tokenBonusAmount = 0;
        uint256 tokenAmount = safeDiv(safeMul(amount, tokenPriceNum), tokenPriceDenom);

        if(bonusNum > 0) {
            tokenBonusAmount = safeDiv(safeMul(tokenAmount, bonusNum), bonusDenom);
        }

        reservationFund.processContribution.value(amount)(
            contributor,
            tokenAmount,
            tokenBonusAmount
        );
        ReservationFundContribution(contributor, amount, tokenAmount, tokenBonusAmount, now);
    }

    /**
     * @dev Process BNB token contribution
     * Transfer all amount of tokens approved by sender. Calc bonuses and issue tokens to contributor.
     */
    function processBNBContribution() public whenNotPaused checkTime checkBNBContribution {
        bool additionalBonusApplied = false;
        uint256 bonusNum = 0;
        uint256 bonusDenom = 100;
        (bonusNum, bonusDenom) = getBonus();
        uint256 amountBNB = bnbToken.allowance(msg.sender, address(this));
        bnbToken.transferFrom(msg.sender, address(this), amountBNB);
        bnbContributions[msg.sender] = safeAdd(bnbContributions[msg.sender], amountBNB);

        uint256 tokenBonusAmount = 0;
        uint256 tokenAmount = safeDiv(safeMul(amountBNB, BNB_TOKEN_PRICE_NUM), BNB_TOKEN_PRICE_DENOM);
        rawTokenSupply = safeAdd(rawTokenSupply, tokenAmount);
        if(bonusNum > 0) {
            tokenBonusAmount = safeDiv(safeMul(tokenAmount, bonusNum), bonusDenom);
        }

        if(additionalBonusOwnerState[msg.sender] ==  AdditionalBonusState.Active) {
            additionalBonusOwnerState[msg.sender] = AdditionalBonusState.Applied;
            uint256 additionalBonus = safeDiv(safeMul(tokenAmount, ADDITIONAL_BONUS_NUM), ADDITIONAL_BONUS_DENOM);
            tokenBonusAmount = safeAdd(tokenBonusAmount, additionalBonus);
            additionalBonusApplied = true;
        }

        uint256 tokenTotalAmount = safeAdd(tokenAmount, tokenBonusAmount);
        token.issue(msg.sender, tokenTotalAmount);
        totalBNBContributed = safeAdd(totalBNBContributed, amountBNB);

        LogBNBContribution(msg.sender, amountBNB, tokenAmount, tokenBonusAmount, additionalBonusApplied, now);
    }

    /**
     * @dev Process ether contribution. Calc bonuses and issue tokens to contributor.
     */
    function processContribution(address contributor, uint256 amount) private checkTime checkContribution checkCap {
        bool additionalBonusApplied = false;
        uint256 bonusNum = 0;
        uint256 bonusDenom = 100;
        (bonusNum, bonusDenom) = getBonus();
        uint256 tokenBonusAmount = 0;

        uint256 tokenAmount = safeDiv(safeMul(amount, tokenPriceNum), tokenPriceDenom);
        rawTokenSupply = safeAdd(rawTokenSupply, tokenAmount);

        if(bonusNum > 0) {
            tokenBonusAmount = safeDiv(safeMul(tokenAmount, bonusNum), bonusDenom);
        }

        if(additionalBonusOwnerState[contributor] ==  AdditionalBonusState.Active) {
            additionalBonusOwnerState[contributor] = AdditionalBonusState.Applied;
            uint256 additionalBonus = safeDiv(safeMul(tokenAmount, ADDITIONAL_BONUS_NUM), ADDITIONAL_BONUS_DENOM);
            tokenBonusAmount = safeAdd(tokenBonusAmount, additionalBonus);
            additionalBonusApplied = true;
        }

        processPayment(contributor, amount, tokenAmount, tokenBonusAmount, additionalBonusApplied);
    }

    /**
     * @dev Process ether contribution before KYC. Calc bonuses and tokens to issue after KYC.
     */
    function processReservationFundContribution(
        address contributor,
        uint256 tokenAmount,
        uint256 tokenBonusAmount
    ) external payable checkCap {
        require(msg.sender == address(reservationFund));
        require(msg.value > 0);
        rawTokenSupply = safeAdd(rawTokenSupply, tokenAmount);
        processPayment(contributor, msg.value, tokenAmount, tokenBonusAmount, false);
    }

    function processPayment(address contributor, uint256 etherAmount, uint256 tokenAmount, uint256 tokenBonusAmount, bool additionalBonusApplied) internal {
        uint256 tokenTotalAmount = safeAdd(tokenAmount, tokenBonusAmount);

        token.issue(contributor, tokenTotalAmount);
        fund.processContribution.value(etherAmount)(contributor);
        totalEtherContributed = safeAdd(totalEtherContributed, etherAmount);
        userTotalContributed[contributor] = safeAdd(userTotalContributed[contributor], etherAmount);
        LogContribution(contributor, etherAmount, tokenAmount, tokenBonusAmount, additionalBonusApplied, now);
    }

    /**
     * @dev Force crowdsale refund
     */
    function forceCrowdsaleRefund() public onlyOwner {
        pause();
        fund.enableCrowdsaleRefund();
        reservationFund.onCrowdsaleEnd();
        token.finishIssuance();
        bnbRefundEnabled = true;
    }

    /**
     * @dev Finalize crowdsale if we reached hard cap or current time > SALE_END_TIME
     */
    function finalizeCrowdsale() public onlyOwner {
        if(
            totalEtherContributed >= safeSub(hardCap, 1000 ether) ||
            (now >= SALE_END_TIME && totalEtherContributed >= softCap)
        ) {
            fund.onCrowdsaleEnd();
            reservationFund.onCrowdsaleEnd();
            bnbWithdrawEnabled = true;

            // Referral
            uint256 referralTokenAmount = safeDiv(rawTokenSupply, 10);
            token.issue(referralTokenWallet, referralTokenAmount);

            // Foundation
            uint256 foundationTokenAmount = safeDiv(token.totalSupply(), 2); // 20%
            token.issue(address(lockedTokens), foundationTokenAmount);
            lockedTokens.addTokens(foundationTokenWallet, foundationTokenAmount, now + 365 days);
            uint256 suppliedTokenAmount = token.totalSupply();

            // Reserve
            uint256 reservedTokenAmount = safeDiv(safeMul(suppliedTokenAmount, 3), 10); // 18%
            token.issue(address(lockedTokens), reservedTokenAmount);
            lockedTokens.addTokens(reserveTokenWallet, reservedTokenAmount, now + 183 days);

            // Advisors
            uint256 advisorsTokenAmount = safeDiv(suppliedTokenAmount, 10); // 6%
            token.issue(advisorsTokenWallet, advisorsTokenAmount);

            // Company
            uint256 companyTokenAmount = safeDiv(suppliedTokenAmount, 4); // 15%
            token.issue(address(lockedTokens), companyTokenAmount);
            lockedTokens.addTokens(companyTokenWallet, companyTokenAmount, now + 730 days);

            // Bounty
            uint256 bountyTokenAmount = safeDiv(suppliedTokenAmount, 60); // 1%
            token.issue(bountyTokenWallet, bountyTokenAmount);
            token.finishIssuance();
        } else if(now >= SALE_END_TIME) {
            // Enable fund`s crowdsale refund if soft cap is not reached
            fund.enableCrowdsaleRefund();
            reservationFund.onCrowdsaleEnd();
            token.finishIssuance();
            bnbRefundEnabled = true;
        }
    }

    /**
     * @dev Withdraw bnb after crowdsale if crowdsale is not in refund mode
     */
    function withdrawBNB() public onlyOwner {
        require(bnbWithdrawEnabled);
        // BNB transfer
        if(bnbToken.balanceOf(address(this)) > 0) {
            bnbToken.transfer(bnbTokenWallet, bnbToken.balanceOf(address(this)));
        }
    }

    /**
     * @dev Function is called by contributor to refund BNB token payments if crowdsale failed to reach soft cap
     */
    function refundBNBContributor() public {
        require(bnbRefundEnabled);
        require(bnbContributions[msg.sender] > 0);
        uint256 amount = bnbContributions[msg.sender];
        bnbContributions[msg.sender] = 0;
        bnbToken.transfer(msg.sender, amount);
        token.destroy(msg.sender, token.balanceOf(msg.sender));
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"BNB_HARD_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bnbTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"privilegedList","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bnbWithdrawEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MIN_CONTRIB","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MAX_CONTRIB_PRIVATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBNB","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SALE_END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bnbToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rawTokenSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BNB_TOKEN_PRICE_DENOM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contributor","type":"address"},{"name":"tokenAmount","type":"uint256"},{"name":"tokenBonusAmount","type":"uint256"}],"name":"processReservationFundContribution","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whiteList","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bnbContributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SALE_START_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"addToWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSoftCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"addToPrivilegedList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"processBNBContribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ADDITIONAL_BONUS_DENOM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"addAdditionalBonusMember","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"isInWhiteList","type":"bool"},{"name":"isInPrivilegedList","type":"bool"},{"name":"isInLimitedList","type":"bool"},{"name":"hasAdditionalBonus","type":"bool"}],"name":"addToLists","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"forceCrowdsaleRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BNB_TOKEN_PRICE_NUM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refundBNBContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_WINDOW_4_END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"contributor","type":"address"}],"name":"isContributorInLists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_CONTRIB_CHECK_END_TIME","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":"foundationTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"softCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reserveTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBNBContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MIN_CONTRIB_USA","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"additionalBonusOwnerState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MIN_CONTRIB_PRIVATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"lockedTokensAddress","type":"address"}],"name":"setLockedTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ADDITIONAL_BONUS_NUM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fund","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reservationFund","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referralTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPriceNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bountyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hardCap","type":"uint256"}],"name":"setHardCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_softCap","type":"uint256"}],"name":"setSoftCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"confirmOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_WINDOW_2_END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_WINDOW_1_END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BNB_MIN_CONTRIB","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"advisorsTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MAX_CONTRIB_USA","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userTotalContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenPriceNum","type":"uint256"},{"name":"_tokenPriceDenom","type":"uint256"}],"name":"setTokenPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bnbRefundEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"companyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ETHER_MAX_CONTRIB","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPriceDenom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_WINDOW_3_END_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hardCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"bnbTokenAddress","type":"address"},{"name":"tokenAddress","type":"address"},{"name":"fundAddress","type":"address"},{"name":"reservationFundAddress","type":"address"},{"name":"_bnbTokenWallet","type":"address"},{"name":"_referralTokenWallet","type":"address"},{"name":"_foundationTokenWallet","type":"address"},{"name":"_advisorsTokenWallet","type":"address"},{"name":"_companyTokenWallet","type":"address"},{"name":"_reserveTokenWallet","type":"address"},{"name":"_bountyTokenWallet","type":"address"},{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contributor","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"tokenBonus","type":"uint256"},{"indexed":false,"name":"additionalBonusApplied","type":"bool"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contributor","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"tokensToIssue","type":"uint256"},{"indexed":false,"name":"bonusTokensToIssue","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"ReservationFundContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contributor","type":"address"},{"indexed":false,"name":"amountBNB","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"tokenBonus","type":"uint256"},{"indexed":false,"name":"additionalBonusApplied","type":"bool"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogBNBContribution","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60606040526001805460a060020a60ff021916905560006002819055600381905560138190556014819055693f870857a3e0e3800000601655683635c9adc5dea000006017556019819055601a805460ff19908116909155601b829055601c91909155601d80549091169055341561007657600080fd5b6040516101808062002cc38339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150819050600160a060020a038116156100f257806100f4565b335b60008054600160a060020a031916600160a060020a039283161790558c161515905061011f57600080fd5b5060158054600160a060020a0319908116600160a060020a039d8e16179091556004805482169b8d169b909b17909a55600580548b16998c1699909917909855600680548a16978b1697909717909655600c80548916958a1695909517909455600d8054881693891693909317909255600e80548716918816919091179055600f80548616918716919091179055601080548516918616919091179055601180548416918516919091179055601280549092169216919091179055612ad980620001ea6000396000f3006060604052600436106103075763ffffffff60e060020a60003504166212d90a81146103eb5780630bf318a3146104105780630ce4e104146104235780630eb34740146104525780631167b01214610465578063117387351461049857806316cb9100146104ab57806316cff09c146104be5780631d111d13146104d157806320a0045a146104e45780632b17b6a9146104f75780632cae9add1461050a5780632d7ed15c1461051d57806337033be614610530578063372c12b11461054a5780633f4ba83a146105695780633fc9b4231461057c57806344dbb5711461059b57806347ee0394146105ae5780634d52a512146105cd5780634f0b8374146105e0578063511d2299146105ff57806352860ea21461061257806352f18042146106255780635707812e146106445780635c975abb1461067757806362024dce1461068a5780636217903f1461069d578063668c1a46146106b057806372e2cac8146106c3578063772fdcb1146106d65780638456cb59146106f5578063857ba7fb146107085780638da5cb5b1461071b578063903171ae1461072e578063906a26e01461074157806392a0fd641461075457806393632ddd14610767578063a3223d50146104ab578063a336ffa51461077a578063aa1f609f146107bd578063acb9656c146107d0578063b0d3a396146107ef578063b591fc6914610802578063b60d428814610815578063b78c151714610828578063cc96019f1461083b578063cea024d91461084e578063d0e6cfec14610861578063d18d944b14610874578063d4ee1d901461088a578063d5cf5c721461089d578063d5d1e770146108b3578063d81f9830146108c6578063df0da20e146108d9578063dfb3557b146108ec578063e6ff0853146108ff578063e8faf89c14610912578063eb6389a514610925578063eb685c4714610944578063f1762e5d1461095d578063f190a79314610970578063f2fde38b14610983578063f3b5678f14610912578063f79ebd7f146109a2578063fb23bbb1146109b5578063fb86a404146109c8578063fc0c546a146109db575b60015460a060020a900460ff161561031e57600080fd5b600160a060020a03331660009081526008602052604090205460ff168061035d5750600160a060020a03331660009081526009602052604090205460ff165b806103cb5750600454600160a060020a0316632e2174053360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156103b357600080fd5b5af115156103c057600080fd5b505050604051805190505b156103df576103da33346109ee565b6103e9565b6103e93334610b38565b005b34156103f657600080fd5b6103fe610d45565b60405190815260200160405180910390f35b341561041b57600080fd5b6103e9610d4b565b341561042e57600080fd5b6104366114e2565b604051600160a060020a03909116815260200160405180910390f35b341561045d57600080fd5b6104366114f1565b341561047057600080fd5b610484600160a060020a0360043516611500565b604051901515815260200160405180910390f35b34156104a357600080fd5b610484611515565b34156104b657600080fd5b6103fe61151e565b34156104c957600080fd5b6103fe61152a565b34156104dc57600080fd5b6103e9611537565b34156104ef57600080fd5b6103fe6116a5565b341561050257600080fd5b6104366116ad565b341561051557600080fd5b6103fe6116bc565b341561052857600080fd5b6103fe6116c2565b6103e9600160a060020a03600435166024356044356116c7565b341561055557600080fd5b610484600160a060020a0360043516611724565b341561057457600080fd5b6103e9611739565b341561058757600080fd5b6103fe600160a060020a03600435166117b8565b34156105a657600080fd5b6103fe6117ca565b34156105b957600080fd5b6103e9600160a060020a03600435166117d2565b34156105d857600080fd5b6103fe611811565b34156105eb57600080fd5b6103e9600160a060020a0360043516611818565b341561060a57600080fd5b6103e9611857565b341561061d57600080fd5b6103fe611baa565b341561063057600080fd5b6103e9600160a060020a0360043516611baf565b341561064f57600080fd5b6103e9600160a060020a03600435166024351515604435151560643515156084351515611bee565b341561068257600080fd5b610484611dbe565b341561069557600080fd5b6103e9611dce565b34156106a857600080fd5b6103fe611ef6565b34156106bb57600080fd5b6103e9611efb565b34156106ce57600080fd5b6103fe612081565b34156106e157600080fd5b610484600160a060020a0360043516612089565b341561070057600080fd5b6103e961213c565b341561071357600080fd5b6103fe6121c0565b341561072657600080fd5b6104366121c8565b341561073957600080fd5b6104366121d7565b341561074c57600080fd5b6103fe6121e6565b341561075f57600080fd5b6104366121ec565b341561077257600080fd5b6103fe6121fb565b341561078557600080fd5b610799600160a060020a0360043516612201565b604051808260028111156107a957fe5b60ff16815260200191505060405180910390f35b34156107c857600080fd5b6103fe612216565b34156107db57600080fd5b6103e9600160a060020a0360043516612223565b34156107fa57600080fd5b6103fe61226d565b341561080d57600080fd5b6103fe612272565b341561082057600080fd5b610436612278565b341561083357600080fd5b610436612287565b341561084657600080fd5b610436612296565b341561085957600080fd5b6103fe6122a5565b341561086c57600080fd5b6104366122ab565b341561087f57600080fd5b6103e96004356122ba565b341561089557600080fd5b6104366122e7565b34156108a857600080fd5b6103e96004356122f6565b34156108be57600080fd5b6103e9612323565b34156108d157600080fd5b6103fe6123ca565b34156108e457600080fd5b6103fe6123d2565b34156108f757600080fd5b6103fe6123da565b341561090a57600080fd5b6104366123e0565b341561091d57600080fd5b6103fe6123ef565b341561093057600080fd5b6103fe600160a060020a03600435166123fc565b341561094f57600080fd5b6103e960043560243561240e565b341561096857600080fd5b61048461246a565b341561097b57600080fd5b610436612473565b341561098e57600080fd5b6103e9600160a060020a0360043516612482565b34156109ad57600080fd5b6103fe6124e7565b34156109c057600080fd5b6103fe6124ed565b34156109d357600080fd5b6103fe6124f5565b34156109e657600080fd5b6104366124fb565b600080600080600080635ad74f604210158015610a0f5750635afc39604211155b1515610a1a57600080fd5b610a2261250a565b1515610a2d57600080fd5b610a356126ac565b1515610a4057600080fd5b600095506000945060649350610a546126d0565b809550819650505060009250610a77610a6f88600254612738565b600354612763565b9150610a856014548361277a565b6014556000851115610aa757610aa4610a9e8387612738565b85612763565b92505b6001600160a060020a0389166000908152600a602052604090205460ff166002811115610ad057fe5b1415610b2157600160a060020a0388166000908152600a60205260409020805460ff19166002179055610b0e610b07836003612738565b6064612763565b9050610b1a838261277a565b9250600195505b610b2e888884868a612789565b5050505050505050565b6000806000806000635ad74f604210158015610b585750635afc39604211155b1515610b6357600080fd5b610b6b6126ac565b1515610b7657600080fd5b6702c68af0bb140000861015610b8b57600080fd5b635ad8a0e04211610c2057600654610c08908790600160a060020a0316633af0dbc18a60405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610bec57600080fd5b5af11515610bf957600080fd5b5050506040518051905061277a565b94506801158e460913d00000851115610c2057600080fd5b6000935060649250610c306126d0565b809450819550505060009150610c4b610a6f87600254612738565b90506000841115610c6c57610c69610c638286612738565b84612763565b91505b600654600160a060020a031663ef8b0e158789848660405160e060020a63ffffffff8716028152600160a060020a039093166004840152602483019190915260448201526064016000604051808303818588803b1515610ccb57600080fd5b5af11515610cd857600080fd5b505050507ffc42b1040c2ac21c825c42ccdad60925abb0462e7bd3a47cf21ad859ee8665468787838542604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a150505050505050565b60165481565b6000805481908190819081908190819033600160a060020a03908116911614610d7357600080fd5b610d88601b54683635c9adc5dea0000061292e565b601354101580610dab5750635afc39604210158015610dab5750601c5460135410155b156113ca57600554600160a060020a0316636252c1276040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610def57600080fd5b5af11515610dfc57600080fd5b5050600654600160a060020a03169050636252c1276040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610e3f57600080fd5b5af11515610e4c57600080fd5b5050601a805460ff1916600117905550601454610e6a90600a612763565b600454600d54919850600160a060020a039081169163867904b491168960405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610eca57600080fd5b5af11515610ed757600080fd5b5050600454610f3b9150600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f1d57600080fd5b5af11515610f2a57600080fd5b505050604051805190506002612763565b600454600754919750600160a060020a039081169163867904b491168860405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610f9b57600080fd5b5af11515610fa857600080fd5b5050600754600e54600160a060020a03918216925063ca056aed9116886301e13380420160405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b151561101757600080fd5b5af1151561102457600080fd5b5050600454600160a060020a031690506318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561106757600080fd5b5af1151561107457600080fd5b50505060405180519050945061109561108e866003612738565b600a612763565b600454600754919550600160a060020a039081169163867904b491168660405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156110f557600080fd5b5af1151561110257600080fd5b5050600754601154600160a060020a03918216925063ca056aed91168662f14280420160405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b151561117057600080fd5b5af1151561117d57600080fd5b50505061118b85600a612763565b600454600f54919450600160a060020a039081169163867904b491168560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156111eb57600080fd5b5af115156111f857600080fd5b505050611206856004612763565b600454600754919350600160a060020a039081169163867904b491168460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561126657600080fd5b5af1151561127357600080fd5b5050600754601054600160a060020a03918216925063ca056aed9116846303c26700420160405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b15156112e257600080fd5b5af115156112ef57600080fd5b5050506112fd85603c612763565b600454601254919250600160a060020a039081169163867904b491168360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561135d57600080fd5b5af1151561136a57600080fd5b5050600454600160a060020a0316905063c422293b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156113ad57600080fd5b5af115156113ba57600080fd5b50505060405180519050506114d9565b635afc396042106114d957600554600160a060020a0316633b64e77e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561141457600080fd5b5af1151561142157600080fd5b5050600654600160a060020a03169050636252c1276040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561146457600080fd5b5af1151561147157600080fd5b5050600454600160a060020a0316905063c422293b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156114b457600080fd5b5af115156114c157600080fd5b50505060405180515050601d805460ff191660011790555b50505050505050565b600c54600160a060020a031681565b600754600160a060020a031681565b60096020526000908152604090205460ff1681565b601a5460ff1681565b6702c68af0bb14000081565b68a2a15d09519be0000081565b60005433600160a060020a0390811691161461155257600080fd5b601a5460ff16151561156357600080fd5b601554600090600160a060020a03166370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156115b657600080fd5b5af115156115c357600080fd5b5050506040518051905011156116a357601554600c54600160a060020a039182169163a9059cbb9116826370a082313060405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561163157600080fd5b5af1151561163e57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561168b57600080fd5b5af1151561169857600080fd5b505050604051805150505b565b635afc396081565b601554600160a060020a031681565b60145481565b600181565b6116cf6126ac565b15156116da57600080fd5b60065433600160a060020a039081169116146116f557600080fd5b6000341161170257600080fd5b61170e6014548361277a565b60145561171f833484846000612789565b505050565b60086020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461175457600080fd5b60015460a060020a900460ff16151561176c57600080fd5b6001805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60186020526000908152604090205481565b635ad74f6081565b60005433600160a060020a039081169116146117ed57600080fd5b600160a060020a03166000908152600860205260409020805460ff19166001179055565b601c545b90565b60005433600160a060020a0390811691161461183357600080fd5b600160a060020a03166000908152600960205260409020805460ff19166001179055565b600080600080600080600080600160149054906101000a900460ff1615151561187f57600080fd5b635ad74f6042101580156118975750635afc39604211155b15156118a257600080fd5b6118aa612940565b15156118b557600080fd5b6000975060009650606495506118c96126d0565b6015549198509650600160a060020a031663dd62ed3e333060405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b151561192657600080fd5b5af1151561193357600080fd5b5050506040518051601554909650600160a060020a031690506323b872dd33308860405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156119a357600080fd5b5af115156119b057600080fd5b50505060405180515050600160a060020a0333166000908152601860205260409020546119dd908661277a565b600160a060020a0333166000908152601860205260408120919091559350611a10611a098660a9612738565b6001612763565b9250611a1e6014548461277a565b6014556000871115611a4057611a3d611a378489612738565b87612763565b93505b6001600160a060020a0333166000908152600a602052604090205460ff166002811115611a6957fe5b1415611ab35733600160a060020a03166000908152600a60205260409020805460ff19166002179055611aa0610b07846003612738565b9150611aac848361277a565b9350600197505b611abd838561277a565b600454909150600160a060020a031663867904b4338360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611b1657600080fd5b5af11515611b2357600080fd5b505050611b326019548661277a565b6019557f934a07288cb83800d6bb14a38c6c12f397a925ad87ce3b745c6804db1ecee24f338685878c42604051600160a060020a039096168652602086019490945260408086019390935260608501919091521515608084015260a083019190915260c0909101905180910390a15050505050505050565b606481565b60005433600160a060020a03908116911614611bca57600080fd5b600160a060020a03166000908152600a60205260409020805460ff19166001179055565b60005433600160a060020a03908116911614611c0957600080fd5b8315611c3357600160a060020a0385166000908152600860205260409020805460ff191660011790555b8215611c5d57600160a060020a0385166000908152600960205260409020805460ff191660011790555b8115611cc457600454600160a060020a031663ee8cbc9d8660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611cb357600080fd5b5af11515611cc057600080fd5b5050505b8015611cee57600160a060020a0385166000908152600a60205260409020805460ff191660011790555b600654600160a060020a031663f50a26448660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611d3e57600080fd5b5af11515611d4b57600080fd5b5050506040518051905015611db757600654600160a060020a03166331aa91fc8660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611daa57600080fd5b5af11515610b2e57600080fd5b5050505050565b60015460a060020a900460ff1681565b60005433600160a060020a03908116911614611de957600080fd5b611df161213c565b600554600160a060020a0316633b64e77e6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611e3057600080fd5b5af11515611e3d57600080fd5b5050600654600160a060020a03169050636252c1276040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515611e8057600080fd5b5af11515611e8d57600080fd5b5050600454600160a060020a0316905063c422293b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611ed057600080fd5b5af11515611edd57600080fd5b50505060405180515050601d805460ff19166001179055565b60a981565b601d5460009060ff161515611f0f57600080fd5b600160a060020a03331660009081526018602052604081205411611f3257600080fd5b50600160a060020a033381811660009081526018602052604080822080549290556015549193919091169163a9059cbb9184905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fa657600080fd5b5af11515611fb357600080fd5b50505060405180515050600454600160a060020a031663a24835d133826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561206e57600080fd5b5af1151561207b57600080fd5b50505050565b635af2fee081565b600160a060020a03811660009081526008602052604081205460ff16806120c85750600160a060020a03821660009081526009602052604090205460ff165b806121365750600454600160a060020a0316632e2174058360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561211e57600080fd5b5af1151561212b57600080fd5b505050604051805190505b92915050565b60005433600160a060020a0390811691161461215757600080fd5b60015460a060020a900460ff161561216e57600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b635ad8a0e081565b600054600160a060020a031681565b600e54600160a060020a031681565b601c5481565b601154600160a060020a031681565b60195481565b600a6020526000908152604090205460ff1681565b68056bc75e2d6310000081565b60005433600160a060020a0390811691161461223e57600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600381565b60135481565b600554600160a060020a031681565b600654600160a060020a031681565b600d54600160a060020a031681565b60025481565b601254600160a060020a031681565b60005433600160a060020a039081169116146122d557600080fd5b601b54156122e257600080fd5b601b55565b600154600160a060020a031681565b60005433600160a060020a0390811691161461231157600080fd5b601c541561231e57600080fd5b601c55565b60015433600160a060020a0390811691161461233e57600080fd5b6000546001547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b635ae089e081565b635ad9f26081565b60175481565b600f54600160a060020a031681565b6801158e460913d0000081565b600b6020526000908152604090205481565b60005433600160a060020a0390811691161461242957600080fd5b6002541580156124395750600354155b151561244457600080fd5b6000821180156124545750600081115b151561245f57600080fd5b600291909155600355565b601d5460ff1681565b601054600160a060020a031681565b60005433600160a060020a0390811691161461249d57600080fd5b600054600160a060020a03828116911614156124b857600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035481565b635ae9c46081565b601b5481565b600454600160a060020a031681565b600160a060020a0333166000908152600b6020526040812054819061253090349061277a565b600160a060020a03331660009081526008602052604090205490915060ff16801561256357506702c68af0bb1400003410155b1561259b57635ad8a0e0421180159061258457506801158e460913d0000081115b1561259257600091506126a8565b600191506126a8565b600160a060020a03331660009081526009602052604090205460ff1680156125cc575068056bc75e2d631000003410155b156125fa57635ad8a0e04211801590612584575068a2a15d09519be0000081111561259257600091506126a8565b600454600160a060020a0316632e2174053360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561264a57600080fd5b5af1151561265757600080fd5b50505060405180519050801561267557506702c68af0bb1400003410155b156126a357635ad8a0e0421180159061258457506801158e460913d0000081111561259257600091506126a8565b600091505b5090565b60006126bc601b5460135461292e565b34116126ca57506001611815565b50600090565b600080806064635ad9f2604210156126eb576019915061272f565b635ae089e042101561270057600f915061272f565b635ae9c46042101561271557600a915061272f565b635af2fee042101561272a576005915061272f565b600091505b90939092509050565b6000828202831580612754575082848281151561275157fe5b04145b151561275c57fe5b9392505050565b600080828481151561277157fe5b04949350505050565b60008282018381101561275c57fe5b6000612795848461277a565b600454909150600160a060020a031663867904b4878360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156127ee57600080fd5b5af115156127fb57600080fd5b5050600554600160a060020a0316905063a78a651a868860405160e060020a63ffffffff8516028152600160a060020a0390911660048201526024016000604051808303818588803b151561284f57600080fd5b5af1151561285c57600080fd5b5050505061286c6013548661277a565b601355600160a060020a0386166000908152600b6020526040902054612892908661277a565b600b600088600160a060020a0316600160a060020a03168152602001908152602001600020819055507f77cbff9b281bbc6839ce326b536ee9d11c49c42e936fe518d7c47d7296f73424868686868642604051600160a060020a039096168652602086019490945260408086019390935260608501919091521515608084015260a083019190915260c0909101905180910390a1505050505050565b60008183101561293a57fe5b50900390565b6004546000908190600160a060020a0316632e2174053360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561299557600080fd5b5af115156129a257600080fd5b50505060405180519050156129ba57600091506126a8565b600160a060020a03331660009081526008602052604090205460ff161580156129fc5750600160a060020a03331660009081526009602052604090205460ff16155b15612a0a57600091506126a8565b601554600160a060020a031663dd62ed3e333060405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515612a6257600080fd5b5af11515612a6f57600080fd5b505050604051805190509050601754811080612a975750601654612a956019548361277a565b115b15612aa557600091506126a8565b6001915050905600a165627a7a7230582000085a7c69db841a94328afc45904e3c776ec53cb5bb04a9f82263fff734cdc10029000000000000000000000000b8c77482e45f1f44de1745f52c74426c631bdd520000000000000000000000000e8d6b471e332f140e7d9dbb99e5e3822f728da600000000000000000000000049db6ee4507132d1fdac92318e0e6150bf786728000000000000000000000000035611f47a13f3603109152952f0034c674959ba000000000000000000000000ba121eba02961b7fa53fafcbb53826e1acd5a472000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c30000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f300000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b90000000000000000000000005686508abbff20db6a582643280601ef53b58ddf000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b876040000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f

    Constructor Arguments (ABI-encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b8c77482e45f1f44de1745f52c74426c631bdd520000000000000000000000000e8d6b471e332f140e7d9dbb99e5e3822f728da600000000000000000000000049db6ee4507132d1fdac92318e0e6150bf786728000000000000000000000000035611f47a13f3603109152952f0034c674959ba000000000000000000000000ba121eba02961b7fa53fafcbb53826e1acd5a472000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c30000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f300000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b90000000000000000000000005686508abbff20db6a582643280601ef53b58ddf000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b876040000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f

-----Decoded View---------------
Found 12 constructor arguments :
Arg [0] : 000000000000000000000000b8c77482e45f1f44de1745f52c74426c631bdd52
Arg [1] : 0000000000000000000000000e8d6b471e332f140e7d9dbb99e5e3822f728da6
Arg [2] : 00000000000000000000000049db6ee4507132d1fdac92318e0e6150bf786728
Arg [3] : 000000000000000000000000035611f47a13f3603109152952f0034c674959ba
Arg [4] : 000000000000000000000000ba121eba02961b7fa53fafcbb53826e1acd5a472
Arg [5] : 000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c3
Arg [6] : 0000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f3
Arg [7] : 00000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b9
Arg [8] : 0000000000000000000000005686508abbff20db6a582643280601ef53b58ddf
Arg [9] : 000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f
Arg [10] : 00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b87604
Arg [11] : 0000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f


   Swarm Source:
bzzr://00085a7c69db841a94328afc45904e3c776ec53cb5bb04a9f82263fff734cdc1

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.