
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.
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.

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 samecheck 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.
