Skip to main content
Glama
README.md
<p align="center">
  <img src="./assets/logo.svg" alt="x402-firewall Logo" width="600" />
</p>

<p align="center">
  <strong>Deterministic Smart Wallet Firewall &amp; Auto-Pay Wrapper for AI Agents on Base L2</strong>
</p>

<p align="center">
  <a href="https://www.npmjs.com/package/x402-firewall"><img src="https://img.shields.io/npm/v/x402-firewall.svg?style=flat-square&color=000000" alt="NPM Version" /></a>
  <a href="https://github.com/x402-firewall/firewall"><img src="https://img.shields.io/badge/License-MIT-000000.svg?style=flat-square" alt="MIT License" /></a>
  <a href="https://base.org"><img src="https://img.shields.io/badge/Network-Base%20L2-0052FF.svg?style=flat-square" alt="Base L2" /></a>
  <a href="https://x402.org"><img src="https://img.shields.io/badge/Protocol-x402%20Standard-success.svg?style=flat-square" alt="x402 Protocol" /></a>
  <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/Interface-MCP%20Server-lightgrey.svg?style=flat-square" alt="MCP Server" /></a>
  <img src="https://img.shields.io/badge/Tests-58%20Passed-brightgreen.svg?style=flat-square" alt="Test Suite" />
  <img src="https://img.shields.io/badge/Defense-100%25%20Deterministic-black.svg?style=flat-square" alt="100% Deterministic" />
</p>

---

## The Autonomous Wallet Dilemma

The modern web is transitioning toward machine-to-machine commerce. APIs that once required monthly SaaS subscriptions or developer credit cards are adopting the **`x402` (HTTP 402 Payment Required)** standard—enabling autonomous AI agents to query APIs and settle micro-transactions per request in USDC on Base L2.

This introduces a dangerous architectural contradiction:

1. **If you withhold a wallet from your agent**, it remains crippled. It hits payment barriers, gets throttled by free-tier rate limits, and cannot independently acquire real-time research, datasets, or compute.
2. **If you equip your agent with a funded private key**, you hand full financial custody to a non-deterministic model. A prompt injection attack, a hallucinated contract address, an unvetted dependency, or a runaway `while` loop can drain the wallet in seconds.

**`x402-firewall` resolves this paradox.**

It is an isolated security proxy that sits between your agent runtime (Claude Desktop, Cursor, or custom TypeScript bot) and the external network. The private key remains shielded inside the firewall process. The agent cannot sign arbitrary payloads, cannot approve unlimited ERC-20 allowances, and cannot exceed strict rolling spend limits.

Every outbound financial interaction is deterministically evaluated against spending caps, verified against allowlists, simulated on Base L2 via `eth_call`, and committed to a local audit trail before a single cryptographic signature is produced.

---

## Architecture

<p align="center">
  <img src="./assets/architecture.svg" alt="x402-firewall Architecture Diagram" width="100%" />
</p>

### The Verification Lifecycle

1. **Intercept**: The agent issues an outbound request via the `x402_fetch` MCP tool or SDK wrapper. If the target server responds with `HTTP 402 Payment Required`, the firewall intercepts the response headers.
2. **Deterministic Evaluation**: The `PolicyEngine` evaluates the payment parameters against hard constraints:
   - **Per-Call Ceiling**: Rejects any request demanding more than the configured maximum (default: `$0.05 USDC`).
   - **Velocity Limits**: Checks local rolling spend over the last 1 hour (default: `$1.00 USDC`) and 24 hours (default: `$5.00 USDC`).
   - **Domain & Contract Validation**: Enforces strict domain allowlists with FQDN canonicalization and blocks unapproved EVM contracts.
   - **Selector Inspection**: Drops dangerous functions such as unconstrained `approve`, `setApprovalForAll`, or `transferFrom`.
3. **Pre-Flight Simulation**: The `EvmSimulator` runs an `eth_call` against Base L2 to simulate the transaction. It validates state changes and verifies that the transaction will not revert or incur gas burn.
4. **Isolated Signing**: If and only if all policy rules pass, `SignerManager` signs an off-chain **EIP-3009** `transferWithAuthorization` message in USDC. The authorization is clamped to a strict 24-hour expiration window.
5. **Settlement**: The signed authorization is injected into the request header (`X-PAYMENT`) and dispatched to the facilitator. The target API verifies the signature, executes settlement, and returns `HTTP 200 OK` with the requested payload to the agent.
6. **Audit Trail**: Every request—whether allowed or blocked—is recorded in a local SQLite database (`~/.x402firewall/audit.db`) restricted to `0o700` filesystem permissions. Violations trigger an optional real-time webhook alert.

