```\nfunction \_validateWithdrawSignature(\n  address \_stealthAddr,\n  address \_acceptor,\n  address \_tokenAddr,\n  address \_sponsor,\n  uint256 \_sponsorFee,\n  IUmbraHookReceiver \_hook,\n  bytes memory \_data,\n  uint8 \_v,\n  bytes32 \_r,\n  bytes32 \_s\n) internal view {\n  bytes32 \_digest =\n    keccak256(\n      abi.encodePacked(\n        "\x19Ethereum Signed Message:\n32",\n        keccak256(abi.encode(chainId, version, \_acceptor, \_tokenAddr, \_sponsor, \_sponsorFee, address(\_hook), \_data))\n      )\n    );\n\n  address \_recoveredAddress = ecrecover(\_digest, \_v, \_r, \_s);\n  require(\_recoveredAddress != address(0) && \_recoveredAddress == \_stealthAddr, "Umbra: Invalid Signature");\n}\n```\n