Decode parsed_events for one page of already-stored transactions.
Reads data in place — the blob already holds the inner instructions,
account keys and ALT-loaded addresses the decode needs — so a page costs no
Helius call and can run over the whole history offline.
afterId advances past every row examined, not every row written, so
the IS NULL filter alone cannot make the walk quadratic: with no cursor
every page would re-scan the rows earlier pages already filled in. Losing
the cursor costs nothing but time.
A payload this client cannot read no longer raises or vanishes. The
decoder writes an UndecodableEvent carrying the discriminator and the
raw bytes, which is reported here by signature and, being written, is not
picked up again by IS NULL. refresh is how those rows are revisited
after a client bump: it drops the IS NULL filter and re-decodes rows
that already carry events. Recording the bytes is worth that trade —
leaving the row NULL would keep it queued but discard the only evidence of
what was missed.
The catch remains for a genuine throw, which the decoder no longer
produces for an unreadable payload; if one appears it is a bug rather than
a version gap, and the page still advances past it.
Optionaladdress?: AddressOptionaladdresses?: Address[]OptionalblockTime?: DbTimestampCriteriaOptionalcreatedAt?: DbTimestampCriteriaOptionalorderBy?: DbOrderByCriterion<Optionalpage?: numberOptionalpageSize?: numberDefaults to 10
Optionalsignature?: stringOptionalsignatures?: string[]Optionaltoken?: TokenToken name to resolve to a mint address
mintfxEnvlives on the writable service rather than the query service so the ~18 read-only construction sites stay untouched — only the three that actually write transactions need to know which program to decode.