Skip to main content
The firewall is the real anti-poisoning defense: a victim sends to a lookalike on purpose, so locking funds afterwards does not help. Only refusing does. It runs before anything is signed. A blocked recipient

Check a recipient

'safe' | 'warning' | 'block'
The worst severity found. block must stop the send.
RiskReason[]
Each with a code, severity and human message.
boolean
True only when every data source answered. An incomplete check never reports safe.

What it catches

Fail-closed. When the sender’s payment history is unavailable, the lookalike rule cannot run, so an unverified target is blocked, not waved through. A firewall that degrades to “looks fine” when its data source is down is worse than none.
A warning looks different from a block on purpose: it explains and lets the user decide, because a brand-new recipient is the most common legitimate payment there is. A caution verdict

Gate a send on it

It is already on inside sendProtected

You do not have to remember to call it. sendProtected runs the check itself and throws RiskBlockedError on a block. Opt out per call only if you already gated:

It runs everywhere money leaves

The same check gates every outbound path, not just the send form: a protected send, a private payment’s target, each subscription pull the co-signer authorizes, and the bridge’s destination. One rule engine, one verdict, one explanation. The firewall across every screen