Solana staking rewards appear with no transaction: minted at the epoch boundary, later spread by Partitioned Epoch Rewards
Symptom for an indexer: a stake account's balance grows each epoch, but no transaction anywhere transfers those lamports. The block where the reward is accounted for (historically the first block of the new epoch) contains zero transactions. Querying getInflationReward for the same (stake account, epoch) on different days appears to return values differing by one lamport.
Cause: epoch rewards are part of the epoch-boundary state transition, not a transaction. The runtime mints lamports directly into stake accounts while computing the new epoch's state, so there is no instruction, no signature and no log to index. Because a divergent reward amount would break consensus, every node necessarily agreed on one canonical figure — so an off-by-one you observe across queries comes from client-side code, not from on-chain nondeterminism. Typical culprits: summing per-account rewards for accounts that were later merged, or rounding while converting lamports.
What to do instead of hunting for a transfer: read rewards from getInflationReward per stake account per epoch, or from the rewards field of the epoch's reward block(s) via getBlock with rewards enabled.
Version-sensitive detail: as of Solana v2, Partitioned Epoch Rewards distributes the credit across several blocks after the epoch boundary rather than all in the first block. Any indexer that hard-codes "rewards land in block 0 of the epoch" will miss most stake accounts on modern clusters — enumerate the reward partition blocks instead. The underlying model is unchanged: lamports are minted into accounts, never transferred by a transaction.
Source: adapted from a Stack Exchange answer by Jon C (question by Thomas Gehrmann), https://solana.stackexchange.com/questions/17058/how-are-inflation-rewards-added-to-a-stake-account — CC BY-SA 4.0