ETH Price: $4,174.27 (+8.79%)

Transaction Decoder

Block:
22494958 at May-16-2025 10:11:35 AM +UTC
Transaction Fee:
0.001126577705879565 ETH $4.70
Gas Used:
666,153 Gas / 1.691169605 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x1A725204...9A4E844Cd 0.250022404671195514 Eth0.250171884671195514 Eth0.00014948
0x25761E5d...984476AB8 0.000683381686787607 Eth0.000832821686787607 Eth0.00014944
0x258fE49B...5F68E5E6B 0.00669536798448175 Eth0.00685587798448175 Eth0.00016051
0x2943C841...9fF781B54 1.066071818219407962 Eth1.066244318219407962 Eth0.0001725
0x29cE6E92...49B3FDdDC 0.000304605444075308 Eth0.000470555444075308 Eth0.00016595
0x330dd1d5...D6F071525 0.02187004 Eth0.0220425 Eth0.00017246
0x3B3Cf7AE...d08AD9BBE
0 Eth
Nonce: 0
0.00014948 Eth
Nonce: 0
0.00014948From: 0 To: 0
(Titan Builder)
5.02773364457139891 Eth5.02776695222139891 Eth0.00003330765
0x4B16F24D...f9D0a34D0 0.020665895871648909 Eth0.020826365871648909 Eth0.00016047
0x56000b8d...6F0243299 0.600709753145863888 Eth0.600882253145863888 Eth0.0001725
0x56f30346...6e3Ff2DF3 0.032238296860630996 Eth0.032409226860630996 Eth0.00017093
0x5b6282c2...3A0BA3289 0.009913587834261807 Eth0.010063107834261807 Eth0.00014952
0x5d54d5e8...39982F945 0.230765776147295915 Eth0.230942666147295915 Eth0.00017689
0x5F381481...f1b627b62 2.716230941502113146 Eth2.716391451502113146 Eth0.00016051
0x5F958499...A7e58E71a
0 Eth
Nonce: 0
0.00017689 Eth
Nonce: 0
0.00017689From: 0 To: 0
0x6C03e63c...A539bF0e2 0.001733718343295589 Eth0.001904688343295589 Eth0.00017097
0x74e6EBBC...2Ed88E2E7 0.000128164089636391 Eth0.000288634089636391 Eth0.00016047
0x80eB6838...30f5bA5eF 0.00009391621876792 Eth0.00026641621876792 Eth0.0001725
0x82C149c0...1Aa8F0105 0.000060628816883107 Eth0.000202578816883107 Eth0.00014195
0x85B16B1E...5DE3f81D9
0 Eth
Nonce: 0
0.00016047 Eth
Nonce: 0
0.00016047From: 0 To: 0
0x86CDC3eb...DdD4FEa44 0.0016606853152092 Eth0.0018026353152092 Eth0.00014195
0x86E2eF54...4FdB480a2 0.011490388535247577 Eth0.011676698535247577 Eth0.00018631
0x87E10B96...3d4F4eDD4
0 Eth
Nonce: 0
0.00016051 Eth
Nonce: 0
0.00016051From: 0 To: 0
0x890b0761...9044D6767 0.035696378298483219 Eth0.035884388298483219 Eth0.00018801
0x895405B8...294bb3f80 0.000558934250729038 Eth0.000735824250729038 Eth0.00017689
0x8E0Ad36f...C4029c66b 0.000071340699544972 Eth0.000242230699544972 Eth0.00017089
0x8F03B2bC...204D0C505 0.005182382843808117 Eth0.005354842843808117 Eth0.00017246
0x922b7B7C...2B5333B12 0.037624911249171965 Eth0.037812921249171965 Eth0.00018801
0x92aa38fe...76Bf3b7Ef
0 Eth
Nonce: 0
0.00017093 Eth
Nonce: 0
0.00017093From: 0 To: 0
0xA03b40E6...70DBe73E0 0.003185719869007837 Eth0.003327669869007837 Eth0.00014195
0xa1418851...a7fD97c92 2.097314784128008505 Eth2.097487284128008505 Eth0.0001725
0xA44D30Ec...3a4C31D0A 0.5454296444468252 Eth0.5456005744468252 Eth0.00017093
0xAa3Af73f...4e2b7026d 0.040227618886456556 Eth0.040400118886456556 Eth0.0001725
0xb23360CC...9C8D7c460
(Revolut 1)
3,364.116714380502720456 Eth
Nonce: 2314718
3,364.108309822796840891 Eth
Nonce: 2314719
0.008404557705879565
0xbD68Ab4B...70EC2F280 0.000401621454677236 Eth0.000567571454677236 Eth0.00016595
0xc6339D65...3e571e23b 0.016013556023603977 Eth0.016155506023603977 Eth0.00014195
0xCEbe1cA2...30509f56e 0.006565340279407135 Eth0.006731290279407135 Eth0.00016595
0xD67EFfCe...4ABFCFEf9
0 Eth
Nonce: 0
0.00014195 Eth
Nonce: 0
0.00014195From: 0 To: 0
0xD8e66090...81DC7E8f4 0.029050528198805937 Eth0.029221458198805937 Eth0.00017093
0xE0ac7220...3F41DE681 0.001402194189605586 Eth0.001579084189605586 Eth0.00017689
0xE39225C6...6B76fD7F2 0.593098555509972098 Eth0.593275445509972098 Eth0.00017689
0xE902a1F4...9D8E3dF11 0.001558516745848901 Eth0.001708036745848901 Eth0.00014952
0xF86549B1...d710470c8 0.00002522186639912 Eth0.00019615186639912 Eth0.00017093
0xfb080873...461BB6e31 1.218232368882028539 Eth1.218404828882028539 Eth0.00017246
0xfd3531F0...2E5051367 0.08498405870116184 Eth0.08514995870116184 Eth0.0001659
0xfF849893...8a80B69a2
0 Eth
Nonce: 0
0.00017093 Eth
Nonce: 0
0.00017093From: 0 To: 0