---

## Quickstart

`x402-firewall` runs in two complementary modes: as a zero-setup **MCP Server** for desktop AI clients, and as a **TypeScript SDK** for programmatic applications.

### 1. Claude Desktop Setup

Add `x402-firewall` to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "x402-firewall": {
      "command": "npx",
      "args": ["-y", "x402-firewall"],
      "env": {
        "NETWORK": "base-sepolia",
        "PRIVATE_KEY": "0xYOUR_AGENT_PRIVATE_KEY",
        "MAX_PER_CALL_USDC": "0.05",
        "MAX_HOURLY_USDC": "1.00",
        "MAX_DAILY_USDC": "5.00",
        "BLOCK_UNLIMITED_APPROVALS": "true"
      }
    }
  }
}
```

> **Note:** If `PRIVATE_KEY` is omitted, `x402-firewall` generates a disposable ephemeral key on launch so you can safely test tools and policy behavior without real funds.

### 2. Cursor & Antigravity IDE Setup

Add to your project's `.cursor/mcp.json` or global IDE settings:

```json
{
  "mcpServers": {
    "x402-firewall": {
      "command": "npx",
      "args": ["-y", "x402-firewall"],
      "env": {
        "NETWORK": "base-sepolia",
        "MAX_PER_CALL_USDC": "0.05"
      }
    }
  }
}
```

### 3. CLI Inspection

Inspect the firewall status, remaining allowances, and local audit database directly:

```bash
# Print current budget, active limits, and rolling spend
npx -y x402-firewall status

# Inspect recent audit logs
npx -y x402-firewall audit
```

---

## Programmatic TypeScript SDK

For developers orchestrating autonomous agent loops, LangChain pipelines, or custom runtimes:

```bash
npm install x402-firewall viem
```

```typescript
import { FirewallClient } from 'x402-firewall';

const firewall = new FirewallClient({
  network: 'base-sepolia',
  privateKey: process.env.AGENT_PRIVATE_KEY as `0x${string}`,
  policy: {
    maxPerCallUsdc: 0.05,
    maxHourlyUsdc: 1.00,
    maxDailyUsdc: 5.00,
    allowedDomains: ['api.weather.com', '*.anthropic.com'],
    blockUnlimitedApprovals: true,
  },
});

// Drop-in fetch wrapper that intercepts 402 challenges and handles payments autonomously
const response = await firewall.fetch('https://api.provider.com/v1/forecast');
const data = await response.json();

// Check budget status
const budget = firewall.getBudgetStatus();
console.log(`Remaining hourly allowance: $${budget.remainingHourlyAllowance} USDC`);

