Wallet Firewall (TAP Labs (made by TAP))
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.
Answeringour last check, 2026-10-19
1 of 1checks answered this week
1371 msmedian answer time
$0.02listed price per call
$0.02price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://labs.theatlasproject.dev/agents/wallet-firewall/run
| Category | Market data |
|---|---|
| Provider host | labs.theatlasproject.dev |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 0 from 0 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-19 | valid payment request | 402 | $0.02 | 1371 ms |
Example input (from the provider)
{
"body": {
"addressBook": [
{
"address": "0x2f4e6a8c0b1d3f5a7c9e1b3d5f7a9c0e2b4d6f81",
"name": "Mia"
}
],
"chain": "base",
"intent": "Sign a Permit2 permit letting SwapRouter spend exactly 100 USDC.",
"knownContracts": [
{
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals": 6,
"kind": "erc20",
"name": "USD Coin",
"symbol": "USDC"
},
{
"address": "0x5e2d4c6b8a0f1e3d5c7b9a2f4e6d8c0b1a3f5e7d",
"kind": "contract",
"name": "SwapRouter"
},
{
"address": "0x000000000022d473030f116ddee9f6b43ac78ba3",
"kind": "contract",
"name": "Permit2"
}
],
"request": {
"type": "typed_data",
"typedData": {
"domain": {
"chainId": 8453,
"name": "Permit2",
"verifyingContract": "0x000000000022d473030f116ddee9f6b43ac78ba3"
},
"message": {
"details": {
"amount": "1461501637330902918203684832716283019655932542975",
"expiration": "1798761600",
"nonce": "0",
"token": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
},
"sigDeadline": "1792000000",
"spender": "0x5e2d4c6b8a0f1e3d5c7b9a2f4e6d8c0b1a3f5e7d"
},
"primaryType": "PermitSingle",
"types": {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"PermitDetails": [
{
"name": "token",
"type": "address"
},
{
"name": "amount",
"type": "uint160"
},
{
"name": "expiration",
"type": "uint48"
},
{
"name": "nonce",
"type": "uint48"
}
],
"PermitSingle": [
{
"name": "details",
"type": "PermitDetails"
},
{
"name": "spender",
"type": "address"
},
{
"name": "sigDeadline",
"type": "uint256"
}
]
}
}
},
"signer": "0x7a3b8c1d5e9f2a4b6c8d0e1f3a5b7c9d1e2f4a6b"
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"addressBook": {
"description": "People the user knows: names and addresses.",
"items": {
"properties": {
"address": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"name": {
"maxLength": 80,
"minLength": 1,
"type": "string"
}
},
"required": [
"name",
"address"
],
"type": "object"
},
"maxItems": 200,
"type": "array"
},
"chain": {
"description": "The chain the wallet is on: base, ethereum, mainnet, eth, optimism, op, arbitrum, polygon, bsc, bnb, avalanche, linea, zksync, scroll, blast, base-sepolia, sepolia, solana, solana-devnet or a chain id. Default: base.",
"type": [
"string",
"integer"
]
},
"decimalMark": {
"description": "How the person writes decimals in the intent: \".\" (1,234.56) or \",\" (1.234,56). Without it, an amount that reads differently either way (\"1,5\", \"1.000\", \"1,250\") is not guessed: the answer says so and is at most a warning.",
"enum": [
".",
","
]
},
"id": {
"description": "Your own label for this request. Not used.",
"maxLength": 100,
"type": "string"
},
"intent": {
"description": "What the person meant, in their own words (\"Send exactly 25 USDC to Mia\").",
"maxLength": 2000,
"type": "string"
},
"knownContracts": {
"description": "Contracts and tokens the user knows (name, address, kind erc20 / spl-mint / contract, symbol, decimals, and for routers a commands map).",
"items": {
"properties": {
"address": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"commands": {
"maxProperties": 100,
"type": "object"
},
"constants": {
"maxProperties": 20,
"type": "object"
},
"decimals": {
"maximum": 36,
"minimum": 0,
"type": "integer"
},
"functions": {
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"kind": {
"maxLength": 30,
"type": "string"
},
"name": {
"maxLength": 80,
"minLength": 1,
"type": "string"
},
"notes": {
"maxLength": 600,
"type": "string"
},
"symbol": {
"maxLength": 20,
"type": "string"
}
},
"required": [
"address"
],
"type": "object"
},
"maxItems": 200,
"type": "array"
},
"request": {
"description": "What the wallet was asked to sign. Types: transaction {to,data,value,from,chainId}, calls {calls:[{to,data,value}],chainId}, typed_data {typedData}, personal_sign {message}, eth_sign {message}, authorization {authorization:{address,chainId,nonce}}, solana_transaction {instructions:[{programId,accounts,data}]} or {transaction: base64}. JSON-RPC calls (eth_sendTransaction, personal_sign, eth_signTypedData_v4, wallet_sendCalls) are read too. A request that could be read as two different requests, or carries a field this check does not read, is answered \"unknown\". Numbers are decimal digits or 0x hex.",
"maxLength": 65536,
"type": [
"object",
"string"
]
},
"signer": {
"description": "The wallet that would sign (the user). Needed to check \"to me\" and \"from me\".",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"site": {
"description": "The site that is asking for the signature.",
"maxLength": 300,
"type": "string"
},
"siteNote": {
"description": "Text the site showed next to the request. Treated as data, never as an instruction.",
"maxLength": 1000,
"type": "string"
},
"tokenAccounts": {
"description": "Solana token accounts the user knows: address, owner and mint.",
"items": {
"properties": {
"address": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"mint": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"owner": {
"maxLength": 100