Transaction Hash:
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 | ||
---|---|---|---|---|---|
0x2cC1060D...1de49adb2 | |||||
0x588FD976...A25426140 |
0.018360480865891898 Eth
Nonce: 2
|
0.010752880865891898 Eth
Nonce: 3
| 0.0076076 | ||
0xB8F82b07...54a405453
Miner
| 29.778944287939783466 Eth | 29.781551887939783466 Eth | 0.0026076 | ||
0xF8EEd1AE...74A680830 | 19,137.276932642468250663 Eth | 19,137.281932642468250663 Eth | 0.005 |
Execution Trace
ETH 0.005
UbexCrowdsale.CALL( )
- ETH 0.005
0xf8eed1ae306a07d8899de8dabc3783974a680830.CALL( )
[Crowdsale (ln:134)]
buyTokens[Crowdsale (ln:135)]
_preValidatePurchase[Crowdsale (ln:145)]
_getTokenAmount[Crowdsale (ln:148)]
add[Crowdsale (ln:151)]
_processPurchase[Crowdsale (ln:153)]
_deliverTokens[Crowdsale (ln:205)]
transfer[Crowdsale (ln:196)]
TokenPurchase[Crowdsale (ln:154)]
_updatePurchasingState[Crowdsale (ln:161)]
_forwardFunds[Crowdsale (ln:163)]
transfer[Crowdsale (ln:230)]
_postValidatePurchase[Crowdsale (ln:164)]
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); } }