ToolAssay

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

CategoryMarket data
Provider hostlabs.theatlasproject.dev
Networkseip155:8453
Payment schemesexact
Self-reported calls, 30 days0 from 0 payers (the provider's figure, not ours)

Our checks, last 30 days

DayResultHTTPAskedTime
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

This page as JSON