Transaction Hash:
Block:
6377511 at Sep-22-2018 08:18:01 AM +UTC
Transaction Fee:
0.000272104 ETH
$0.53
Gas Used:
38,872 Gas / 7 Gwei
Emitted Events:
| 146 |
STOToken.Transfer( _from=[Sender] 0xe85430a51bd131905219bb2460fb893f48236cef, _to=0x5c8716E5070AC01941fdD6Ed69ab153999802b0C, value=30000000000000000000 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x49A8aDEc...379d171DC | |||||
| 0xE85430A5...f48236ceF |
4.78265028617 Eth
Nonce: 4808
|
4.78237818217 Eth
Nonce: 4809
| 0.000272104 | ||
|
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 797.533861576098058864 Eth | 797.534133680098058864 Eth | 0.000272104 |
Execution Trace
STOToken.transfer( _to=0x5c8716E5070AC01941fdD6Ed69ab153999802b0C, _value=30000000000000000000 ) => ( True )
transfer[ERC20Basic (ln:183)]
pragma solidity ^0.4.24;
/**
* Utility library of inline functions on addresses
*/
library AddressUtilsLib {
/**
* Returns whether there is code in the target address
* @dev This function will return false if invoked during the constructor of a contract,
* as the code is not actually created until after the constructor finishes.
* @param _addr address address to check
* @return bool whether there is code in the target address
*/
function isContract(address _addr) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(_addr)
}
return size > 0;
}
}
pragma solidity ^0.4.24;
/**
* Math operations with safety checks
*/
library SafeMathLib {
/**
* @dev uint256乘法
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
/**
* @dev 除法
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
assert(0==b);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev 减法运算
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev 加法运算
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
/**
* @dev 64bit最大数
*/
function max64(uint64 a, uint64 b) internal pure returns (uint64) {
return a >= b ? a : b;
}
/**
* @dev 64bit最小数
*/
function min64(uint64 a, uint64 b) internal pure returns (uint64) {
return a < b ? a : b;
}
/**
* @dev uint256最大数
*/
function max256(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev uint256最小数
*/
function min256(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}
pragma solidity ^0.4.24;
/**
* @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.
*/
constructor() 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;
}
}
pragma solidity ^0.4.24;
contract ERC20Basic {
/**
* @dev 传输事件
*/
event Transfer(address indexed _from,address indexed _to,uint256 value);
//发送总量
uint256 public totalSupply;
/**
*@dev 获取名称
*/
function name() public view returns (string);
/**
*@dev 获取代币符号
*/
function symbol() public view returns (string);
/**
*@dev 支持几位小数
*/
function decimals() public view returns (uint8);
/**
*@dev 获取发行量
*/
function totalSupply() public view returns (uint256){
return totalSupply;
}
/**
* @dev 获取余额
*/
function balanceOf(address _owner) public view returns (uint256);
/**
* @dev 转移代币
* @param _to 转移地址
* @param _value 数量
*/
function transfer(address _to, uint256 _value) public returns (bool);
}
pragma solidity ^0.4.24;
contract ERC20 is ERC20Basic {
/**
* @dev 授予事件
*/
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
/**
* @dev 查看_owner地址还可以调用_spender地址多少代币
* @param _owner 当前
* @param _spender 地址
* @return uint256 可调用的代币数
*/
function allowance(address _owner, address _spender) public view returns (uint256);
/**
* @dev approve批准之后,当前帐号从_from账户转移_value代币
* @param _from 账户转移
* @param _to 转移地址
* @param _value 数量
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool);
/**
* @dev 授权地批准_spender账户从自己的账户转移_value个代币
* @param _spender 授权地址
* @param _value 授权数量
*/
function approve(address _spender, uint256 _value) public returns (bool);
}
pragma solidity ^0.4.24;
/**
* @title Basic token
*/
contract BasicToken is ERC20Basic {
//SafeMathLib接口
using SafeMathLib for uint256;
using AddressUtilsLib for address;
//余额地址
mapping(address => uint256) public balances;
/**
* @dev 指定地址传输
* @param _from 传送地址
* @param _to 传送地址
* @param _value 传送数量
*/
function _transfer(address _from,address _to, uint256 _value) public returns (bool){
require(!_from.isContract());
require(!_to.isContract());
require(0 < _value);
require(balances[_from] > _value);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev 指定地址传输
* @param _to 传送地址
* @param _value 传送数量
*/
function transfer(address _to, uint256 _value) public returns (bool){
return _transfer(msg.sender,_to,_value);
}
/**
* @dev 查询地址余额
* @param _owner 查询地址
* @return uint256 返回余额
*/
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
}
pragma solidity ^0.4.24;
contract UCBasic is ERC20,BasicToken{
//
mapping (address => mapping (address => uint256)) allowed;
/**
* @dev approve批准之后,调用transferFrom函数来转移token
* @param _from 当前用户token
* @param _to 转移地址
* @param _value 数量
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool){
//检测传输值是否为空
require(0 < _value);
//检测地址是否有效
require(address(0) != _from && address(0) != _to);
//检测是否有余额可以支付
require(allowed[_from][msg.sender] > _value);
//检测账户余额是否够用
require(balances[_from] > _value);
//检测地址是否有效
require(!_from.isContract());
//检测地址是否有效
require(!_to.isContract());
//余额
uint256 _allowance = allowed[_from][msg.sender];
balances[_to] = balances[_to].add(_value);
balances[_from] = balances[_from].sub(_value);
allowed[_from][msg.sender] = _allowance.sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev 批准另一个人address来交易指定的代币
* @dev 0 address 表示没有授权的地址
* @dev 给定的时间内,一个token只能有一个批准的地址
* @dev 只有token的持有者或者授权的操作人才可以调用
* @param _spender 指定的地址
* @param _value uint256 可用余额
*/
function approve(address _spender, uint256 _value) public returns (bool){
require(address(0) != _spender);
require(!_spender.isContract());
require(msg.sender != _spender);
require(0 != _value);
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev 查看_owner地址还可以调用_spender地址多少代币
* @param _owner 当前
* @param _spender 地址
* @return uint256 可调用的代币数
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
//检测地址是否有效
require(!_owner.isContract());
//检测地址是否有效
require(!_spender.isContract());
return allowed[_owner][_spender];
}
}
pragma solidity ^0.4.24;
contract STOToken is UCBasic,Ownable{
using SafeMathLib for uint256;
//名称
string constant public tokenName = "STOCK";
//标识
string constant public tokenSymbol = "STO";
//发行量30亿
uint256 constant public totalTokens = 30*10000*10000;
//小数位
uint8 constant public totalDecimals = 18;
//版本号
string constant private version = "20180908";
//接收以太坊地址
address private wallet;
constructor() public {
totalSupply = totalTokens*10**uint256(totalDecimals);
balances[msg.sender] = totalSupply;
wallet = msg.sender;
}
/**
*@dev 获取名称
*/
function name() public view returns (string){
return tokenName;
}
/**
*@dev 获取代币符号
*/
function symbol() public view returns (string){
return tokenSymbol;
}
/**
*@dev 支持几位小数
*/
function decimals() public view returns (uint8){
return totalDecimals;
}
}