Execution Trace

ETH 0.00727798 ERC1967Proxy.318adb8b( )
  • ETH 0.00727798 0x6d28bc0f114e3c629320ee692ede5bdd7155e6fe.318adb8b( )
    • ETH 0.00014952 0x5b6282c25e032853d5f711e36d871d53a0ba3289.CALL( )
    • ETH 0.00014952 0xe902a1f49f257f930a0bc532ab707689d8e3df11.CALL( )
    • ETH 0.00014948 0x1a725204fde1464947fcade91ea3ee09a4e844cd.CALL( )
    • ETH 0.00014948 0x3b3cf7ae0b04ce7263ae9602b06a310d08ad9bbe.CALL( )
    • ETH 0.00014944 0x25761e5d16ac1d5a47c28f0198562e8984476ab8.CALL( )
    • ETH 0.00016051 0x5f381481998eb2dcaf4ed1b6aeea20bf1b627b62.CALL( )
    • ETH 0.00016047 0x85b16b1e9e40cb064dfd1120dcdfc505de3f81d9.CALL( )
    • ETH 0.00016047 0x74e6ebbc8d16be9249eed09b0ca4dc02ed88e2e7.CALL( )
    • ETH 0.00016047 0x4b16f24df952515ccb3b4dc5f263ce9f9d0a34d0.CALL( )
    • ETH 0.00016051 0x258fe49bc22f679521db22f573ee1ef5f68e5e6b.CALL( )
    • ETH 0.00016051 0x87e10b9609b8f235ed512a4699e2e293d4f4edd4.CALL( )
    • ETH 0.00017689 0xe39225c6d09e8581bff4d777e5b0b436b76fd7f2.CALL( )
    • ETH 0.00017689 0xe0ac7220d7158a862f57ba61587f0173f41de681.CALL( )
    • ETH 0.00017689 0x5f958499fbfbbca6e2e67f9d70f5e92a7e58e71a.CALL( )
    • ETH 0.00017689 0x5d54d5e8db2a116986cbb29c579f5a939982f945.CALL( )
    • ETH 0.00017689 0x895405b8b97235202a8ff500d51d7d0294bb3f80.CALL( )
    • ETH 0.0001659 0xfd3531f0fc78880f1df9928a6b0f7e12e5051367.CALL( )
    • ETH 0.00016595 0x29ce6e92d5785b6f2a65ae7b04242f049b3fdddc.CALL( )
    • ETH 0.00016595 0xcebe1ca20ee20474f65d7943d0c1d0430509f56e.CALL( )
    • ETH 0.00016595 0xbd68ab4bb4385272d91dff80377df0e70ec2f280.CALL( )
    • ETH 0.00018631 0x86e2ef5477c118ea59327d532cbf61c4fdb480a2.CALL( )
    • ETH 0.00018801 0x890b076100edebfd3714be136169af89044d6767.CALL( )
    • ETH 0.00018801 0x922b7b7ce3fd119eb8d477d2dbe0e222b5333b12.CALL( )
    • ETH 0.0001725 0x80eb6838aaf5603afeabfeae48caef030f5ba5ef.CALL( )
    • ETH 0.00017246 0x8f03b2bcfdbc5ec1b4871d034113c54204d0c505.CALL( )
    • ETH 0.0001725 0xaa3af73f52978e1f101ad6c73f57f984e2b7026d.CALL( )
    • ETH 0.00017246 0xfb08087321e5f57dc051f0edac4d149461bb6e31.CALL( )
    • ETH 0.0001725 0x2943c841351053390c170f4f3cf2d239ff781b54.CALL( )
    • ETH 0.0001725 0x56000b8deb246bb2c1cbeb6b47080bc6f0243299.CALL( )
    • ETH 0.0001725 0xa14188510c31485673d83a6bf823a95a7fd97c92.CALL( )
    • ETH 0.00017246 0x330dd1d5470d32bedb5b5d9a9eaae4ad6f071525.CALL( )
    • ETH 0.00017097 0x6c03e63c02aeffd1f40638fcabb2672a539bf0e2.CALL( )
    • ETH 0.00017093 0x56f30346f83bd902ee3a2b888da6b396e3ff2df3.CALL( )
    • ETH 0.00017089 0x8e0ad36ff67298ea08c054e34edb36ac4029c66b.CALL( )
    • ETH 0.00017093 0xf86549b1c4a44d34152e795cbd819ced710470c8.CALL( )
    • ETH 0.00017093 0xff849893fb1cbccca7e6e5b9d3d66108a80b69a2.CALL( )
    • ETH 0.00017093 0xa44d30ec743a85e56cde74a551533d13a4c31d0a.CALL( )
    • ETH 0.00017093 0x92aa38fe4da4167b9e4196d8561be5376bf3b7ef.CALL( )
    • ETH 0.00017093 0xd8e66090750b17a35b2396f92fa411981dc7e8f4.CALL( )
    • ETH 0.00014195 0x86cdc3eb518a52f313efe5c68b13bc6ddd4fea44.CALL( )
    • ETH 0.00014195 0xa03b40e6fc09fdf2161f24d816adaa970dbe73e0.CALL( )
    • ETH 0.00014195 0xc6339d65ca11ac8fe2772aacd88b5db3e571e23b.CALL( )
    • ETH 0.00014195 0x82c149c02ffe580c3d1acd2cba290701aa8f0105.CALL( )
    • ETH 0.00014195 0xd67effced62e330ec84aac1f015a9864abfcfef9.CALL( )
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Proxy.sol)
      pragma solidity ^0.8.20;
      import {Proxy} from "../Proxy.sol";
      import {ERC1967Utils} from "./ERC1967Utils.sol";
      /**
       * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
       * implementation address that can be changed. This address is stored in storage in the location specified by
       * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
       * implementation behind the proxy.
       */
      contract ERC1967Proxy is Proxy {
          /**
           * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.
           *
           * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an
           * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.
           *
           * Requirements:
           *
           * - If `data` is empty, `msg.value` must be zero.
           */
          constructor(address implementation, bytes memory _data) payable {
              ERC1967Utils.upgradeToAndCall(implementation, _data);
          }
          /**
           * @dev Returns the current implementation address.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
           * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
           */
          function _implementation() internal view virtual override returns (address) {
              return ERC1967Utils.getImplementation();
          }
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)
      pragma solidity ^0.8.20;
      /**
       * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
       * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
       * be specified by overriding the virtual {_implementation} function.
       *
       * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
       * different contract through the {_delegate} function.
       *
       * The success and return data of the delegated call will be returned back to the caller of the proxy.
       */
      abstract contract Proxy {
          /**
           * @dev Delegates the current call to `implementation`.
           *
           * This function does not return to its internal call site, it will return directly to the external caller.
           */
          function _delegate(address implementation) internal virtual {
              assembly {
                  // Copy msg.data. We take full control of memory in this inline assembly
                  // block because it will not return to Solidity code. We overwrite the
                  // Solidity scratch pad at memory position 0.
                  calldatacopy(0, 0, calldatasize())
                  // Call the implementation.
                  // out and outsize are 0 because we don't know the size yet.
                  let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                  // Copy the returned data.
                  returndatacopy(0, 0, returndatasize())
                  switch result
                  // delegatecall returns 0 on error.
                  case 0 {
                      revert(0, returndatasize())
                  }
                  default {
                      return(0, returndatasize())
                  }
              }
          }
          /**
           * @dev This is a virtual function that should be overridden so it returns the address to which the fallback
           * function and {_fallback} should delegate.
           */
          function _implementation() internal view virtual returns (address);
          /**
           * @dev Delegates the current call to the address returned by `_implementation()`.
           *
           * This function does not return to its internal call site, it will return directly to the external caller.
           */
          function _fallback() internal virtual {
              _delegate(_implementation());
          }
          /**
           * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
           * function in the contract matches the call data.
           */
          fallback() external payable virtual {
              _fallback();
          }
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)
      pragma solidity ^0.8.20;
      import {IBeacon} from "../beacon/IBeacon.sol";
      import {Address} from "../../utils/Address.sol";
      import {StorageSlot} from "../../utils/StorageSlot.sol";
      /**
       * @dev This abstract contract provides getters and event emitting update functions for
       * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
       */
      library ERC1967Utils {
          // We re-declare ERC-1967 events here because they can't be used directly from IERC1967.
          // This will be fixed in Solidity 0.8.21. At that point we should remove these events.
          /**
           * @dev Emitted when the implementation is upgraded.
           */
          event Upgraded(address indexed implementation);
          /**
           * @dev Emitted when the admin account has changed.
           */
          event AdminChanged(address previousAdmin, address newAdmin);
          /**
           * @dev Emitted when the beacon is changed.
           */
          event BeaconUpgraded(address indexed beacon);
          /**
           * @dev Storage slot with the address of the current implementation.
           * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
           */
          // solhint-disable-next-line private-vars-leading-underscore
          bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
          /**
           * @dev The `implementation` of the proxy is invalid.
           */
          error ERC1967InvalidImplementation(address implementation);
          /**
           * @dev The `admin` of the proxy is invalid.
           */
          error ERC1967InvalidAdmin(address admin);
          /**
           * @dev The `beacon` of the proxy is invalid.
           */
          error ERC1967InvalidBeacon(address beacon);
          /**
           * @dev An upgrade function sees `msg.value > 0` that may be lost.
           */
          error ERC1967NonPayable();
          /**
           * @dev Returns the current implementation address.
           */
          function getImplementation() internal view returns (address) {
              return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
          }
          /**
           * @dev Stores a new address in the EIP1967 implementation slot.
           */
          function _setImplementation(address newImplementation) private {
              if (newImplementation.code.length == 0) {
                  revert ERC1967InvalidImplementation(newImplementation);
              }
              StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
          }
          /**
           * @dev Performs implementation upgrade with additional setup call if data is nonempty.
           * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
           * to avoid stuck value in the contract.
           *
           * Emits an {IERC1967-Upgraded} event.
           */
          function upgradeToAndCall(address newImplementation, bytes memory data) internal {
              _setImplementation(newImplementation);
              emit Upgraded(newImplementation);
              if (data.length > 0) {
                  Address.functionDelegateCall(newImplementation, data);
              } else {
                  _checkNonPayable();
              }
          }
          /**
           * @dev Storage slot with the admin of the contract.
           * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1.
           */
          // solhint-disable-next-line private-vars-leading-underscore
          bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
          /**
           * @dev Returns the current admin.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
           * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
           */
          function getAdmin() internal view returns (address) {
              return StorageSlot.getAddressSlot(ADMIN_SLOT).value;
          }
          /**
           * @dev Stores a new address in the EIP1967 admin slot.
           */
          function _setAdmin(address newAdmin) private {
              if (newAdmin == address(0)) {
                  revert ERC1967InvalidAdmin(address(0));
              }
              StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;
          }
          /**
           * @dev Changes the admin of the proxy.
           *
           * Emits an {IERC1967-AdminChanged} event.
           */
          function changeAdmin(address newAdmin) internal {
              emit AdminChanged(getAdmin(), newAdmin);
              _setAdmin(newAdmin);
          }
          /**
           * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
           * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1.
           */
          // solhint-disable-next-line private-vars-leading-underscore
          bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
          /**
           * @dev Returns the current beacon.
           */
          function getBeacon() internal view returns (address) {
              return StorageSlot.getAddressSlot(BEACON_SLOT).value;
          }
          /**
           * @dev Stores a new beacon in the EIP1967 beacon slot.
           */
          function _setBeacon(address newBeacon) private {
              if (newBeacon.code.length == 0) {
                  revert ERC1967InvalidBeacon(newBeacon);
              }
              StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;
              address beaconImplementation = IBeacon(newBeacon).implementation();
              if (beaconImplementation.code.length == 0) {
                  revert ERC1967InvalidImplementation(beaconImplementation);
              }
          }
          /**
           * @dev Change the beacon and trigger a setup call if data is nonempty.
           * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
           * to avoid stuck value in the contract.
           *
           * Emits an {IERC1967-BeaconUpgraded} event.
           *
           * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since
           * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for
           * efficiency.
           */
          function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {
              _setBeacon(newBeacon);
              emit BeaconUpgraded(newBeacon);
              if (data.length > 0) {
                  Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
              } else {
                  _checkNonPayable();
              }
          }
          /**
           * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract
           * if an upgrade doesn't perform an initialization call.
           */
          function _checkNonPayable() private {
              if (msg.value > 0) {
                  revert ERC1967NonPayable();
              }
          }
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
      pragma solidity ^0.8.20;
      /**
       * @dev This is the interface that {BeaconProxy} expects of its beacon.
       */
      interface IBeacon {
          /**
           * @dev Must return an address that can be used as a delegate call target.
           *
           * {UpgradeableBeacon} will check that this address is a contract.
           */
          function implementation() external view returns (address);
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
      pragma solidity ^0.8.20;
      /**
       * @dev Collection of functions related to the address type
       */
      library Address {
          /**
           * @dev The ETH balance of the account is not enough to perform the operation.
           */
          error AddressInsufficientBalance(address account);
          /**
           * @dev There's no code at `target` (it is not a contract).
           */
          error AddressEmptyCode(address target);
          /**
           * @dev A call to an address target failed. The target may have reverted.
           */
          error FailedInnerCall();
          /**
           * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
           * `recipient`, forwarding all available gas and reverting on errors.
           *
           * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
           * of certain opcodes, possibly making contracts go over the 2300 gas limit
           * imposed by `transfer`, making them unable to receive funds via
           * `transfer`. {sendValue} removes this limitation.
           *
           * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
           *
           * IMPORTANT: because control is transferred to `recipient`, care must be
           * taken to not create reentrancy vulnerabilities. Consider using
           * {ReentrancyGuard} or the
           * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
           */
          function sendValue(address payable recipient, uint256 amount) internal {
              if (address(this).balance < amount) {
                  revert AddressInsufficientBalance(address(this));
              }
              (bool success, ) = recipient.call{value: amount}("");
              if (!success) {
                  revert FailedInnerCall();
              }
          }
          /**
           * @dev Performs a Solidity function call using a low level `call`. A
           * plain `call` is an unsafe replacement for a function call: use this
           * function instead.
           *
           * If `target` reverts with a revert reason or custom error, it is bubbled
           * up by this function (like regular Solidity function calls). However, if
           * the call reverted with no returned reason, this function reverts with a
           * {FailedInnerCall} error.
           *
           * Returns the raw returned data. To convert to the expected return value,
           * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
           *
           * Requirements:
           *
           * - `target` must be a contract.
           * - calling `target` with `data` must not revert.
           */
          function functionCall(address target, bytes memory data) internal returns (bytes memory) {
              return functionCallWithValue(target, data, 0);
          }
          /**
           * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
           * but also transferring `value` wei to `target`.
           *
           * Requirements:
           *
           * - the calling contract must have an ETH balance of at least `value`.
           * - the called Solidity function must be `payable`.
           */
          function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
              if (address(this).balance < value) {
                  revert AddressInsufficientBalance(address(this));
              }
              (bool success, bytes memory returndata) = target.call{value: value}(data);
              return verifyCallResultFromTarget(target, success, returndata);
          }
          /**
           * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
           * but performing a static call.
           */
          function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
              (bool success, bytes memory returndata) = target.staticcall(data);
              return verifyCallResultFromTarget(target, success, returndata);
          }
          /**
           * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
           * but performing a delegate call.
           */
          function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
              (bool success, bytes memory returndata) = target.delegatecall(data);
              return verifyCallResultFromTarget(target, success, returndata);
          }
          /**
           * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
           * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
           * unsuccessful call.
           */
          function verifyCallResultFromTarget(
              address target,
              bool success,
              bytes memory returndata
          ) internal view returns (bytes memory) {
              if (!success) {
                  _revert(returndata);
              } else {
                  // only check if target is a contract if the call was successful and the return data is empty
                  // otherwise we already know that it was a contract
                  if (returndata.length == 0 && target.code.length == 0) {
                      revert AddressEmptyCode(target);
                  }
                  return returndata;
              }
          }
          /**
           * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
           * revert reason or with a default {FailedInnerCall} error.
           */
          function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
              if (!success) {
                  _revert(returndata);
              } else {
                  return returndata;
              }
          }
          /**
           * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
           */
          function _revert(bytes memory returndata) private pure {
              // Look for revert reason and bubble it up if present
              if (returndata.length > 0) {
                  // The easiest way to bubble the revert reason is using memory via assembly
                  /// @solidity memory-safe-assembly
                  assembly {
                      let returndata_size := mload(returndata)
                      revert(add(32, returndata), returndata_size)
                  }
              } else {
                  revert FailedInnerCall();
              }
          }
      }
      // SPDX-License-Identifier: MIT
      // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
      // This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
      pragma solidity ^0.8.20;
      /**
       * @dev Library for reading and writing primitive types to specific storage slots.
       *
       * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
       * This library helps with reading and writing to such slots without the need for inline assembly.
       *
       * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
       *
       * Example usage to set ERC1967 implementation slot:
       * ```solidity
       * contract ERC1967 {
       *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
       *
       *     function _getImplementation() internal view returns (address) {
       *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
       *     }
       *
       *     function _setImplementation(address newImplementation) internal {
       *         require(newImplementation.code.length > 0);
       *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
       *     }
       * }
       * ```
       */
      library StorageSlot {
          struct AddressSlot {
              address value;
          }
          struct BooleanSlot {
              bool value;
          }
          struct Bytes32Slot {
              bytes32 value;
          }
          struct Uint256Slot {
              uint256 value;
          }
          struct StringSlot {
              string value;
          }
          struct BytesSlot {
              bytes value;
          }
          /**
           * @dev Returns an `AddressSlot` with member `value` located at `slot`.
           */
          function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
           */
          function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
           */
          function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
           */
          function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `StringSlot` with member `value` located at `slot`.
           */
          function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
           */
          function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := store.slot
              }
          }
          /**
           * @dev Returns an `BytesSlot` with member `value` located at `slot`.
           */
          function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := slot
              }
          }
          /**
           * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
           */
          function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
              /// @solidity memory-safe-assembly
              assembly {
                  r.slot := store.slot
              }
          }
      }