Transaction Hash:
Block:
6714762 at Nov-16-2018 10:49:57 AM +UTC
Transaction Fee:
0.000314928 ETH
$0.63
Gas Used:
52,488 Gas / 6 Gwei
Emitted Events:
| 102 |
BonusCloudToken.Transfer( _from=[Sender] 0x09862ed5908c0a336f9f92e5ffeb9768deac6091, _to=0xccBE88070c9964086ef2d2ccF8ad69bb1E8D6863, _value=9700000000000000000000 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x09862eD5...8DEac6091 |
8.095535501566083744 Eth
Nonce: 3682
|
8.095220573566083744 Eth
Nonce: 3683
| 0.000314928 | ||
| 0xdeCF7Be2...8Ba76af43 | |||||
|
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 713.397990756507224378 Eth | 713.398305684507224378 Eth | 0.000314928 |
Execution Trace
BonusCloudToken.transfer( _to=0xccBE88070c9964086ef2d2ccF8ad69bb1E8D6863, _value=9700000000000000000000 ) => ( 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;
}
}