Know what you sign.
Before anyone signs.

Hashvard watches your Safe multisig, admin keys and contracts. Every queued transaction is decoded from raw calldata, its hashes are recomputed for your hardware wallet, and risky actions land in your team's Telegram — usually while only the proposer has signed.

Most watchers forward what the Safe service says. Hashvard does not trust the UI or the service: it recomputes safeTxHash, domain and message hashes from the raw fields and decodes calldata itself.

Real output · Bybit exploit transaction replayed through Hashvard
● CRITICAL · Safe tx · ethereum
Safe 0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4
Safe v1.1.1 · nonce 71

Action: DELEGATECALL transfer → 0x96221423681A6d52E184D440a8eFCEbB105C7242

● DELEGATECALL to non-standard contract: it gets full control of the Safe's storage

Verify on your hardware wallet:
safeTxHash 0xb3476d061aeb8fc1d605a873c483a2402d88a68a9cdd1a8b47655dd55ba004f8 ✓ equals the hash the Safe emitted on‑chain
domain 0xb3ded2bdbff5db1a87f6d551fa256e9f2bd6517a3bb84f4c2ea863fb3a559622
message 0xea68fc75e93bf7286b1257680ca8e2033bfadd8e1cb8a23f3ca18f1031ecf1e0

When it fires: as soon as a transaction is proposed, not after execution. The Bybit transaction carried 3 signatures (visible in its calldata), so an alert at the first one would have reached the signers who came after.

Inputs read from chain: tx 0x46de…7882, block 21,895,238. The recomputed safeTxHash matches the ExecutionSuccess event of the Bybit Safe exactly.

The losses that keep happening are signing failures

The biggest incidents of 2025–2026 were not code bugs. People approved something other than what they were shown.

$1.5B

Bybit · Feb 2025

Signers were shown a routine transfer. The Safe actually delegatecalled into an attacker contract.

On-chain transaction ↗
$285M

Drift · Apr 2026

Security-council signers were socially engineered into pre-signing an admin transfer.

TRM Labs ↗ · BlockSec ↗
~$352M

Bitget · Sep 2026

Spoofed transfers passed the normal approval flow. Keys were not stolen.

CoinDesk ↗

Bybit, step by step

The same transaction, three views. Hashvard reads the third one.

What signers were shown

A routine transfer from the cold wallet, presented by a compromised web interface.

What the calldata said

operation = 1 (DELEGATECALL) to 0x9622…7242, an unknown contract, calling transfer(0xbDd0…9516, 0). Executed with delegatecall, that call runs inside the Safe and rewrites its storage.

What Hashvard flags

CRITICAL — DELEGATECALL to non-standard contract. Only the official MultiSend, SignMessageLib and CreateCall libraries are expected here. Plus the exact hashes the hardware wallet displays.

What Hashvard catches

Watching the Safe queue is necessary but not enough: an upgrade, a role grant or an owner change can also come from a timelock, a module or another key. Hashvard runs two independent watches — the signing queue and the on-chain admin surface.

critical

Delegatecall outside MultiSend

Anything other than the official Safe libraries gets full control of your Safe. Flagged at the top level and inside batches.

critical

Signer setup changes

Owners, threshold, modules, guard, fallback handler, singleton — queued or already executed.

critical

Hash mismatch

We recompute safeTxHash, domain and message hashes ourselves. If the service disagrees, you hear about it.

high

Upgrades & admin changes

Proxy implementation, ProxyAdmin owner, beacon, owner(), roles granted or revoked, timelock delay.

high

Unlimited approvals

ERC-20 approvals, Permit2 allowances and setApprovalForAll from your treasury, decoded per call.

medium

Pauses, timelock actions, unknown calls

Everything else that changes who controls the protocol, explained in plain words.

How it works

No contracts to deploy, no keys to share. Read-only from day one.

Add addresses

Send your Safe, proxy, timelock or token contract to @Hashvard_bot — or use the form below.

