Outputs database changes for PostgreSQL sink. Tables: settlements, payers, recipients, facilitators
Output
sf.substreams.sink.database.v1.DatabaseChanges
Package ref
x402-base-pulse@v3.0.0Run package
CLI
Run db_out from the command line.
substreams run x402-base-pulse@v3.0.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.0.0 — Now gates EIP-3009 settlements through the on-chain FacilitatorRegistry, matching the x402-subgraph. Facilitator names, URLs, and active status are resolved from registry events.
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 events| 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 | Pairs AuthorizationUsed + Transfer events, gated by facilitator registry |
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 |
| FacilitatorRegistry | 0x67C75c4FD5BbbF5f6286A1874fe2d7dF0024Ebe8 | FacilitatorAdded, FacilitatorRemoved |
| x402ExactPermit2Proxy | 0x4020615294c913F045dc10f0a5cdEbd86c280001 | Settled, SettledWithPermit |
| x402UptoPermit2Proxy | 0x4020633461b2895a48930Ff97eE8fCdE8E520002 | Settled, SettledWithPermit |
# 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.0.0.spkg \
-e base-mainnet.streamingfast.io:443
| Table | Key | Description |
|---|---|---|
settlements | tx_hash-log_index | Every settlement with payer, recipient, amount, facilitator, gas |
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