ETH Price: $2,631.80 (-1.49%)

Transaction Decoder

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 Code
0x76b60cD2...db0e31138 0.17902901463 Eth0.019069953 Eth0.15995906163
0x92a510f6...9A048bc92 378.44205898872 Eth378.60201805035 Eth0.15995906163
(beaverbuild)
6.910305475311328563 Eth6.910360185311328563 Eth0.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
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      /**
      * .
      * / \\
      * |.'.|
      * |'.'|
      * ,'| |`.
      * |,-'-|-'-.|
      * __|_| | _ _ _____ _
      * | ___ \\| | | | | | ___ \\ | |
      * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
      * | // _ \\ / __| |/ / _ \\ __| | __/ _ \\ / _ \\| |
      * | |\\ \\ (_) | (__| < __/ |_ | | | (_) | (_) | |
      * \\_| \\_\\___/ \\___|_|\\_\\___|\\__| \\_| \\___/ \\___/|_|
      * +---------------------------------------------------+
      * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 |
      * +---------------------------------------------------+
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      File 2 of 4: RocketMinipoolDelegate
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      // SPDX-License-Identifier: MIT
      pragma 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 {
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      File 3 of 4: RocketStorage
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      // SPDX-License-Identifier: MIT
      pragma 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 {
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      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 from
          Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without
          updating 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 public
          immutable decimals;\n\n /*///////////////////////////////////////////////////////////////\n ERC20 STORAGE\n
          //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address =\u003e uint256) public
          balanceOf;\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 bytes32
          internal 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 {\n
          balanceOf[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 exceed
          the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n
           return true;\n }\n\n /*///////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n
          //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n
           uint256 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 // the
          owner\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\n
           allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function
          DOMAIN_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\n
          keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address
          verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n
           address(this)\n )\n );\n }\n\n /*///////////////////////////////////////////////////////////////\n
           INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address
          to, 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 {\n
          totalSupply -= 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 transfer
          library 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 {\n
          bool 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,\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, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n
           mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"from\" argument.\n
          mstore(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 // Call
          the 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 it
          succeeded 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\n
          function safeApprove(\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,
          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 it
          succeeded 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 pure
          returns (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 into
          memory.\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.\n
           returndatacopy(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 immutable
          ethBeneficiary;\n /// Address to receive funds eth funds\n address public immutable erc20Beneficiary;\n\n ///
          -------------------------------------------------------------------\n /// constructor\n ///
          -------------------------------------------------------------------\n\n constructor(address _ethBeneficiary, address _erc20Beneficiary) {\n
           ethBeneficiary = _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"}}
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX