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

Package ref
uniswap-database-changes-tx-digest-mainnet@v0.0.1Run package
CLI
Run db_out from the command line.
substreams run uniswap-database-changes-tx-digest-mainnet@v0.0.1 db_out -e mainnet --start-block -1substreams auth or directly on thegraph.market (see docs).README
One tx_digest_block row per block with every
transaction and what wallet balances and transaction labeling need: ERC-20
transfers, wrapped-native deposits and withdrawals, native balance changes,
calls made by wallets, NFT transfers, approvals, every log's emitter and
topic0, 4337 user operations and 7702 delegations. It computes no balances and
no labels; consumers do. Schema: ../proto/evm/uniswap/tx_digest/tx-digest.proto.
map_tx_digest(params, block): the typed Block, whole.
wrapped=<addr>: the chain's wrapped-native contract (Deposit / Withdrawal)skip=<addr,...>: addresses left out of native changes (OP-stack fee vaults); the coinbase is always skippedlogs=all|untyped|none: every log signature (default), only logs not decoded into another array, or nonedb_out(params, clock, map_tx_digest): one DatabaseChanges row per block for the sink.
ordering_key=<str>: the Pub/Sub ordering key. Generated manifests use tx_digest_block:<network>.A call is recorded when its caller is acting as a user wallet in that
transaction: tx_from, an EOA running EIP-7702 code (some call entered it
with Firehose address_delegates_to set), or the sender of a
UserOperationEvent from a known EntryPoint (v0.6, v0.7, v0.8). Decided from
the block alone; no delegation state is kept. Base-detail blocks have no call
traces, so only the transaction's own top-level call is recorded there.
Extended blocks only. One entry per address per transaction, first old value
and last new value. Only committed changes count: a successful transaction
skips calls with state_reverted, a failed one keeps only the root call's gas
buy, gas refund and fee reward.
The sink writes each tx_digest_block row to GCS and publishes only its URI,
so rows are never split for Pub/Sub's 10 MB message or ~1 MB/s per-key limits.
Measured 2026-10-21 on 10 minutes of
recent blocks per chain (22 chains), as Pub/Sub-encoded bytes: the largest row
was 2.3 MB (Polygon), and all chains together averaged about 1.5 MB/s, BSC the
most at 0.48 MB/s.
./scripts/build.sh <network> <version> # ../local/uniswap-labs-database-changes-tx-digest-<network>.spkg
make run NETWORK=bsc START_BLOCK=64000000
make test
Chains, endpoints and per-chain params live in chains.json.
Modules
Output
sf.substreams.sink.database.v1.DatabaseChanges
Inputs
Every transaction in the block with its transfers, wraps, native changes, wallet calls, NFT transfers, approvals, logs, 4337 user operations and 7702 delegations.
Output
evm.uniswap.tx_digest.Block
Inputs