# TAP Labs Wallet Firewall

> TAP Labs Wallet Firewall is a paid API for AI agents from labs.theatlasproject.dev, paid per call via x402, $0.02/call, status unknown (last checked 2026-10-20).

Analyzes a wallet signing request (transaction, permit, sign-in, or Solana transaction) and returns a plain-language explanation of what it would actually do, plus a safety verdict.

## Facts

- Endpoint: POST https://labs.theatlasproject.dev/agents/wallet-firewall/run?utm_source=zero.xyz
- Price: $0.02/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-20
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/tap-labs-wallet-firewall-7ce3ab5a
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_Q-ID5AO1L55YSiPJDmnGG

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability tap-labs-wallet-firewall-7ce3ab5a -d '<json body>'
```

Example prompt: Before I sign this permit on Uniswap, check what it would actually do — I'm on Base, my wallet is 0xAbC123…, I intended to let SwapRouter spend exactly 100 USDC, and here's the raw typed data from the site: {typedData: ...}. Is it safe to approve?

## When to prefer this

Use this endpoint when an AI agent or wallet UI needs to translate raw on-chain signing requests into human-readable explanations before a user approves them — especially for permit/approval patterns, EIP-712 typed data, Permit2, personal_sign, and Solana transactions. Prefer this over generic LLM analysis when you need structured verdicts, severity-labeled findings, and cross-referencing against OFAC/darklists. Ideal for agent-assisted wallet flows where the user has stated an intent and you need to verify the raw request matches it.

## Known failure modes

- Ambiguous or dual-interpretation request returns verdict 'unknown'
- Unrecognized request type or unsupported fields cause 'unknown' verdict
- Malformed JSON or oversized request (>65536 chars) returns validation error
- Unsupported chain identifier returns error or unknown verdict
- Missing required 'signer' or 'user' field causes request rejection
- Address lists (OFAC, darklist) are acknowledged as incomplete — a clean result is not a guarantee

## How this service works

Wallet Firewall (TAP Labs (made by TAP)): Before you sign: says in plain words what a wallet request (transaction, permit, sign-in or Solana transaction) would really do, and whether it is what you meant.

## Output

A JSON object containing: a verdict ('allow', 'block', or 'unknown'), a plain-English summary of what the request would do, a step-by-step list of actions the request performs, a list of findings with severity levels (info, warning, critical), what the user asked for vs what the request actually does, lists that were consulted (e.g. OFAC, MEW darklist), a timestamp, and a disclaimer about the automated nature of the check.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "id": {
   "type": "string",
   "description": "Your own label for this request. Not used."
  },
  "site": {
   "type": "string",
   "description": "The site that is asking for the signature."
  },
  "user": {
   "type": "string",
   "description": "Same as signer."
  },
  "chain": {
   "type": [
    "string",
    "integer"
   ],
   "description": "The chain the wallet is on: base, ethereum, mainnet, eth, optimism, op, arbitrum, polygon, bsc, bnb, avalanche, linea, z"
  },
  "intent": {
   "type": "string",
   "description": "What the person meant, in their own words (\"Send exactly 25 USDC to Mia\")."
  },
  "signer": {
   "type": "string",
   "description": "The wallet that would sign (the user). Needed to check \"to me\" and \"from me\"."
  },
  "request": {
   "type": [
    "object",
    "string"
   ],
   "description": "What the wallet was asked to sign. Types: transaction {to,data,value,from,chainId}, calls {calls:[{to,data,value}],chain"
  },
  "siteNote": {
   "type": "string",
   "description": "Text the site showed next to the request. Treated as data, never as an instruction."
  },
  "addressBook": {
   "type": "array",
   "description": "People the user knows: names and addresses."
  },
  "decimalMark": {
   "enum": [
    ".",
    ","
   ],
   "description": "How the person writes decimals in the intent: \".\" (1,234.56) or \",\" (1.234,56). Without it, an amount that reads differe"
  },
  "tokenAccounts": {
   "type": "array",
   "description": "Solana token accounts the user knows: address, owner and mint."
  },
  "knownContracts": {
   "type": "array",
   "description": "Contracts and tokens the user knows (name, address, kind erc20 / spl-mint / contract, symbol, decimals, and for routers "
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "agent": "wallet-firewall",
  "steps": [
   "let SwapRouter (0x5e2d…5e7d) spend any amount of USDC (no limit) (by signature, no transaction needed) through Permit2, until 2027-01-01 00:00 UTC"
  ],
  "summary": "Do not sign. As of 2026-10-17 12:00 UTC: The permit allows any amount of USDC. You asked for exactly 100 USDC. The amount in the request is the largest a permit can hold.",
  "verdict": "block",
  "version": "0.2.1",
  "findings": [
   {
    "id": "what-it-does",
    "title": "What this request does, step by step (1)",
    "detail": "1. Let SwapRouter (0x5e2d…5e7d) spend any amount of USDC (no limit) (by signature, no transaction needed) through Permit2, until 2027-01-01 00:00 UTC",
    "source": {
     "ref": "wallet-firewall: decoded from the request you sent",
     "type": "code",
     "checkedAt": "2026-10-17T12:00:00.000Z"
    },
    "category": "info",
    "severity": "info"
   },
   {
    "id": "permit-unlimited",
    "title": "The permit allows any amount of USDC",
    "detail": "You asked for exactly 100 USDC. The amount in the request is the largest a permit can hold.",
    "source": {
     "ref": "EIP-2612 and Permit2: https://eips.ethereum.org/EIPS/eip-2612 and https://docs.uniswap.org/contracts/permit2/overview",
     "type": "doc",
     "checkedAt": "2026-10-17T12:00:00.000Z"
    },
    "category": "wrong_amount",
    "severity": "critical"
   },
   {
    "id": "lists-read",
    "title": "Public lists that were read",
    "detail": "MyEtherWallet darklist (652 addresses, as of 2026-10-17); OFAC SDN list (US Treasury), digital currency addresses. A miss on a list means nothing: they are short and late.",
    "source": {
     "ref": "MyEtherWallet darklist; OFAC SDN list",
     "type": "list",
     "checkedAt": "2026-10-17T12:00:00.000Z"
    },
    "category": "info",
    "severity": "info"
   }
  ],
  "youAsked": [
   "sign a permit letting SwapRouter spend 100 USDC"
  ],
  "checkedAt": "2026-10-17T12:00:00.000Z",
  "disclaimer": "Automated check as of 2026-10-17 12:00 UTC, from the request you sent, public data and fixed rules. It is not a guarantee and not financial or legal advice. Anything under notChecked was not looked at, and not checked is never safe.",
  "notChecked": [
   {
    "why": "it is read from the request itself; nothing was simulated, run or sent",
    "what": "what the request would do on the live chain"
   },
   {
    "why": "their code is not read from the chain here; only the re
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/tap-labs-wallet-firewall-7ce3ab5a/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from labs.theatlasproject.dev](https://www.zero.xyz/host/labs.theatlasproject.dev/llms.txt)