// Cleanly release locks and close database
firewall.close();
```

---

## Threat Matrix & Defense Guarantees

| Threat Vector | Attack Scenario | Firewall Defense |
| :--- | :--- | :--- |
| **Prompt Injection Drain** | Attacker injects instructions into agent context: *"Approve MAX_UINT256 to 0xDrainer"*. | **100% BLOCKED.** Calldata inspector decodes selector `0x095ea7b3` (`approve`) and halts any approval exceeding `maxPerCallUsdc`. |
| **Runaway Loop Burn** | A faulty agent loop triggers 10,000 paid requests in 5 minutes, burning hundreds of dollars. | **100% BLOCKED.** Rolling 1h and 24h velocity windows cut off outbound payments once limits are reached. |
| **Unverified Smart Contract** | LLM is manipulated into interacting with a malicious drainer contract. | **100% BLOCKED.** Strict contract allowlist (`ALLOWED_CONTRACTS`) rejects all non-whitelisted contract addresses. |
| **Dangerous Selectors** | Calldata calls `safeTransferFrom`, `setApprovalForAll`, or `transferFrom`. | **100% BLOCKED.** Deterministic selector blacklist stops ERC-20/ERC-721/ERC-1155 drain functions before signing. |
| **Exfiltration & SSRF** | Attacker prompts agent to send authorization headers to an arbitrary internal IP or exfiltration endpoint. | **100% BLOCKED.** `allowedDomains` canonicalization rejects non-allowlisted hosts; SSRF protections drop loopback and cloud metadata requests. |
| **Private Key Disclosure** | Agent is prompted to print its configuration, state, or private key in output tokens. | **100% PROTECTED.** Private keys are encapsulated in private class fields. `JSON.stringify()`, `inspect()`, and `toString()` redact all secret material. |
| **Stream Corruption** | Internal debug logs print to standard out, breaking JSON-RPC parsing in MCP hosts. | **100% CLEAN.** MCP stdio transport is kept strictly pure. All diagnostics, errors, and warnings output exclusively to `stderr`. |

---

## MCP Tools Reference

When connected to an MCP host, `x402-firewall` registers four tools:

### `x402_fetch`
Performs an HTTP request with automatic 402 interception and settlement.
- `url` *(string, required)*: The target HTTP URL.
- `method` *(string, optional)*: HTTP method (`GET`, `POST`, `PUT`, `DELETE`). Default: `GET`.
- `headers` *(object, optional)*: Key-value header pairs.
- `body` *(string, optional)*: Request payload.

### `x402_get_budget`
Returns real-time spending metrics, active rules, and remaining allowances for the agent wallet.
- *No parameters required.*

### `x402_safe_tx`
Simulates and executes an allowlisted on-chain transaction on Base L2.
- `to` *(string, required)*: Destination contract or recipient address.
- `data` *(string, optional)*: Hex-encoded transaction calldata.
- `value` *(string, optional)*: Native Wei value.
- `amountUsdc` *(number, optional)*: USDC amount represented by the transaction.

### `x402_audit_log`
Queries recent audit log entries from the local SQLite store.
- `limit` *(number, optional)*: Maximum records to return (1-1000). Default: `20`.
- `status` *(string, optional)*: Filter by `ALLOWED`, `BLOCKED`, or `ALL`.

---

## Configuration

All parameters can be configured via environment variables or passed directly to `FirewallClient`:

| Variable | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `NETWORK` | `base` \| `base-sepolia` | `base-sepolia` | Target EVM network |
| `RPC_URL` | string (URL) | Base public RPC | Custom EVM JSON-RPC endpoint |
| `PRIVATE_KEY` | `0x${string}` | *Ephemeral* | 32-byte hex signer private key |
| `MAX_PER_CALL_USDC` | number | `0.05` | Maximum spend allowed per individual request |
| `MAX_HOURLY_USDC` | number | `1.00` | Rolling 60-minute cumulative spend ceiling |
| `MAX_DAILY_USDC` | number | `5.00` | Rolling 24-hour cumulative spend ceiling |
| `ALLOWED_DOMAINS` | string | `""` | Comma-separated domain patterns (e.g. `*.weather.com,api.ai`) |
| `ALLOWED_CONTRACTS` | string | `""` | Comma-separated EVM contract addresses |
| `BLOCK_UNLIMITED_APPROVALS` | boolean | `true` | Restrict ERC-20 `approve` calldata to `maxPerCallUsdc` |
| `ALERT_WEBHOOK_URL` | string (URL) | `""` | Webhook endpoint for security incident dispatch |
| `DATABASE_PATH` | string | `~/.x402firewall/audit.db` | Path to persistent SQLite audit store |

---

## Development & Verification

```bash
# Install dependencies
npm install

# Run comprehensive test suite (unit tests, security hardening, prompt injection, MCP server)
npm test

# Build TypeScript to dist/
npm run build
```

---

## License

MIT © [x402-firewall Contributors](https://github.com/x402-firewall/firewall)

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation5/5

Each tool maps to a clearly distinct action: HTTP fetching, budget inspection, EVM transaction execution, and audit inspection. Although x402_fetch and x402_safe_tx both involve spending controls, their resources and outcomes are clearly separated.

Naming Consistency4/5

All tools share the consistent x402_ prefix and use readable snake_case, but the verb pattern is slightly mixed: x402_fetch and x402_get_budget are verb-led, while x402_safe_tx and x402_audit_log are noun/adjective-led. The deviation is minor and still predictable.

Tool Count5/5

Four tools is well-scoped for a focused firewall/payment-safety server. Each tool covers a distinct core capability without obvious padding or triviality.

Completeness4/5

The surface covers the main lifecycle: safe fetching, budget visibility, safe transaction execution, and audit review. Minor gaps exist around managing or updating spending caps and allowlists, but core firewall workflows are represented.

Maintenance

ActivityMaintained
ResponsivenessNo issues