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.
The process default:
MINTFX_ENVread at each call.