ETH Price: $1,975.26 (+0.07%)

Transaction Decoder

Block:
24503365 at Feb-21-2026 06:12:23 AM +UTC
Transaction Fee:
0.00000551250180848 ETH $0.01
Gas Used:
132,284 Gas / 0.04167172 Gwei

Emitted Events:

383 DepositContract.DepositEvent( pubkey=0x91368CF4A7CDC246D548B4B3E98395F3588FD11F0B001473DB60851E15ACF40E46402F72222BB76F0084714FFA4EAE73, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, amount=0x0040597307000000, signature=0x8D7B3522C9E9C3BAE8A4832850305A15A69FA70AC8DC578FE73AA0CE1E822A2E08591096586D482827F580708D692E20007FD7C9300B8B7CA4391D5CC6D03FF89416DE746EA5CA2F8FA4D5F357A4670E6C4A7C0B3684A2A7789BCC68161AE1D2, index=0x44FE240000000000 )
384 DepositContract.DepositEvent( pubkey=0x8AC151F65BD2E3A6FCCDDB03F5EFD58209C33FD621BC629C76B6D79C0527FF7D220B6C596A7BAFA2AA76D194799BC7D0, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, amount=0x0040597307000000, signature=0x87BA44EF806DA4C48E4D32E1C69AE266EC1F65AA28C661BB3524AB66316F871B230F6096DE4EF7D6DA4A65CE4B85FC3402F9D5F8D7419EBA2DDB5109441CC34F55CBDDD2473BAB6575BE98D7E6CD20EB6E809CC8773DB04C97D6E22724C51238, index=0x45FE240000000000 )
385 DepositContract.DepositEvent( pubkey=0x97313AE0F25F70351C4FFB58C18EC57ADBF6EA89265E4CB5EB0FB1C4ACD8A104370D21906FEC47FEC6A43C3C17CC4F12, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, amount=0x0040597307000000, signature=0x854D9DB80AC863F9B4F1429AF9C12F978B00577604D219C003860F88BFBFC0F700B4ED8AE137EB2806C3CF82E92582F60B32D607DD02FD2C9D733D794AD3AB541275339627646F73B86FD4DC2D236E57DE364CF4FCC703B2A95A30AE4714A052, index=0x46FE240000000000 )
386 FigmentEth2Depositor.DepositEvent( from=[Sender] 0xc3cf97b871299f535dcc1b87b9a324b62c0bb7ee, nodesAmount=3 )

Account State Difference:

  Address   Before After State Difference Code
0x00000000...03d7705Fa
(Beacon Deposit Contract)
81,037,398.633195126052973487 Eth81,037,494.633195126052973487 Eth96
0xc3cf97b8...62c0Bb7Ee
15,015.609251460387370163 Eth
Nonce: 1101
14,919.609245947885561683 Eth
Nonce: 1102
96.00000551250180848
(BuilderNet)
128.130192783656828492 Eth128.130192799530908492 Eth0.00000001587408

Execution Trace

