Free tool · runs in your browser · no signup

Hash Verifier

See exactly what you're about to sign. Paste what your wallet is showing you and get a plain-English answer — or recompute a Safe transaction hash, decode any EIP-712 request, and hash a message to compare against your hardware wallet. Blind-signing is how the biggest treasuries get drained; this closes that gap.

100% in your browserEverything runs locally in JavaScript — no data is sent anywhere, no server, no tracking. Works offline: save the page and pull the network cable. The hashing is a from-scratch implementation of EIP-712 and Safe's on-chain type definitions; verify it against your hardware wallet for a second, independent path.
Early releaseCoverage is still expanding. Common Safe, EIP-712, calldata and router cases decode today; rarer formats may decode incompletely. Treat the output as a second opinion, not the final word — confirm the hash on your hardware wallet or Safe UI before you sign. Found something off? Tell us and we'll fix it.

What does this transaction do?

Paste whatever your wallet is showing you — the calldata, the signature request, the Safe transaction. We work out the format and tell you in plain English what it lets someone do. Everything happens in this page; nothing is sent anywhere.

You can copy this from the contract's page on a block explorer, or from the app's docs. We check it against the selector so a wrong signature cannot silently mis-decode.

Optional — sharpens the answer
Advanced tools — recompute a Safe transaction hash, decode EIP-712, hash a message

Enter the Safe transaction fields (from the Safe UI's "Advanced details", a proposal JSON, or a treasury ticket), or paste the wallet's EIP-712 typed-data JSON below to auto-fill. This recomputes the Safe transaction hash and decodes what the call does. Load example

Paste the exact eth_signTypedData_v4 payload your wallet (MetaMask, Rabby, Ledger Live, any EIP-712 signer) is asking you to sign. This computes the domain separator, the struct hash, and the final signing digest, and renders the message so you can read it. Works for Permit, Permit2, Safe, orders — any typed data. Load example

Paste raw transaction calldata (the data field) to decode the function and its arguments — ERC-20 transfer/approve, Safe owner & module changes, MultiSend batches, and more. Load example

Compute the hash a wallet signs for a plain message. personal_sign applies the EIP-191 prefix (what MetaMask "Sign message" shows). Add a Safe address + network to also get the Safe off-chain message hash. Load example