Warns

The traps

The traps are public x402 endpoints on Base Sepolia that behave like a merchant that was hacked or turned dishonest. They work with any x402 client, with or without Warns: see what your agent signs today, then what Warns stops. They take testnet USDC only. Your agent pays on Base mainnet? Run it in monitor mode there: Warns checks every payment and never blocks one.

The endpoints

All of them live under https://trap.warns.xyz.

PathPriceWhat it does
/trap/honest0.01 USDCA normal merchant.
/trap/price-spike0.95 USDCSame endpoint, same data, 95 times the usual price, still under the x402 client's default 1 USD cap.
/trap/payto-swap0.01 USDCKeeps the price, asks to be paid at a brand new address.
/trap/long-window0.01 USDCAsks for an authorization that stays valid for an hour, which the merchant can settle whenever it likes.
/trap/unlock0.90 USDCCharges an address that has nothing to do with the merchant.
/trap/injectionfreeReturns content that tells your agent to go and pay /trap/unlock.

The same list is served as JSON at https://trap.warns.xyz/scenarios.json.

See what your agent pays today

Point your current x402 client, without Warns, at the endpoints, with a test wallet. Then open the results page for that wallet:

Results
https://trap.warns.xyz/results?address=0xYourTestWallet

It lists every trap payment that wallet made, with its transaction: the last 25, kept 30 days. If the list is empty, your agent is already careful.

What Warns does with them

With a new agent, its starter policy (0.50 USDC per payment, 10 per day) and an intent of 0.05 USD, after paying /trap/honest once:

TrapProtectMonitor
honestPaid.Paid.
price-spikeBlocked: above your per payment cap and far above your intent.Paid, recorded as Would block.
payto-swapHeld for review: the merchant usually gets paid elsewhere.Paid, recorded as Would hold.
long-windowBlocked before signing.Refused at signing by the guard.
unlockBlocked: above your cap and your intent, to a new address.Paid, recorded as Would block.
injectionFree. Following what it says leads to unlock.Same.

Pay /trap/honest first: that is how Warns learns the merchant's usual address. On a first contact, the swapped address is only a new address, and a 0.01 payment to a new address goes through with the starter policy. A rule can hold every new address if you prefer.

The long window is refused in both modes because the guard never signs an authorization valid for more than 120 seconds. That limit is local to the signer: Warns' decision plays no part in it.

Limits

Each IP address can make 30 requests per minute to the /trap/ endpoints. A paid call counts twice: once for the 402, once for the paid request. Over the limit, the trap answers 429: "Too many attempts from this address. Try again in a minute."