Transaction Hash:
Block:
22170428 at Apr-01-2025 12:18:47 AM +UTC
Transaction Fee:
0.00008344394153231 ETH
$0.22
Gas Used:
54,710 Gas / 1.525204561 Gwei
Emitted Events:
108 |
RocketMinipool.0xd5ca65e1ec4f4864fea7b9c5cb1ec3087a0dbf9c74641db3f6458edf445c4051( 0xd5ca65e1ec4f4864fea7b9c5cb1ec3087a0dbf9c74641db3f6458edf445c4051, 0x00000000000000000000000092a510f62a2a2b608b37179f909186f9a048bc92, 000000000000000000000000000000000000000000000000023849eb470f9b80, 0000000000000000000000000000000000000000000000000000000067eb30e7 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x76b60cD2...db0e31138 | 0.17902901463 Eth | 0.019069953 Eth | 0.15995906163 | ||
0x92a510f6...9A048bc92 | 378.44205898872 Eth | 378.60201805035 Eth | 0.15995906163 | ||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 6.910305475311328563 Eth | 6.910360185311328563 Eth | 0.00005471 | |
0xacB7CFB5...0468082D9 |
0.134210480594144157 Eth
Nonce: 2706
|
0.134127036652611847 Eth
Nonce: 2707
| 0.00008344394153231 |
Execution Trace
RocketMinipool.CALL( )
RocketMinipoolDelegate.DELEGATECALL( )
-
RocketStorage.getNodeWithdrawalAddress( _nodeAddress=0xacB7CFB56D6835d9E2Fa3E3F273A0450468082D9 ) => ( 0x92a510f62A2A2b608b37179f909186F9A048bc92 )
- ETH 0.15995906163
TokenTypeSplitter.CALL( )
-
File 1 of 4: RocketMinipool
File 2 of 4: RocketMinipoolDelegate
File 3 of 4: RocketStorage
File 4 of 4: TokenTypeSplitter
12345678910111213141516/*** .* / \\* |.'.|* |'.'|* ,'| |`.* |,-'-|-'-.|* __|_| | _ _ _____ _* | ___ \\| | | | | | ___ \\ | |* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |* | // _ \\ / __| |/ / _ \\ __| | __/ _ \\ / _ \\| |* | |\\ \\ (_) | (__| < __/ |_ | | | (_) | (_) | |* \\_| \\_\\___/ \\___|_|\\_\\___|\\__| \\_| \\___/ \\___/|_|* +---------------------------------------------------+* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 |* +---------------------------------------------------+
File 2 of 4: RocketMinipoolDelegate
12345678910111213141516// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMath {
File 3 of 4: RocketStorage
12345678910111213141516// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMath {
File 4 of 4: TokenTypeSplitter
1{"ERC20.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity \u003e=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified fromUniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances withoutupdating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n/*///////////////////////////////////////////////////////////////\n EVENTS\n//////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n/*///////////////////////////////////////////////////////////////\n METADATA STORAGE\n//////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 publicimmutable decimals;\n\n /*///////////////////////////////////////////////////////////////\n ERC20 STORAGE\n//////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address =\u003e uint256) publicbalanceOf;\n\n mapping(address =\u003e mapping(address =\u003e uint256)) public allowance;\n\n/*///////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n//////////////////////////////////////////////////////////////*/\n\n bytes32 public constant PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address =\u003e uint256) public nonces;\n\n/*///////////////////////////////////////////////////////////////\n CONSTRUCTOR\n//////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID =block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n/*///////////////////////////////////////////////////////////////\n ERC20 LOGIC\n//////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns(bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n}\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n //Cannot overflow because the sum of all user\n // balances can\u0027t exceed the max uint256 value.\n unchecked {\nbalanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed =allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed- amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can\u0027t exceedthe max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\nreturn true;\n }\n\n /*///////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n//////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\nuint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline \u003e= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // theowner\u0027s nonce which cannot realistically overflow.\n unchecked {\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n\n address recoveredAddress =ecrecover(digest, v, r, s);\n\n require(recoveredAddress != address(0) \u0026\u0026 recoveredAddress == owner, \"INVALID_SIGNER\");\n\nallowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n functionDOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR :computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\nkeccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,addressverifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\naddress(this)\n )\n );\n }\n\n /*///////////////////////////////////////////////////////////////\nINTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(addressto, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n //balances can\u0027t exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n// Cannot underflow because a user\u0027s balance\n // will never be larger than the total supply.\n unchecked {\ntotalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n"},"SafeTransferLib.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity \u003e=0.8.0;\n\nimport {ERC20} from \"ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transferlibrary that gracefully handles missing return values.\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\nlibrary SafeTransferLib {\n /*///////////////////////////////////////////////////////////////\n ETH OPERATIONS\n//////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\nbool callStatus;\n\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n callStatus := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(callStatus, \"ETH_TRANSFER_FAILED\");\n }\n\n/*///////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n//////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\naddress to,\n uint256 amount\n ) internal {\n bool callStatus;\n\n assembly {\n // Get a pointer to somefree memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\nmstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\nmstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"from\" argument.\nmstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Finally append the \"amount\" argument. No mask as it\u0027s a full 32 byte value.\n\n // Callthe token and store if it succeeded or not.\n // We use 100 because the calldata length is 4 + 32 * 3.\n callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus),\"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal{\n bool callStatus;\n\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\n mstore(freeMemoryPointer,0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n mstore(add(freeMemoryPointer,4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36),amount) // Finally append the \"amount\" argument. No mask as it\u0027s a full 32 byte value.\n\n // Call the token and store if itsucceeded or not.\n // We use 68 because the calldata length is 4 + 32 * 2.\n callStatus := call(gas(), token, 0,freeMemoryPointer, 68, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus), \"TRANSFER_FAILED\");\n }\n\nfunction safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool callStatus;\n\nassembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\n mstore(freeMemoryPointer,0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n mstore(add(freeMemoryPointer,4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36),amount) // Finally append the \"amount\" argument. No mask as it\u0027s a full 32 byte value.\n\n // Call the token and store if itsucceeded or not.\n // We use 68 because the calldata length is 4 + 32 * 2.\n callStatus := call(gas(), token, 0,freeMemoryPointer, 68, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus), \"APPROVE_FAILED\");\n }\n\n/*///////////////////////////////////////////////////////////////\n INTERNAL HELPER LOGIC\n//////////////////////////////////////////////////////////////*/\n\n function didLastOptionalReturnCallSucceed(bool callStatus) private purereturns (bool success) {\n assembly {\n // Get how many bytes the call returned.\n let returnDataSize :=returndatasize()\n\n // If the call reverted:\n if iszero(callStatus) {\n // Copy the revert message intomemory.\n returndatacopy(0, 0, returnDataSize)\n\n // Revert with the same message.\n revert(0,returnDataSize)\n }\n\n switch returnDataSize\n case 32 {\n // Copy the return data into memory.\nreturndatacopy(0, 0, returnDataSize)\n\n // Set success to whether it returned true.\n success :=iszero(iszero(mload(0)))\n }\n case 0 {\n // There was no return data.\n success := 1\n}\n default {\n // It returned some malformed input.\n success := 0\n }\n }\n}\n}\n"},"TokenTypeSplitter.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.13;\n\nimport {ERC20} from\u0027ERC20.sol\u0027;\nimport {SafeTransferLib} from \"SafeTransferLib.sol\";\n\ncontract TokenTypeSplitter {\n ///-------------------------------------------------------------------\n /// libraries\n ///-------------------------------------------------------------------\n\n using SafeTransferLib for address;\n using SafeTransferLib for ERC20;\n\n /// -------------------------------------------------------------------\n /// storage\n ///-------------------------------------------------------------------\n\n /// Address to receive funds eth funds\n address public immutableethBeneficiary;\n /// Address to receive funds eth funds\n address public immutable erc20Beneficiary;\n\n ///-------------------------------------------------------------------\n /// constructor\n ///-------------------------------------------------------------------\n\n constructor(address _ethBeneficiary, address _erc20Beneficiary) {\nethBeneficiary = _ethBeneficiary;\n erc20Beneficiary = _erc20Beneficiary;\n }\n\n ///-------------------------------------------------------------------\n /// functions\n ///-------------------------------------------------------------------\n\n ///-------------------------------------------------------------------\n /// functions - public \u0026 external\n ///-------------------------------------------------------------------\n\n /// @notice receive ETH\n receive() external payable {}\n\n ///pay eth in contract to `ethBeneficiary`\n function payETHBeneficiary() external {\n ethBeneficiary.safeTransferETH(address(this).balance);\n }\n\n /// pay erc20 `token` in contract to `ethBeneficiary`\n function payERC20Beneficiary(ERC20 token) external {\n token.safeTransfer(erc20Beneficiary, token.balanceOf(address(this)));\n }\n}\n"}}