Outputs database changes for PostgreSQL sink. Tables: settlements, payers, recipients, facilitators
Output
sf.substreams.sink.database.v1.DatabaseChanges

Package ref
x402-base-pulse@v3.3.0Run package
CLI
Run db_out from the command line.
substreams run x402-base-pulse@v3.3.0 db_out -e basesubstreams auth or directly on thegraph.market (see docs).README
Real-time payment protocol analytics for Coinbase x402 on Base
Track every x402 payment settlement on Base. This Substreams detects when facilitators call transferWithAuthorization on USDC to settle HTTP 402 payments, extracting payer, recipient, amount, and facilitator data from each settlement.
v3.2.0 — Enriches every settlement with the EIP-3009 validity window (valid_after / valid_before, decoded from the transferWithAuthorization call — a real fraud/anomaly signal) and a scheme field (exact / batch). Fixes the Permit2 proxy address: the previous 0x4020615… / 0x4020633… addresses carry no contract code on Base; the live proxy is 0x402085c2…0001. Adds forward-looking batch-settlement capture (x402BatchSettlement Settled sweeps → scheme="batch"; recipient/amount/token exact, payer approximate pending channel-level attribution in v3.3).
v3.1.0 — Adds a static facilitator allowlist (112 addresses across 29 operators) sourced from Merit Systems' x402scan facilitators package. The gate now accepts a settlement if tx.from is either on-chain-registered via FacilitatorRegistry or present in the published allowlist. In practice the on-chain registry is sparsely populated (only Meridian as of 2026-05), so without the allowlist virtually no real x402 activity would be indexed. Matches gating used by x402scan + x402-omnigraph subgraph.
v3.0.0 — Gated EIP-3009 settlements through the on-chain FacilitatorRegistry only. Facilitator names, URLs, and active status resolved from registry events. Deprecated: produces empty output in practice — use v3.1.0.
The x402 protocol enables internet-native payments using the HTTP 402 status code. When a client wants to access a paid resource:
transferWithAuthorization on USDC to settle payment on-chainAuthorizationUsed + Transfer eventstx.from is either on-chain-registered via FacilitatorRegistry or on the published static allowlist (x402scan's facilitators npm package, baked into the WASM at build time)| Module | Kind | Description |
|---|---|---|
map_facilitator_registry_events | Map | Extracts FacilitatorAdded / FacilitatorRemoved events from the on-chain registry |
store_facilitator_registry | Store | Maintains the set of registered facilitators with names and URLs |
map_x402_settlements | Map | EIP-3009 (AuthorizationUsed+Transfer, + validity window from the call), Permit2 proxy (Settled/SettledWithPermit), and batch-settlement sweeps; gates by FacilitatorRegistry OR static allowlist |
store_payer_volume | Store | Accumulates total USDC spent per payer |
store_payer_count | Store | Counts payments per payer |
store_recipient_volume | Store | Accumulates total USDC received per resource server |
store_recipient_count | Store | Counts payments per recipient |
store_facilitator_volume | Store | Accumulates total USDC volume per facilitator |
store_facilitator_count | Store | Counts settlements per facilitator |
store_facilitator_gas | Store | Tracks gas costs per facilitator |
store_first_seen | Store | Records first-seen timestamp per payer, recipient, and facilitator |
map_payer_stats | Map | Computes payer leaderboards and averages |
map_recipient_stats | Map | Computes resource server revenue stats |
map_facilitator_stats | Map | Computes facilitator economics with name, URL, and active status from registry |
db_out | Map | Outputs DatabaseChanges for PostgreSQL sink |
| Contract | Address | Events |
|---|---|---|
| USDC (Base) | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | AuthorizationUsed, Transfer (+ transferWithAuthorization call for validity window) |
| FacilitatorRegistry | 0x67C75c4FD5BbbF5f6286A1874fe2d7dF0024Ebe8 | FacilitatorAdded, FacilitatorRemoved |
| x402 Permit2 Proxy | 0x402085c248eea27d92e8b30b2c58ed07f9e20001 (live; old …615/…633 have no code) | Settled, SettledWithPermit |
| x402BatchSettlement | detected by event signature, gated by token == USDC | Settled(receiver, token, sender, amount) |
# Stream settlements
substreams run x402-base-pulse map_x402_settlements \
-e base-mainnet.streamingfast.io:443 \
-s 29000000 -t +1000
# GUI mode
substreams gui x402-base-pulse map_x402_settlements \
-e base-mainnet.streamingfast.io:443 \
-s 29000000
# Sink to PostgreSQL
substreams-sink-sql run "psql://localhost/x402" \
x402-base-pulse-v3.2.0.spkg \
-e base-mainnet.streamingfast.io:443
| Table | Key | Description |
|---|---|---|
settlements | tx_hash-log_index | Every settlement: payer, recipient, amount, facilitator, gas, scheme, validity window (valid_after/valid_before), nonce |
payers | payer_address | Aggregated spend and payment count per payer |
recipients | recipient_address | Revenue and payment count per resource server |
facilitators | facilitator_address | Name, URL, active status, volume settled, settlement count, total gas spent |
| View | Description |
|---|---|
daily_stats | Daily protocol-wide volume, unique participants, gas |
top_payers | Ranked by total USDC spent |
top_recipients | Ranked by total USDC received |
facilitator_economics | Name, active status, volume settled vs gas cost per facilitator |
whale_payments | Payments > $100 USDC |
recent_settlements | Latest 100 settlements |
cargo build --target wasm32-unknown-unknown --release
substreams pack substreams.yaml
base-mainnet.streamingfast.io:443Modules
Outputs database changes for PostgreSQL sink. Tables: settlements, payers, recipients, facilitators
Output
sf.substreams.sink.database.v1.DatabaseChanges
Extracts FacilitatorAdded and FacilitatorRemoved events from the on-chain FacilitatorRegistry contract. These events define which addresses are authorized x402 facilitators.
Computes facilitator economics: volume processed, gas spent, settlement count. Enriches with name and active status from the FacilitatorRegistry.
Output
x402.v1.FacilitatorStatsComputes real-time payer statistics by combining settlement data with accumulated store values.
Output
x402.v1.PayerStatsOutput
x402.v1.RecipientStatsExtracts x402 payment settlements on Base by detecting EIP-3009 AuthorizationUsed events on the USDC contract. Filters EIP-3009 settlements to only include transactions where tx.from is a registered facilitator in the on-chain FacilitatorRegistry. Permit2 proxy settlements are self-identifying and not gated.
Output
x402.v1.SettlementsStore value
int64
Update policy
add
Inputs
Store value
bigint
Update policy
add
Inputs
Maintains the set of registered facilitators with their names. Key: facilitator address (lowercase). Value: "name|url" or empty if removed. Uses set policy — FacilitatorRemoved overwrites with empty string.
Store value
string
Update policy
set
Accumulates total volume settled per facilitator. Key: {facilitator_address}
Store value
bigint
Update policy
add
Inputs
Records first-seen block timestamp per entity. Key: payer:{addr}, recipient:{addr}, facilitator:{addr}
Store value
int64
Update policy
set_if_not_exists
Inputs
Store value
int64
Update policy
add
Inputs
Store value
bigint
Update policy
add
Inputs
Store value
int64
Update policy
add
Inputs
Accumulates total revenue per recipient (resource server). Key: {recipient_address}
Store value
bigint
Update policy
add
Inputs
Output
sf.substreams.ethereum.v1.Events
`index_events` sets the following keys on the block: * Event signatures evt_sig:0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef (signature in hex, prefixed by 0x) * Event address evt_addr:0x0123456789abcdef0123456789abcdef01234567 (address in hex, prefixed by 0x)
Output
sf.substreams.index.v1.Keys
Inputs