Transaction Hash:
Block:
21464123 at Dec-23-2024 08:54:47 AM +UTC
Transaction Fee:
0.002876572163282229 ETH
$7.51
Gas Used:
560,139 Gas / 5.135461311 Gwei
Emitted Events:
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 5.49865624879447716 Eth | 5.49919958362447716 Eth | 0.00054333483 | |
0x5Eb67a3b...7166c540e |
0.060507832454740544 Eth
Nonce: 8243
|
0.057631260291458315 Eth
Nonce: 8244
| 0.002876572163282229 | ||
0x69457A1C...e0369d5D0 |
Execution Trace
Disperse.disperseToken( token=0x69457A1C9Ec492419344DA01Daf0DF0e0369d5D0, recipients=[0xfA146e77A7C7683c0c388936664027b6FD745405, 0x69e67AaD5495A48c4ef3f770D93A99935e1dc90d, 0xfc55D46d67b8e784f801a53C08C7DB1c0e214820, 0x3185EF019BA1C04B8d65eDB64c1c34C3eaE52271, 0x50BAdF9d6De272Ea3dD2D537f120f593BaB07670, 0x562f003AA87197687f82D5aa4521206264BbDe80, 0x350C4eDa87efe854a7D0a1235eCeDaa409D6EeC8, 0xA26710af01c7b12b41d0cFb416a027751828Fc5C, 0xf2e81ce56890a9707156401E446046d8E6849584, 0x4eD3C16786925bc9B34F3b96bF5b8F90c2c48ed9, 0xF66B0CfE0fbc00b4AB49cc3B40528ac122bc43bd, 0xca7d9fAf203C8Cc66540CE4E17caBEe9BCC05627, 0x9d156bc7c8768294510A4A41883d5A4EB15b15E3, 0x29eB182B934780bB25C4656268Df4C919225E707, 0xfc2A87ACc2DB072e6d376cbe6755cd8B5872264c, 0xAD9e0Cd94a89b155c0335B609fa08352c2dBAeb9, 0xd543792AeC7f9F1007447aeb707404C72E75540F, 0x620B92F3bCc4c230C4e75d0784F61c8d43fE30BC, 0x2f0df65c444B35b3CbCE0EFAeCD9C9750612e136, 0x66DD095Ce28eFa599f68e67a895c29a8a2f33D71, 0x904C5dE62F9f3906c3bF6Eaf20aA4A927b24219B, 0x847E61DbDDc2F4C7e84E55404Df57eD5Ba59F33c, 0xF1327D925323E360AFF9670ebEA5cE9624Faaa6D, 0xCaE7B8191750AeC11b532410BCaB6088507F9128, 0xA8188d5A6D06F83cfa4991912ecFBB444d7eE411, 0x2457C41946205b398030Ca16bF0B71D4BaEe56db, 0x816DDA7B144c47716d2F404908ea5E03C9aa2959, 0x3F4373aFdde3D7dE3AC433AcC7De685338c3980e, 0xa8026a29A324D87c6f61Aa1547047506dEd98CA2, 0x2b48D01f4cFe3A7496856f6F420AD2B4a892B599, 0x5e5511426451e1694B7fB95D7238A260D9F4431C, 0x6985077eD92279F7e55A1424a43B531957485712, 0xa411422B572c48F02e34b676650cf33AE306a9F1, 0xa8da5912dB11C6cAA2762473f0B5D3Dba6Aff992, 0xB3325E5c36bec884957B9c2402e6Ad67341aec4e, 0xD7F1FcE99D88301707035dCF8196819318B7f4d1, 0xEE61F6c495c40afE59a656802fdb5D66020a22a6, 0xCf2A91e54f2E958D691A28b1FfBac3cc7cFF8477, 0xbe6f48B3ec83DB8E83771F49C11D738d9717dedB], values=[158400000000000000000, 158400000000000000000, 316800000000000000000, 158400000000000000000, 237600000000000000000, 158400000000000000000, 316800000000000000000, 633600000000000000000, 158400000000000000000, 396000000000000000000, 300960000000000000000, 633600000000000000000, 673200000000000000000, 158400000000000000000, 237600000000000000000, 158400000000000000000, 79200000000000000000, 79200000000000000000, 237600000000000000000, 158400000000000000000, 316800000000000000000, 237600000000000000000, 673200000000000000000, 79200000000000000000, 79200000000000000000, 79200000000000000000, 158400000000000000000, 237600000000000000000, 237600000000000000000, 79200000000000000000, 79200000000000000000, 316800000000000000000, 158400000000000000000, 158400000000000000000, 79200000000000000000, 396000000000000000000, 158400000000000000000, 158400000000000000000, 807840000000000000000] )
-
FjordToken.transferFrom( from=0x5Eb67a3b141f3036899EE77822A41277166c540e, to=0xD152f549545093347A162Dce210e7293f1452150, amount=9900000000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xfA146e77A7C7683c0c388936664027b6FD745405, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x69e67AaD5495A48c4ef3f770D93A99935e1dc90d, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xfc55D46d67b8e784f801a53C08C7DB1c0e214820, amount=316800000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x3185EF019BA1C04B8d65eDB64c1c34C3eaE52271, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x50BAdF9d6De272Ea3dD2D537f120f593BaB07670, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x562f003AA87197687f82D5aa4521206264BbDe80, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x350C4eDa87efe854a7D0a1235eCeDaa409D6EeC8, amount=316800000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xA26710af01c7b12b41d0cFb416a027751828Fc5C, amount=633600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xf2e81ce56890a9707156401E446046d8E6849584, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x4eD3C16786925bc9B34F3b96bF5b8F90c2c48ed9, amount=396000000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xF66B0CfE0fbc00b4AB49cc3B40528ac122bc43bd, amount=300960000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xca7d9fAf203C8Cc66540CE4E17caBEe9BCC05627, amount=633600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x9d156bc7c8768294510A4A41883d5A4EB15b15E3, amount=673200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x29eB182B934780bB25C4656268Df4C919225E707, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xfc2A87ACc2DB072e6d376cbe6755cd8B5872264c, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xAD9e0Cd94a89b155c0335B609fa08352c2dBAeb9, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xd543792AeC7f9F1007447aeb707404C72E75540F, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x620B92F3bCc4c230C4e75d0784F61c8d43fE30BC, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x2f0df65c444B35b3CbCE0EFAeCD9C9750612e136, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x66DD095Ce28eFa599f68e67a895c29a8a2f33D71, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x904C5dE62F9f3906c3bF6Eaf20aA4A927b24219B, amount=316800000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x847E61DbDDc2F4C7e84E55404Df57eD5Ba59F33c, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xF1327D925323E360AFF9670ebEA5cE9624Faaa6D, amount=673200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xCaE7B8191750AeC11b532410BCaB6088507F9128, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xA8188d5A6D06F83cfa4991912ecFBB444d7eE411, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x2457C41946205b398030Ca16bF0B71D4BaEe56db, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x816DDA7B144c47716d2F404908ea5E03C9aa2959, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x3F4373aFdde3D7dE3AC433AcC7De685338c3980e, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xa8026a29A324D87c6f61Aa1547047506dEd98CA2, amount=237600000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x2b48D01f4cFe3A7496856f6F420AD2B4a892B599, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x5e5511426451e1694B7fB95D7238A260D9F4431C, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0x6985077eD92279F7e55A1424a43B531957485712, amount=316800000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xa411422B572c48F02e34b676650cf33AE306a9F1, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xa8da5912dB11C6cAA2762473f0B5D3Dba6Aff992, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xB3325E5c36bec884957B9c2402e6Ad67341aec4e, amount=79200000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xD7F1FcE99D88301707035dCF8196819318B7f4d1, amount=396000000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xEE61F6c495c40afE59a656802fdb5D66020a22a6, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xCf2A91e54f2E958D691A28b1FfBac3cc7cFF8477, amount=158400000000000000000 ) => ( True )
-
FjordToken.transfer( to=0xbe6f48B3ec83DB8E83771F49C11D738d9717dedB, amount=807840000000000000000 ) => ( True )
disperseToken[Disperse (ln:19)]
transferFrom[Disperse (ln:23)]
transfer[Disperse (ln:25)]
File 1 of 2: Disperse
File 2 of 2: FjordToken
pragma solidity ^0.4.25; interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } contract Disperse { function disperseEther(address[] recipients, uint256[] values) external payable { for (uint256 i = 0; i < recipients.length; i++) recipients[i].transfer(values[i]); uint256 balance = address(this).balance; if (balance > 0) msg.sender.transfer(balance); } function disperseToken(IERC20 token, address[] recipients, uint256[] values) external { uint256 total = 0; for (uint256 i = 0; i < recipients.length; i++) total += values[i]; require(token.transferFrom(msg.sender, address(this), total)); for (i = 0; i < recipients.length; i++) require(token.transfer(recipients[i], values[i])); } function disperseTokenSimple(IERC20 token, address[] recipients, uint256[] values) external { for (uint256 i = 0; i < recipients.length; i++) require(token.transferFrom(msg.sender, recipients[i], values[i])); } }
File 2 of 2: FjordToken
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.21; import { ERC20 } from "solmate/tokens/ERC20.sol"; contract FjordToken is ERC20 { constructor() ERC20("Fjord Foundry", "FJO", 18) { _mint(msg.sender, 100_000_000 ether); } } // SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\\x19\\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }