Transaction Hash:
Block:
11097724 at Oct-21-2020 05:54:31 AM +UTC
Transaction Fee:
0.001433688033737916 ETH
$2.80
Gas Used:
23,124 Gas / 62.000001459 Gwei
Emitted Events:
| 261 |
EDC.Transfer( _from=[Sender] 0x13064816c5bcc7a334e300888a26c4134b843a4c, _to=0x200a22D69f1944d267595e14A1773F91A9DE59A4, _value=4000000000000000000000 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x13064816...34b843A4c |
0.004 Eth
Nonce: 0
|
0.002566311966262084 Eth
Nonce: 1
| 0.001433688033737916 | ||
|
0x52bc44d5...b7d7bE3b5
Miner
| (Nanopool) | 2,768.926758716968127637 Eth | 2,768.928192405001865553 Eth | 0.001433688033737916 | |
| 0x9d5963ba...c64066271 |
Execution Trace
EDC.transfer( _to=0x200a22D69f1944d267595e14A1773F91A9DE59A4, _value=4000000000000000000000 ) => ( True )
transfer[EDC (ln:176)]
transfer[EDC (ln:178)]
// solium-disable linebreak-style
pragma solidity ^0.4.25;
/**
* @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) {
if (a == 0) {
return 0;
}
uint256 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 c;
}
/**
* @dev Substracts 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) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract ERC20 {
function totalSupply() public view returns (uint256);
function balanceOf(address) public view returns (uint256);
function transfer(address, uint256) public returns (bool);
function transferFrom(address, address, uint256) public returns (bool);
function approve(address, uint256) public returns (bool);
function allowance(address, address) public view returns (uint256);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract Owned {
address public owner;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
// allow transfer of ownership to another address in case shit hits the fan.
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
owner = newOwner;
}
}
contract StandardToken is ERC20 {
using SafeMath for uint256;
mapping (address => uint256) internal balances;
mapping (address => mapping (address => uint256)) internal allowed;
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
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;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success) {
// Added to prevent potential race attack.
// forces caller of this function to ensure address allowance is already 0
// ref: https://github.com/ethereum/EIPs/issues/738
require((_value == 0) || (allowed[msg.sender][_spender] == 0));
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_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
*/
function increaseApproval(address _spender, uint _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;
}
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint 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;
}
}
//token contract
contract EDC is Owned, StandardToken {
event Burn(address indexed burner, uint256 value);
/* Public variables of the token */
string public name;
uint8 public decimals;
string public symbol;
uint256 public totalSupply;
address public distributionAddress;
bool public isTransferable = false;
constructor() public {
name = "Edcoin";
decimals = 18;
symbol = "EDC";
totalSupply = 900000000 * 10 ** uint256(decimals);
owner = msg.sender;
//transfer all to handler address
balances[msg.sender] = totalSupply;
emit Transfer(0x0, msg.sender, totalSupply);
}
function transfer(address _to, uint256 _value) public returns (bool) {
require(isTransferable);
return super.transfer(_to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(isTransferable);
return super.transferFrom(_from, _to, _value);
}
/**
* Get totalSupply of tokens - Minus any from address 0 if that was used as a burnt method
* Suggested way is still to use the burnSent function
*/
function totalSupply() public view returns (uint256) {
return totalSupply;
}
/**
* unlocks tokens, only allowed once
*/
function enableTransfers() public onlyOwner {
isTransferable = true;
}
/**
* Callable by anyone
* Accepts an input of the number of tokens to be burnt held by the sender.
*/
function burnSent(uint256 _value) public {
require(_value > 0);
require(_value <= balances[msg.sender]);
address burner = msg.sender;
balances[burner] = balances[burner].sub(_value);
totalSupply = totalSupply.sub(_value);
emit Burn(burner, _value);
}
/**
* Allow distribution helper to help with distributeToken function
* Here we should update the distributionAddress with the crowdsale contract address upon deployment
* Allows for added flexibility in terms of scheduling, token allocation, etc.
*/
function setDistributionAddress(address _setAddress) public onlyOwner {
distributionAddress = _setAddress;
}
/**
* Called by owner to transfer tokens - Managing manual distribution.
* Also allow distribution contract to call for this function
*/
function distributeTokens(address _to, uint256 _value) public {
require(distributionAddress == msg.sender || owner == msg.sender);
super.transfer(_to, _value);
}
}