Transaction Hash:
Block:
7583066 at Apr-17-2019 04:03:34 AM +UTC
Transaction Fee:
0.000037424 ETH
$0.09
Gas Used:
37,424 Gas / 1 Gwei
Emitted Events:
63 |
BonusCloudToken.Transfer( _from=[Sender] 0xbcf0009a658d925691969e6ebac870c382f9f91d, _to=0xDEdf83Ab10684496f7707A6DCf575E22d4f3eFBF, _value=100000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0xbCF0009A...382f9F91D |
3.834220318503097763 Eth
Nonce: 16
|
3.834182894503097763 Eth
Nonce: 17
| 0.000037424 | ||
0xdeCF7Be2...8Ba76af43 | |||||
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 237.668257489999251609 Eth | 237.668294913999251609 Eth | 0.000037424 |
Execution Trace
BonusCloudToken.transfer( _to=0xDEdf83Ab10684496f7707A6DCf575E22d4f3eFBF, _value=100000000000000000000 ) => ( success=True )
transfer[ERC20TokenInterface (ln:110)]
pragma solidity ^0.4.24; /** * @dev Library that helps prevent integer overflows and underflows, * inspired by https://github.com/OpenZeppelin/zeppelin-solidity */ library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0); uint256 c = a / b; return c; } } /** * @title HasOwner * * @dev Allows for exclusive access to certain functionality. */ contract HasOwner { // Current owner. address public owner; // Conditionally the new owner. address public newOwner; /** * @dev The constructor. * * @param _owner The address of the owner. */ constructor(address _owner) internal { owner = _owner; } /** * @dev Access control modifier that allows only the current owner to call the function. */ modifier onlyOwner { require(msg.sender == owner); _; } /** * @dev The event is fired when the current owner is changed. * * @param _oldOwner The address of the previous owner. * @param _newOwner The address of the new owner. */ event OwnershipTransfer(address indexed _oldOwner, address indexed _newOwner); /** * @dev Transfering the ownership is a two-step process, as we prepare * for the transfer by setting `newOwner` and requiring `newOwner` to accept * the transfer. This prevents accidental lock-out if something goes wrong * when passing the `newOwner` address. * * @param _newOwner The address of the proposed new owner. */ function transferOwnership(address _newOwner) public onlyOwner { newOwner = _newOwner; } /** * @dev The `newOwner` finishes the ownership transfer process by accepting the * ownership. */ function acceptOwnership() public { require(msg.sender == newOwner); emit OwnershipTransfer(owner, newOwner); owner = newOwner; } } /** * @dev The standard ERC20 Token interface. */ contract ERC20TokenInterface { uint256 public totalSupply; /* shorthand for public function and a property */ event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); 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); } /** * @title ERC20Token * * @dev Implements the operations declared in the `ERC20TokenInterface`. */ contract ERC20Token is ERC20TokenInterface { using SafeMath for uint256; // Token account balances. mapping (address => uint256) balances; // Delegated number of tokens to transfer. mapping (address => mapping (address => uint256)) allowed; /** * @dev Checks the balance of a certain address. * * @param _account The address which's balance will be checked. * * @return Returns the balance of the `_account` address. */ function balanceOf(address _account) public constant returns (uint256 balance) { return balances[_account]; } /** * @dev Transfers tokens from one address to another. * * @param _to The target address to which the `_value` number of tokens will be sent. * @param _value The number of tokens to send. * * @return Whether the transfer was successful or not. */ function transfer(address _to, uint256 _value) public returns (bool success) { require(_to != address(0)); require(_value <= balances[msg.sender]); require(_value > 0); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Send `_value` tokens to `_to` from `_from` if `_from` has approved the process. * * @param _from The address of the sender. * @param _to The address of the recipient. * @param _value The number of tokens to be transferred. * * @return Whether the transfer was successful or not. */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_value > 0); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Allows another contract to spend some tokens on your behalf. * * @param _spender The address of the account which will be approved for transfer of tokens. * @param _value The number of tokens to be approved for transfer. * * @return Whether the approval was successful or not. */ function approve(address _spender, uint256 _value) public returns (bool success) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @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 MonolithDAO Token.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, uint256 _addedValue) public returns (bool) { allowed[msg.sender][_spender] = (allowed[msg.sender][_spender].add(_addedValue)); emit 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 MonolithDAO Token.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, uint256 _subtractedValue) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Shows the number of tokens approved by `_owner` that are allowed to be transferred by `_spender`. * * @param _owner The account which allowed the transfer. * @param _spender The account which will spend the tokens. * * @return The number of tokens to be transferred. */ function allowance(address _owner, address _spender) public constant returns (uint256 remaining) { return allowed[_owner][_spender]; } /** * Don't accept ETH */ function () public payable { revert(); } } /** * @title Freezable * @dev This trait allows to freeze the transactions in a Token */ contract Freezable is HasOwner { bool public frozen = false; /** * @dev Modifier makes methods callable only when the contract is not frozen. */ modifier requireNotFrozen() { require(!frozen); _; } /** * @dev Allows the owner to "freeze" the contract. */ function freeze() onlyOwner public { frozen = true; } /** * @dev Allows the owner to "unfreeze" the contract. */ function unfreeze() onlyOwner public { frozen = false; } } /** * @title FreezableERC20Token * * @dev Extends ERC20Token and adds ability to freeze all transfers of tokens. */ contract FreezableERC20Token is ERC20Token, Freezable { /** * @dev Overrides the original ERC20Token implementation by adding whenNotFrozen modifier. * * @param _to The target address to which the `_value` number of tokens will be sent. * @param _value The number of tokens to send. * * @return Whether the transfer was successful or not. */ function transfer(address _to, uint _value) public requireNotFrozen returns (bool success) { return super.transfer(_to, _value); } /** * @dev Send `_value` tokens to `_to` from `_from` if `_from` has approved the process. * * @param _from The address of the sender. * @param _to The address of the recipient. * @param _value The number of tokens to be transferred. * * @return Whether the transfer was successful or not. */ function transferFrom(address _from, address _to, uint _value) public requireNotFrozen returns (bool success) { return super.transferFrom(_from, _to, _value); } /** * @dev Allows another contract to spend some tokens on your behalf. * * @param _spender The address of the account which will be approved for transfer of tokens. * @param _value The number of tokens to be approved for transfer. * * @return Whether the approval was successful or not. */ function approve(address _spender, uint _value) public requireNotFrozen returns (bool success) { return super.approve(_spender, _value); } function increaseApproval(address _spender, uint256 _addedValue) public requireNotFrozen returns (bool) { return super.increaseApproval(_spender, _addedValue); } function decreaseApproval(address _spender, uint256 _subtractedValue) public requireNotFrozen returns (bool) { return super.decreaseApproval(_spender, _subtractedValue); } } /** * @title BonusCloudTokenConfig * * @dev The static configuration for the Bonus Cloud Token. */ contract BonusCloudTokenConfig { // The name of the token. string constant NAME = "BonusCloud Token"; // The symbol of the token. string constant SYMBOL = "BxC"; // The number of decimals for the token. uint8 constant DECIMALS = 18; // Decimal factor for multiplication purposes. uint256 constant DECIMALS_FACTOR = 10 ** uint(DECIMALS); // TotalSupply uint256 constant TOTAL_SUPPLY = 7000000000 * DECIMALS_FACTOR; } /** * @title Bonus Cloud Token * * @dev A standard token implementation of the ERC20 token standard with added * HasOwner trait and initialized using the configuration constants. */ contract BonusCloudToken is BonusCloudTokenConfig, HasOwner, FreezableERC20Token { // The name of the token. string public name; // The symbol for the token. string public symbol; // The decimals of the token. uint8 public decimals; /** * @dev The constructor. * */ constructor() public HasOwner(msg.sender) { name = NAME; symbol = SYMBOL; decimals = DECIMALS; totalSupply = TOTAL_SUPPLY; balances[owner] = TOTAL_SUPPLY; } }