Output
sf.substreams.sink.database.v1.DatabaseChanges
Inputs

Package ref
uniswap-database-changes-uniswap-x-digest-arbitrum-one@v0.0.1Run package
CLI
Run db_out from the command line.
substreams run uniswap-database-changes-uniswap-x-digest-arbitrum-one@v0.0.1 db_out -e arbitrum-one --start-block -1substreams auth or directly on thegraph.market (see docs).README
One uniswap_x_digest_block row per block, empty blocks included, holding
every UniswapX event in the block grouped by transaction: reactor Fill,
OwnershipTransferred and ProtocolFeeControllerSet; Permit2 Approval,
Lockdown, NonceInvalidation, Permit and UnorderedNonceInvalidation;
and the ERC-20 and native transfers inside reactor call trees. Schema:
../proto/evm/uniswap/x_digest/uniswap-x-digest.proto.
The events come from the uniswap-x package's map_events, so the digest
matches the same reactors and Permit2 address per chain. It does not start where
uniswap-x does: chains.json here carries its own start_block per chain, a
block mined on 2026-10-27, because the digest writes one GCS object per block,
empty blocks included, and nothing needs the historical rows. A module may start
later than its inputs, and map_events is a stateless map, so the earlier
uniswap-x start block costs nothing.
Block is annotated payload_delivery = PAYLOAD_DELIVERY_GCS: the sink uploads
each row to uniswap-substreams-payloads-{env} and publishes a GcsPayloadRef
pointer (Pub/Sub attribute payloadEventType = "UniswapXDigestBlock") in its
place, like tx_digest.
map_x_digest(uniswap_x:map_events): the typed Block. Transactions in block
order, each event array in ordinal order. A transaction carries the fields of
its AssociatedEvmTransaction (from, to, value, gas, type, status, calldata).db_out(params, clock, block, map_x_digest): one DatabaseChanges row per
block for the sink. A block without UniswapX events still gets a row, with no
transactions and event_count 0, so consumers see every block. The block input
is unused; it keeps db_out running on those blocks, since Substreams skips a
module whose map inputs are all empty (Clock does not count).
ordering_key=<str>: the Pub/Sub ordering key. Generated manifests use
uniswap_x_digest:<chain_id>, one key per chain, with the chain id from
this package's chains.json.make test
make pack NETWORK=mainnet VERSION=v0.0.1 # or ../build-database-changes-spkg.sh mainnet v0.0.1 uniswap-x-digest
make run NETWORK=mainnet START_BLOCK=23600000
scripts/build.sh packs the uniswap-x parent into
../local/uniswap-labs-x-<chain>.spkg first. map_events is a stateless map,
so the provider has no stores to rebuild for it.
Modules
Output
sf.substreams.sink.database.v1.DatabaseChanges
Inputs
The block's UniswapX events (reactor, Permit2, reactor-call-tree transfers) grouped by transaction.
Inputs
Output
evm.uniswap.x.EventsInputs