Transaction Hash:
Block:
18811810 at Dec-18-2023 08:52:59 AM +UTC
Transaction Fee:
0.001009806937837799 ETH
$2.55
Gas Used:
29,101 Gas / 34.700076899 Gwei
Emitted Events:
208 |
BRC20.Approval( owner=[Sender] 0xd979032fe7e841120dbbdf465eed19d6f912efd1, spender=0x11111112...73A960582, value=1000554390000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x38e382F7...f5951DE93 | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 16.635500974786645639 Eth | 16.635503884886645639 Eth | 0.0000029101 | |
0xd979032F...6f912eFD1 |
0.024682633344625717 Eth
Nonce: 71
|
0.023672826406787918 Eth
Nonce: 72
| 0.001009806937837799 |
Execution Trace
BRC20.approve( spender=0x1111111254EEB25477B68fb85Ed929f73A960582, amount=1000554390000000000000 ) => ( True )
approve[BRC20 (ln:35)]
Approval[BRC20 (ln:37)]
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./interfaces/IBRC20Factory.sol"; contract BRC20 { string public name; string public symbol; uint8 public immutable decimals; address public immutable factory; uint256 public totalSupply; mapping (address => uint256) public balanceOf; mapping (address => mapping(address => uint256)) public allowance; mapping (address => uint256) public nonces; bytes32 public DOMAIN_SEPARATOR; bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); constructor() { (name, symbol, decimals) = IBRC20Factory(msg.sender).parameters(); factory = msg.sender; uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes('1')), chainId, address(this))); } function mint(address to, uint256 amount) external { require(msg.sender == factory, "unauthorized"); _mint(to, amount); } function burn(uint256 amount) external { require(msg.sender == factory, "unauthorized"); _burn(msg.sender, amount); } function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) external returns (bool) { balanceOf[msg.sender] -= amount; unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) external returns (bool) { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'EXPIRED'); unchecked { 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, 'INVALID_SIGNATURE'); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function _mint(address to, uint256 amount) internal { totalSupply += amount; unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal { balanceOf[from] -= amount; unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBRC20Factory { function parameters() external view returns (string memory name, string memory symbol, uint8 decimals); }