ETH 96 FigmentEth2Depositor.deposit( )
  • ETH 32 DepositContract.deposit( pubkey=0x91368CF4A7CDC246D548B4B3E98395F3588FD11F0B001473DB60851E15ACF40E46402F72222BB76F0084714FFA4EAE73, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, signature=0x8D7B3522C9E9C3BAE8A4832850305A15A69FA70AC8DC578FE73AA0CE1E822A2E08591096586D482827F580708D692E20007FD7C9300B8B7CA4391D5CC6D03FF89416DE746EA5CA2F8FA4D5F357A4670E6C4A7C0B3684A2A7789BCC68161AE1D2, deposit_data_root=6376EB16F5E99EE8A808E2B75A73248BC7F4D28E6E50BBDE05B526526317AB9A )
    • Null: 0x000...002.91368cf4( )
    • Null: 0x000...002.8d7b3522( )
    • Null: 0x000...002.9416de74( )
    • Null: 0x000...002.76dc1f56( )
    • Null: 0x000...002.81c7a441( )
    • Null: 0x000...002.00405973( )
    • Null: 0x000...002.fac68780( )
    • ETH 32 DepositContract.deposit( pubkey=0x8AC151F65BD2E3A6FCCDDB03F5EFD58209C33FD621BC629C76B6D79C0527FF7D220B6C596A7BAFA2AA76D194799BC7D0, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, signature=0x87BA44EF806DA4C48E4D32E1C69AE266EC1F65AA28C661BB3524AB66316F871B230F6096DE4EF7D6DA4A65CE4B85FC3402F9D5F8D7419EBA2DDB5109441CC34F55CBDDD2473BAB6575BE98D7E6CD20EB6E809CC8773DB04C97D6E22724C51238, deposit_data_root=C88413B3A9B92D6E13ABE61F08930370F1964523109A1BA7FE9FB59514662485 )
      • Null: 0x000...002.8ac151f6( )
      • Null: 0x000...002.87ba44ef( )
      • Null: 0x000...002.55cbddd2( )
      • Null: 0x000...002.15206dd7( )
      • Null: 0x000...002.ca26c09b( )
      • Null: 0x000...002.00405973( )
      • Null: 0x000...002.cea7db60( )
      • Null: 0x000...002.6376eb16( )
      • ETH 32 DepositContract.deposit( pubkey=0x97313AE0F25F70351C4FFB58C18EC57ADBF6EA89265E4CB5EB0FB1C4ACD8A104370D21906FEC47FEC6A43C3C17CC4F12, withdrawal_credentials=0x01000000000000000000000008EC37E2EB451AB6FB29FC14D215B0AEEF170040, signature=0x854D9DB80AC863F9B4F1429AF9C12F978B00577604D219C003860F88BFBFC0F700B4ED8AE137EB2806C3CF82E92582F60B32D607DD02FD2C9D733D794AD3AB541275339627646F73B86FD4DC2D236E57DE364CF4FCC703B2A95A30AE4714A052, deposit_data_root=AAC008F016BA7CF88E45642853CC23BD15F6AEA403FB93E2C8BB6DF751D4DC81 )
        • Null: 0x000...002.97313ae0( )
        • Null: 0x000...002.854d9db8( )
        • Null: 0x000...002.12753396( )
        • Null: 0x000...002.a7b87729( )
        • Null: 0x000...002.763d70bc( )
        • Null: 0x000...002.00405973( )
        • Null: 0x000...002.741c54fc( )
          File 1 of 2: FigmentEth2Depositor
          // SPDX-License-Identifier: MIT
          pragma solidity ^0.8.0;
          import "../utils/Context.sol";
          /**
           * @dev Contract module which provides a basic access control mechanism, where
           * there is an account (an owner) that can be granted exclusive access to
           * specific functions.
           *
           * By default, the owner account will be the one that deploys the contract. This
           * can later be changed with {transferOwnership}.
           *
           * This module is used through inheritance. It will make available the modifier
           * `onlyOwner`, which can be applied to your functions to restrict their use to
           * the owner.
           */
          abstract contract Ownable is Context {
              address private _owner;
              event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
              /**
               * @dev Initializes the contract setting the deployer as the initial owner.
               */
              constructor() {
                  _setOwner(_msgSender());
              }
              /**
               * @dev Returns the address of the current owner.
               */
              function owner() public view virtual returns (address) {
                  return _owner;
              }
              /**
               * @dev Throws if called by any account other than the owner.
               */
              modifier onlyOwner() {
                  require(owner() == _msgSender(), "Ownable: caller is not the owner");
                  _;
              }
              /**
               * @dev Leaves the contract without owner. It will not be possible to call
               * `onlyOwner` functions anymore. Can only be called by the current owner.
               *
               * NOTE: Renouncing ownership will leave the contract without an owner,
               * thereby removing any functionality that is only available to the owner.
               */
              function renounceOwnership() public virtual onlyOwner {
                  _setOwner(address(0));
              }
              /**
               * @dev Transfers ownership of the contract to a new account (`newOwner`).
               * Can only be called by the current owner.
               */
              function transferOwnership(address newOwner) public virtual onlyOwner {
                  require(newOwner != address(0), "Ownable: new owner is the zero address");
                  _setOwner(newOwner);
              }
              function _setOwner(address newOwner) private {
                  address oldOwner = _owner;
                  _owner = newOwner;
                  emit OwnershipTransferred(oldOwner, newOwner);
              }
          }
          // SPDX-License-Identifier: MIT
          pragma solidity ^0.8.0;
          import "../utils/Context.sol";
          /**
           * @dev Contract module which allows children to implement an emergency stop
           * mechanism that can be triggered by an authorized account.
           *
           * This module is used through inheritance. It will make available the
           * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
           * the functions of your contract. Note that they will not be pausable by
           * simply including this module, only once the modifiers are put in place.
           */
          abstract contract Pausable is Context {
              /**
               * @dev Emitted when the pause is triggered by `account`.
               */
              event Paused(address account);
              /**
               * @dev Emitted when the pause is lifted by `account`.
               */
              event Unpaused(address account);
              bool private _paused;
              /**
               * @dev Initializes the contract in unpaused state.
               */
              constructor() {
                  _paused = false;
              }
              /**
               * @dev Returns true if the contract is paused, and false otherwise.
               */
              function paused() public view virtual returns (bool) {
                  return _paused;
              }
              /**
               * @dev Modifier to make a function callable only when the contract is not paused.
               *
               * Requirements:
               *
               * - The contract must not be paused.
               */
              modifier whenNotPaused() {
                  require(!paused(), "Pausable: paused");
                  _;
              }
              /**
               * @dev Modifier to make a function callable only when the contract is paused.
               *
               * Requirements:
               *
               * - The contract must be paused.
               */
              modifier whenPaused() {
                  require(paused(), "Pausable: not paused");
                  _;
              }
              /**
               * @dev Triggers stopped state.
               *
               * Requirements:
               *
               * - The contract must not be paused.
               */
              function _pause() internal virtual whenNotPaused {
                  _paused = true;
                  emit Paused(_msgSender());
              }
              /**
               * @dev Returns to normal state.
               *
               * Requirements:
               *
               * - The contract must be paused.
               */
              function _unpause() internal virtual whenPaused {
                  _paused = false;
                  emit Unpaused(_msgSender());
              }
          }
          // SPDX-License-Identifier: MIT
          pragma solidity ^0.8.0;
          /**
           * @dev Provides information about the current execution context, including the
           * sender of the transaction and its data. While these are generally available
           * via msg.sender and msg.data, they should not be accessed in such a direct
           * manner, since when dealing with meta-transactions the account sending and
           * paying for execution may not be the actual sender (as far as an application
           * is concerned).
           *
           * This contract is only required for intermediate, library-like contracts.
           */
          abstract contract Context {
              function _msgSender() internal view virtual returns (address) {
                  return msg.sender;
              }
              function _msgData() internal view virtual returns (bytes calldata) {
                  return msg.data;
              }
          }
          // SPDX-License-Identifier: MIT
          pragma solidity 0.8.10;
          import "@openzeppelin/contracts/access/Ownable.sol";
          import "@openzeppelin/contracts/security/Pausable.sol";
          import "../contracts/interfaces/IDepositContract.sol";
          contract FigmentEth2Depositor is Pausable, Ownable {
              /**
               * @dev Eth2 Deposit Contract address.
               */
              IDepositContract public immutable depositContract;
              /**
               * @dev Minimal and maximum amount of nodes per transaction.
               */
              uint256 public constant nodesMinAmount = 1;
              uint256 public constant pubkeyLength = 48;
              uint256 public constant credentialsLength = 32;
              uint256 public constant signatureLength = 96;
              /**
               * @dev Collateral size of one node.
               */
              uint256 public constant collateral = 32 ether;
              /**
               * @dev Setting Eth2 Smart Contract address during construction.
               */
              constructor(address depositContract_) {
                  require(depositContract_ != address(0), "Zero address");
                  depositContract = IDepositContract(depositContract_);
              }
              /**
               * @dev This contract will not accept direct ETH transactions.
               */
              receive() external payable {
                  revert("Do not send ETH here");
              }
              /**
               * @dev Function that allows to deposit many nodes at once.
               *
               * - pubkeys                - Array of BLS12-381 public keys.
               * - withdrawal_credentials - Array of commitments to a public keys for withdrawals.
               * - signatures             - Array of BLS12-381 signatures.
               * - deposit_data_roots     - Array of the SHA-256 hashes of the SSZ-encoded DepositData objects.
               */
              function deposit(
                  bytes[] calldata pubkeys,
                  bytes[] calldata withdrawal_credentials,
                  bytes[] calldata signatures,
                  bytes32[] calldata deposit_data_roots
              ) external payable whenNotPaused {
                  uint256 nodesAmount = pubkeys.length;
                  require(nodesAmount > 0, "1 node min / tx");
                  require(msg.value == collateral * nodesAmount, "ETH amount mismatch");
                  require(
                      withdrawal_credentials.length == nodesAmount &&
                      signatures.length == nodesAmount &&
                      deposit_data_roots.length == nodesAmount,
                      "Parameters mismatch");
                  for (uint256 i; i < nodesAmount; ++i) {
                      require(pubkeys[i].length == pubkeyLength, "Wrong pubkey");
                      require(withdrawal_credentials[i].length == credentialsLength, "Wrong withdrawal cred");
                      require(signatures[i].length == signatureLength, "Wrong signatures");
                      IDepositContract(address(depositContract)).deposit{value: collateral}(
                          pubkeys[i],
                          withdrawal_credentials[i],
                          signatures[i],
                          deposit_data_roots[i]
                      );
                  }
                  emit DepositEvent(msg.sender, nodesAmount);
              }
              /**
               * @dev Triggers stopped state.
               *
               * Requirements:
               *
               * - The contract must not be paused.
               */
              function pause() external onlyOwner {
                _pause();
              }
              /**
               * @dev Returns to normal state.
               *
               * Requirements:
               *
               * - The contract must be paused.
               */
              function unpause() external onlyOwner {
                _unpause();
              }
              event DepositEvent(address from, uint256 nodesAmount);
          }
          // SPDX-License-Identifier: CC0-1.0
          pragma solidity ^0.8.0;
          // This interface is designed to be compatible with the Vyper version.
          /// @notice This is the Ethereum 2.0 deposit contract interface.
          /// For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs
          interface IDepositContract {
              /// @notice A processed deposit event.
              event DepositEvent(
                  bytes pubkey,
                  bytes withdrawal_credentials,
                  bytes amount,
                  bytes signature,
                  bytes index
              );
              /// @notice Submit a Phase 0 DepositData object.
              /// @param pubkey A BLS12-381 public key.
              /// @param withdrawal_credentials Commitment to a public key for withdrawals.
              /// @param signature A BLS12-381 signature.
              /// @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.
              /// Used as a protection against malformed input.
              function deposit(
                  bytes calldata pubkey,
                  bytes calldata withdrawal_credentials,
                  bytes calldata signature,
                  bytes32 deposit_data_root
              ) external payable;
              /// @notice Query the current deposit root hash.
              /// @return The deposit root hash.
              function get_deposit_root() external view returns (bytes32);
              /// @notice Query the current deposit count.
              /// @return The deposit count encoded as a little endian 64-bit number.
              function get_deposit_count() external view returns (bytes memory);
          }
          

          File 2 of 2: DepositContract
          // ┏━━━┓━┏┓━┏┓━━┏━━━┓━━┏━━━┓━━━━┏━━━┓━━━━━━━━━━━━━━━━━━━┏┓━━━━━┏━━━┓━━━━━━━━━┏┓━━━━━━━━━━━━━━┏┓━
          // ┃┏━━┛┏┛┗┓┃┃━━┃┏━┓┃━━┃┏━┓┃━━━━┗┓┏┓┃━━━━━━━━━━━━━━━━━━┏┛┗┓━━━━┃┏━┓┃━━━━━━━━┏┛┗┓━━━━━━━━━━━━┏┛┗┓
          // ┃┗━━┓┗┓┏┛┃┗━┓┗┛┏┛┃━━┃┃━┃┃━━━━━┃┃┃┃┏━━┓┏━━┓┏━━┓┏━━┓┏┓┗┓┏┛━━━━┃┃━┗┛┏━━┓┏━┓━┗┓┏┛┏━┓┏━━┓━┏━━┓┗┓┏┛
          // ┃┏━━┛━┃┃━┃┏┓┃┏━┛┏┛━━┃┃━┃┃━━━━━┃┃┃┃┃┏┓┃┃┏┓┃┃┏┓┃┃━━┫┣┫━┃┃━━━━━┃┃━┏┓┃┏┓┃┃┏┓┓━┃┃━┃┏┛┗━┓┃━┃┏━┛━┃┃━
          // ┃┗━━┓━┃┗┓┃┃┃┃┃┃┗━┓┏┓┃┗━┛┃━━━━┏┛┗┛┃┃┃━┫┃┗┛┃┃┗┛┃┣━━┃┃┃━┃┗┓━━━━┃┗━┛┃┃┗┛┃┃┃┃┃━┃┗┓┃┃━┃┗┛┗┓┃┗━┓━┃┗┓
          // ┗━━━┛━┗━┛┗┛┗┛┗━━━┛┗┛┗━━━┛━━━━┗━━━┛┗━━┛┃┏━┛┗━━┛┗━━┛┗┛━┗━┛━━━━┗━━━┛┗━━┛┗┛┗┛━┗━┛┗┛━┗━━━┛┗━━┛━┗━┛
          // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
          // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┗┛━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
          
          // SPDX-License-Identifier: CC0-1.0
          
          pragma solidity 0.6.11;
          
          // This interface is designed to be compatible with the Vyper version.
          /// @notice This is the Ethereum 2.0 deposit contract interface.
          /// For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs
          interface IDepositContract {
              /// @notice A processed deposit event.
              event DepositEvent(
                  bytes pubkey,
                  bytes withdrawal_credentials,
                  bytes amount,
                  bytes signature,
                  bytes index
              );
          
              /// @notice Submit a Phase 0 DepositData object.
              /// @param pubkey A BLS12-381 public key.
              /// @param withdrawal_credentials Commitment to a public key for withdrawals.
              /// @param signature A BLS12-381 signature.
              /// @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.
              /// Used as a protection against malformed input.
              function deposit(
                  bytes calldata pubkey,
                  bytes calldata withdrawal_credentials,
                  bytes calldata signature,
                  bytes32 deposit_data_root
              ) external payable;
          
              /// @notice Query the current deposit root hash.
              /// @return The deposit root hash.
              function get_deposit_root() external view returns (bytes32);
          
              /// @notice Query the current deposit count.
              /// @return The deposit count encoded as a little endian 64-bit number.
              function get_deposit_count() external view returns (bytes memory);
          }
          
          // Based on official specification in https://eips.ethereum.org/EIPS/eip-165
          interface ERC165 {
              /// @notice Query if a contract implements an interface
              /// @param interfaceId The interface identifier, as specified in ERC-165
              /// @dev Interface identification is specified in ERC-165. This function
              ///  uses less than 30,000 gas.
              /// @return `true` if the contract implements `interfaceId` and
              ///  `interfaceId` is not 0xffffffff, `false` otherwise
              function supportsInterface(bytes4 interfaceId) external pure returns (bool);
          }
          
          // This is a rewrite of the Vyper Eth2.0 deposit contract in Solidity.
          // It tries to stay as close as possible to the original source code.
          /// @notice This is the Ethereum 2.0 deposit contract interface.
          /// For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs
          contract DepositContract is IDepositContract, ERC165 {
              uint constant DEPOSIT_CONTRACT_TREE_DEPTH = 32;
              // NOTE: this also ensures `deposit_count` will fit into 64-bits
              uint constant MAX_DEPOSIT_COUNT = 2**DEPOSIT_CONTRACT_TREE_DEPTH - 1;
          
              bytes32[DEPOSIT_CONTRACT_TREE_DEPTH] branch;
              uint256 deposit_count;
          
              bytes32[DEPOSIT_CONTRACT_TREE_DEPTH] zero_hashes;
          
              constructor() public {
                  // Compute hashes in empty sparse Merkle tree
                  for (uint height = 0; height < DEPOSIT_CONTRACT_TREE_DEPTH - 1; height++)
                      zero_hashes[height + 1] = sha256(abi.encodePacked(zero_hashes[height], zero_hashes[height]));
              }
          
              function get_deposit_root() override external view returns (bytes32) {
                  bytes32 node;
                  uint size = deposit_count;
                  for (uint height = 0; height < DEPOSIT_CONTRACT_TREE_DEPTH; height++) {
                      if ((size & 1) == 1)
                          node = sha256(abi.encodePacked(branch[height], node));
                      else
                          node = sha256(abi.encodePacked(node, zero_hashes[height]));
                      size /= 2;
                  }
                  return sha256(abi.encodePacked(
                      node,
                      to_little_endian_64(uint64(deposit_count)),
                      bytes24(0)
                  ));
              }
          
              function get_deposit_count() override external view returns (bytes memory) {
                  return to_little_endian_64(uint64(deposit_count));
              }
          
              function deposit(
                  bytes calldata pubkey,
                  bytes calldata withdrawal_credentials,
                  bytes calldata signature,
                  bytes32 deposit_data_root
              ) override external payable {
                  // Extended ABI length checks since dynamic types are used.
                  require(pubkey.length == 48, "DepositContract: invalid pubkey length");
                  require(withdrawal_credentials.length == 32, "DepositContract: invalid withdrawal_credentials length");
                  require(signature.length == 96, "DepositContract: invalid signature length");
          
                  // Check deposit amount
                  require(msg.value >= 1 ether, "DepositContract: deposit value too low");
                  require(msg.value % 1 gwei == 0, "DepositContract: deposit value not multiple of gwei");
                  uint deposit_amount = msg.value / 1 gwei;
                  require(deposit_amount <= type(uint64).max, "DepositContract: deposit value too high");
          
                  // Emit `DepositEvent` log
                  bytes memory amount = to_little_endian_64(uint64(deposit_amount));
                  emit DepositEvent(
                      pubkey,
                      withdrawal_credentials,
                      amount,
                      signature,
                      to_little_endian_64(uint64(deposit_count))
                  );
          
                  // Compute deposit data root (`DepositData` hash tree root)
                  bytes32 pubkey_root = sha256(abi.encodePacked(pubkey, bytes16(0)));
                  bytes32 signature_root = sha256(abi.encodePacked(
                      sha256(abi.encodePacked(signature[:64])),
                      sha256(abi.encodePacked(signature[64:], bytes32(0)))
                  ));
                  bytes32 node = sha256(abi.encodePacked(
                      sha256(abi.encodePacked(pubkey_root, withdrawal_credentials)),
                      sha256(abi.encodePacked(amount, bytes24(0), signature_root))
                  ));
          
                  // Verify computed and expected deposit data roots match
                  require(node == deposit_data_root, "DepositContract: reconstructed DepositData does not match supplied deposit_data_root");
          
                  // Avoid overflowing the Merkle tree (and prevent edge case in computing `branch`)
                  require(deposit_count < MAX_DEPOSIT_COUNT, "DepositContract: merkle tree full");
          
                  // Add deposit data root to Merkle tree (update a single `branch` node)
                  deposit_count += 1;
                  uint size = deposit_count;
                  for (uint height = 0; height < DEPOSIT_CONTRACT_TREE_DEPTH; height++) {
                      if ((size & 1) == 1) {
                          branch[height] = node;
                          return;
                      }
                      node = sha256(abi.encodePacked(branch[height], node));
                      size /= 2;
                  }
                  // As the loop should always end prematurely with the `return` statement,
                  // this code should be unreachable. We assert `false` just to be safe.
                  assert(false);
              }
          
              function supportsInterface(bytes4 interfaceId) override external pure returns (bool) {
                  return interfaceId == type(ERC165).interfaceId || interfaceId == type(IDepositContract).interfaceId;
              }
          
              function to_little_endian_64(uint64 value) internal pure returns (bytes memory ret) {
                  ret = new bytes(8);
                  bytes8 bytesValue = bytes8(value);
                  // Byteswapping during copying to bytes.
                  ret[0] = bytesValue[7];
                  ret[1] = bytesValue[6];
                  ret[2] = bytesValue[5];
                  ret[3] = bytesValue[4];
                  ret[4] = bytesValue[3];
                  ret[5] = bytesValue[2];
                  ret[6] = bytesValue[1];
                  ret[7] = bytesValue[0];
              }
          }