Transaction Hash:
Block:
22037711 at Mar-13-2025 11:40:59 AM +UTC
Transaction Fee:
0.000034526206406153 ETH
$0.07
Gas Used:
30,041 Gas / 1.149302833 Gwei
Emitted Events:
345 |
ERC20.Transfer( src=[Sender] 0x3883d2b1aa1be8d121d6c35f64f1581f1dea4d69, dst=0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b, wad=634506000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x3883D2B1...f1DEA4D69 |
0.00036366 Eth
Nonce: 0
|
0.000329133793593847 Eth
Nonce: 1
| 0.000034526206406153 | ||
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 10.696169813881454653 Eth | 10.696187838481454653 Eth | 0.0000180246 | |
0xc221b7E6...6593D34F0 |
Execution Trace
ERC20.transfer( dst=0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b, wad=634506000000000000000000 ) => ( True )
transfer[ERC20 (ln:72)]
transferFrom[ERC20 (ln:73)]
sub[ERC20 (ln:81)]
sub[ERC20 (ln:83)]
add[ERC20 (ln:84)]
Transfer[ERC20 (ln:85)]
// Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico, lucasvo // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity >=0.5.15; contract ERC20 { // --- Auth --- mapping (address => uint) public wards; function rely(address usr) public auth { wards[usr] = 1; } function deny(address usr) public auth { wards[usr] = 0; } modifier auth { require(wards[msg.sender] == 1); _; } // --- ERC20 Data --- uint8 public constant decimals = 18; string public name; string public symbol; string public constant version = "1"; uint256 public totalSupply; bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; mapping (address => uint) public balanceOf; mapping (address => mapping (address => uint)) public allowance; event Approval(address indexed src, address indexed usr, uint wad); event Transfer(address indexed src, address indexed dst, uint wad); // --- Math --- function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, "math-add-overflow"); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, "math-sub-underflow"); } constructor(string memory symbol_, string memory name_) public { wards[msg.sender] = 1; symbol = symbol_; name = name_; uint chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes(version)), chainId, address(this) ) ); } // --- ERC20 --- function transfer(address dst, uint wad) external returns (bool) { return transferFrom(msg.sender, dst, wad); } function transferFrom(address src, address dst, uint wad) public returns (bool) { require(balanceOf[src] >= wad, "cent/insufficient-balance"); if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { require(allowance[src][msg.sender] >= wad, "cent/insufficient-allowance"); allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); } balanceOf[src] = sub(balanceOf[src], wad); balanceOf[dst] = add(balanceOf[dst], wad); emit Transfer(src, dst, wad); return true; } function mint(address usr, uint wad) external auth { balanceOf[usr] = add(balanceOf[usr], wad); totalSupply = add(totalSupply, wad); emit Transfer(address(0), usr, wad); } function burn(address usr, uint wad) public { require(balanceOf[usr] >= wad, "cent/insufficient-balance"); if (usr != msg.sender && allowance[usr][msg.sender] != uint(-1)) { require(allowance[usr][msg.sender] >= wad, "cent/insufficient-allowance"); allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); } balanceOf[usr] = sub(balanceOf[usr], wad); totalSupply = sub(totalSupply, wad); emit Transfer(usr, address(0), wad); } function approve(address usr, uint wad) external returns (bool) { allowance[msg.sender][usr] = wad; emit Approval(msg.sender, usr, wad); return true; } // --- Alias --- function push(address usr, uint wad) external { transferFrom(msg.sender, usr, wad); } function pull(address usr, uint wad) external { transferFrom(usr, msg.sender, wad); } function move(address src, address dst, uint wad) external { transferFrom(src, dst, wad); } function burnFrom(address usr, uint wad) external { burn(usr, wad); } // --- Approve by signature --- function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'cent/past-deadline'); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, 'cent-erc20/invalid-sig'); allowance[owner][spender] = value; emit Approval(owner, spender, value); } }