We take a baseline

Signers, threshold, modules, guard, proxy admin, owner, roles, pause state, timelock delay.

Alerts in Telegram

Every new queued transaction and every change to the baseline. Add the bot to your signers' group so everyone sees it.

Where the data comes from. The queue of proposed transactions comes from the Safe Transaction Service. Everything we judge it by is our own: the hashes are recomputed from the raw fields, every signature in the queue must recover to a current owner for our hash, and owners, threshold, modules and proxy implementations are read from the chain over our own RPC — not from the service's answer. A service that shows different fields than the ones signed breaks those signatures, and that is a CRITICAL alert.

Quiet by default. The official Safe MultiSend libraries are allowlisted, and each team can allowlist its own contracts and known spenders (/allow in the bot), so routine batches do not shout. A delegatecall into anything else, or an owner change, always does.

Timing, honestly. The Safe queue is read from the Safe Transaction Service every minute; contract state is re-checked every 5 minutes. A new transaction is flagged when it is proposed — with a 2-of-3 or 3-of-5 threshold that is normally while only the proposer has signed, so the other signers compare the hashes before adding theirs.

Hashvard alerts; it does not block. It does not replace your hardware wallet or a careful signing process — it gives every signer an independent second view.

EthereumArbitrumBaseOptimismPolygonBNB ChainGnosisAvalancheLinea

When a CRITICAL arrives

Every critical and high alert ends with this checklist, filled in for that transaction.

Don't sign

If you already signed, tell the other signers now.

Compare the hash

safeTxHash on your device vs. the alert. Different hash = stop.

Message who's left

The alert lists owners who have not signed yet. Reach them directly.

Cancel the nonce

Sign and execute a rejection (0 value to the Safe itself) with the same nonce.

Then investigate

Decode the calldata calmly. Need help fast: SEAL 911.

Tested on real transactions

Our hash recomputation is regression-tested against live Safes before every release.

86
real Safe transactions re-hashed, 0 mismatches
7
chains in the regression set
3
Safe versions: 1.1.1, 1.3.0, 1.4.1
✓
Bybit exploit replay: CRITICAL, hash equals on-chain

Check one case yourself. Safe 0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4 · Ethereum · Safe v1.1.1 · nonce 71 · transaction 0x46de…7882.

Expected flag: CRITICAL · DELEGATECALL to non-standard contract. safeTxHash 0xb3476d061aeb8fc1d605a873c483a2402d88a68a9cdd1a8b47655dd55ba004f8 equals the hash in the Safe's ExecutionSuccess event. All 3 signatures were blind eth_sign — the signers' devices showed only a hash. Raw replay: bybit-replay.json.

Data & trust

What you need to know before giving us a treasury address.

What it does not catch

  • Signatures collected outside the Safe service. They never appear in the queue; we only report what such a transaction changes in the Safe's setup or your contracts after it executes.
  • A quorum that is already stolen. If enough keys are compromised, we report the execution — we cannot stop it.
  • Signatures outside the Safe — Permit, orders or messages signed by a single owner key.
  • The poll gap. Up to 1 minute for the queue and 5 minutes for contract state in the beta.
  • It is not custody, not a Safe UI and not a blocker: it never holds keys, never signs, only alerts.

What we store

  • The public addresses and labels you add, and the Telegram chat that receives alerts.
  • Snapshots of public on-chain state and a log of the alerts we sent.
  • Stop any time: /remove <id> in the bot. Ask in the bot to delete everything for your chat.
  • Hashvard is an independent project in public beta. Security contact: security.txt.

Free beta for 10 teams

Small protocols, DAOs and treasuries. Alerts start the same day.

  • During the beta: free, up to 5 Safes or contracts per team.
  • After the beta: a free tier stays (1 Safe + 3 contracts). Paid plans add more objects, several alert chats and the contract-admin console.
  • Fastest: message @Hashvard_bot with ethereum 0x….