ETH Price: $1,874.34 (+0.26%)

Transaction Decoder

Block:
6331193 at Sep-14-2018 04:42:07 PM +UTC
Transaction Fee:
0.0026076 ETH $4.89
Gas Used:
63,600 Gas / 41 Gwei

Emitted Events:

2 UbexCrowdsale.TokenPurchase( purchaser=[Sender] 0x588fd9769edad341008b30ade65c440a25426140, beneficiary=[Sender] 0x588fd9769edad341008b30ade65c440a25426140, value=5000000000000000, amount=500000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x2cC1060D...1de49adb2
0x588FD976...A25426140
0.018360480865891898 Eth
Nonce: 2
0.010752880865891898 Eth
Nonce: 3
0.0076076
29.778944287939783466 Eth29.781551887939783466 Eth0.0026076
0xF8EEd1AE...74A680830 19,137.276932642468250663 Eth19,137.281932642468250663 Eth0.005

Execution Trace

ETH 0.005 UbexCrowdsale.CALL( )
  • ETH 0.005 0xf8eed1ae306a07d8899de8dabc3783974a680830.CALL( )
    pragma solidity ^0.4.23;
    
    
    /**
     * @title ERC20Basic
     * @dev Simpler version of ERC20 interface
     * @dev see https://github.com/ethereum/EIPs/issues/179
     */
    contract ERC20Basic {
        function totalSupply() public view returns (uint256);
        function balanceOf(address who) public view returns (uint256);
        function transfer(address to, uint256 value) public returns (bool);
        event Transfer(address indexed from, address indexed to, uint256 value);
    }
    
    
    /**
     * @title ERC20 interface
     * @dev see https://github.com/ethereum/EIPs/issues/20
     */
    contract ERC20 is ERC20Basic {
        function allowance(address owner, address spender) public view returns (uint256);
        function transferFrom(address from, address to, uint256 value) public returns (bool);
        function approve(address spender, uint256 value) public returns (bool);
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    
    /**
     * @title SafeMath
     * @dev Math operations with safety checks that throw on error
     */
    library SafeMath {
    
        /**
        * @dev Multiplies two numbers, throws on overflow.
        */
        function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
            if (a == 0) {
                return 0;
            }
            c = a * b;
            assert(c / a == b);
            return c;
        }
    
        /**
        * @dev Integer division of two numbers, truncating the quotient.
        */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            // assert(b > 0); // Solidity automatically throws when dividing by 0
            // uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
            return a / b;
        }
    
        /**
        * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
        */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            assert(b <= a);
            return a - b;
        }
    
        /**
        * @dev Adds two numbers, throws on overflow.
        */
        function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
            c = a + b;
            assert(c >= a);
            return c;
        }
    }
    
    
    /**
     * @title Crowdsale
     * @dev Crowdsale is a base contract for managing a token crowdsale,
     * allowing investors to purchase tokens with ether. This contract implements
     * such functionality in its most fundamental form and can be extended to provide additional
     * functionality and/or custom behavior.
     * The external interface represents the basic interface for purchasing tokens, and conform
     * the base architecture for crowdsales. They are *not* intended to be modified / overriden.
     * The internal interface conforms the extensible and modifiable surface of crowdsales. Override
     * the methods to add functionality. Consider using 'super' where appropiate to concatenate
     * behavior.
     */
    contract Crowdsale {
        using SafeMath for uint256;
    
        // The token being sold
        ERC20 public token;
    
        // Address where funds are collected
        address public wallet;
    
        // How many token units a buyer gets per wei
        uint256 public rate;
    
        // Amount of wei raised
        uint256 public weiRaised;
    
        /**
         * Event for token purchase logging
         * @param purchaser who paid for the tokens
         * @param beneficiary who got the tokens
         * @param value weis paid for purchase
         * @param amount amount of tokens purchased
         */
        event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
    
        /**
         * @param _rate Number of token units a buyer gets per wei
         * @param _wallet Address where collected funds will be forwarded to
         * @param _token Address of the token being sold
         */
        function Crowdsale(uint256 _rate, address _wallet, ERC20 _token) public {
            require(_rate > 0);
            require(_wallet != address(0));
            require(_token != address(0));
    
            rate = _rate;
            wallet = _wallet;
            token = _token;
        }
    
        // -----------------------------------------
        // Crowdsale external interface
        // -----------------------------------------
    
        /**
         * @dev fallback function ***DO NOT OVERRIDE***
         */
        function () external payable {
            buyTokens(msg.sender);
        }
    
        /**
         * @dev low level token purchase ***DO NOT OVERRIDE***
         * @param _beneficiary Address performing the token purchase
         */
        function buyTokens(address _beneficiary) public payable {
    
            uint256 weiAmount = msg.value;
            _preValidatePurchase(_beneficiary, weiAmount);
    
            // calculate token amount to be created
            uint256 tokens = _getTokenAmount(weiAmount);
    
            // update state
            weiRaised = weiRaised.add(weiAmount);
    
            _processPurchase(_beneficiary, tokens);
            emit TokenPurchase(
            msg.sender,
            _beneficiary,
            weiAmount,
            tokens
            );
    
            _updatePurchasingState(_beneficiary, weiAmount);
    
            _forwardFunds();
            _postValidatePurchase(_beneficiary, weiAmount);
        }
    
        // -----------------------------------------
        // Internal interface (extensible)
        // -----------------------------------------
    
        /**
         * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. Use super to concatenate validations.
         * @param _beneficiary Address performing the token purchase
         * @param _weiAmount Value in wei involved in the purchase
         */
        function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
            require(_beneficiary != address(0));
            require(_weiAmount != 0);
        }
    
        /**
         * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid conditions are not met.
         * @param _beneficiary Address performing the token purchase
         * @param _weiAmount Value in wei involved in the purchase
         */
        function _postValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
            // optional override
        }
    
        /**
         * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends its tokens.
         * @param _beneficiary Address performing the token purchase
         * @param _tokenAmount Number of tokens to be emitted
         */
        function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal {
            token.transfer(_beneficiary, _tokenAmount);
        }
    
        /**
         * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
         * @param _beneficiary Address receiving the tokens
         * @param _tokenAmount Number of tokens to be purchased
         */
        function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal {
            _deliverTokens(_beneficiary, _tokenAmount);
        }
    
        /**
         * @dev Override for extensions that require an internal state to check for validity (current user contributions, etc.)
         * @param _beneficiary Address receiving the tokens
         * @param _weiAmount Value in wei involved in the purchase
         */
        function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal {
            // optional override
        }
    
        /**
         * @dev Override to extend the way in which ether is converted to tokens.
         * @param _weiAmount Value in wei to be converted into tokens
         * @return Number of tokens that can be purchased with the specified _weiAmount
         */
        function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) {
            return _weiAmount.mul(rate);
        }
    
        /**
         * @dev Determines how ETH is stored/forwarded on purchases.
         */
        function _forwardFunds() internal {
            wallet.transfer(msg.value);
        }
    }
    
    
    /**
     * @title Ownable
     * @dev The Ownable contract has an owner address, and provides basic authorization control
     * functions, this simplifies the implementation of "user permissions".
     */
    contract Ownable {
        address public owner;
    
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    
        /**
         * @dev The Ownable constructor sets the original `owner` of the contract to the sender
         * account.
         */
        function Ownable() public {
            owner = msg.sender;
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(msg.sender == owner);
            _;
        }
    
        /**
         * @dev Allows the current owner to transfer control of the contract to a newOwner.
         * @param newOwner The address to transfer ownership to.
         */
        function transferOwnership(address newOwner) public onlyOwner {
            require(newOwner != address(0));
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
        }
    
    }
    
    
    /**
     * @title UbexCrowdsale
     * @dev Crowdsale that locks tokens from withdrawal until it ends.
     */
    contract UbexCrowdsale is Crowdsale, Ownable {
        using SafeMath for uint256;
    
        // Map of all purchaiser's balances (doesn't include bounty amounts)
        mapping(address => uint256) public balances;
    
        // Amount of issued tokens
        uint256 public tokensIssued;
    
        // Bonus tokens rate multiplier x1000 (i.e. 1200 is 1.2 x 1000 = 120% x1000 = +20% bonus)
        uint256 public bonusMultiplier;
    
        // Is a crowdsale closed?
        bool public closed;
    
        /**
         * Event for token withdrawal logging
         * @param receiver who receive the tokens
         * @param amount amount of tokens sent
         */
        event TokenDelivered(address indexed receiver, uint256 amount);
    
        /**
       * Event for token adding by referral program
       * @param beneficiary who got the tokens
       * @param amount amount of tokens added
       */
        event TokenAdded(address indexed beneficiary, uint256 amount);
    
        /**
        * Init crowdsale by setting its params
        *
        * @param _rate Number of token units a buyer gets per wei
        * @param _wallet Address where collected funds will be forwarded to
        * @param _token Address of the token being sold
        * @param _bonusMultiplier bonus tokens rate multiplier x1000
        */
        function UbexCrowdsale(
            uint256 _rate,
            address _wallet,
            ERC20 _token,
            uint256 _bonusMultiplier
        ) Crowdsale(
            _rate,
            _wallet,
            _token
        ) {
            bonusMultiplier = _bonusMultiplier;
        }
    
        /**
         * @dev Withdraw tokens only after crowdsale ends.
         */
        function withdrawTokens() public {
            _withdrawTokensFor(msg.sender);
        }
    
        /**
         * @dev Overrides parent by storing balances instead of issuing tokens right away.
         * @param _beneficiary Token purchaser
         * @param _tokenAmount Amount of tokens purchased
         */
        function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal {
            require(!hasClosed());
            balances[_beneficiary] = balances[_beneficiary].add(_tokenAmount);
            tokensIssued = tokensIssued.add(_tokenAmount);
        }
    
        /**
       * @dev Overrides the way in which ether is converted to tokens.
       * @param _weiAmount Value in wei to be converted into tokens
       * @return Number of tokens that can be purchased with the specified _weiAmount
       */
        function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) {
            return _weiAmount.mul(rate).mul(bonusMultiplier).div(1000);
        }
    
        /**
         * @dev Deliver tokens to receiver_ after crowdsale ends.
         */
        function withdrawTokensFor(address receiver_) public onlyOwner {
            _withdrawTokensFor(receiver_);
        }
    
        /**
         * @dev Checks whether the period in which the crowdsale is open has already elapsed.
         * @return Whether crowdsale period has elapsed
         */
        function hasClosed() public view returns (bool) {
            return closed;
        }
    
        /**
         * @dev Closes the period in which the crowdsale is open.
         */
        function closeCrowdsale(bool closed_) public onlyOwner {
            closed = closed_;
        }
    
        /**
         * @dev set the bonus multiplier.
         */
        function setBonusMultiplier(uint256 bonusMultiplier_) public onlyOwner {
            bonusMultiplier = bonusMultiplier_;
        }
    
        /**
         * @dev Withdraw tokens excess on the contract after crowdsale.
         */
        function postCrowdsaleWithdraw(uint256 _tokenAmount) public onlyOwner {
            token.transfer(wallet, _tokenAmount);
        }
    
        /**
         * @dev Add tokens for specified beneficiary (referral system tokens, for example).
         * @param _beneficiary Token purchaser
         * @param _tokenAmount Amount of tokens added
         */
        function addTokens(address _beneficiary, uint256 _tokenAmount) public onlyOwner {
            balances[_beneficiary] = balances[_beneficiary].add(_tokenAmount);
            tokensIssued = tokensIssued.add(_tokenAmount);
            emit TokenAdded(_beneficiary, _tokenAmount);
        }
    
        /**
         * @dev Withdraw tokens for receiver_ after crowdsale ends.
         */
        function _withdrawTokensFor(address receiver_) internal {
            require(hasClosed());
            uint256 amount = balances[receiver_];
            require(amount > 0);
            balances[receiver_] = 0;
            emit TokenDelivered(receiver_, amount);
            _deliverTokens(receiver_, amount);
        }
    }