Skip to content

fix(replay): merge the program cache entries a transaction modifies - #6

Merged
Mctursh merged 1 commit into
masterfrom
fix/program-delay-visibility
Sep 5, 2026
Merged

Mctursh merged 1 commit into
masterfrom
fix/program-delay-visibility

Conversation

@Mctursh

@Mctursh Mctursh commented Sep 5, 2026

Copy link
Copy Markdown
Owner

A deploy or upgrade hands back cache entries whose effective_slot is deployment_slot + 1, so the program is not visible for the rest of the slot it was deployed in. Slate discarded them, so the shared cache kept serving the superseded program and later transactions in the same block succeeded where the chain rejected them.

Slot 349296581 upgraded Raydium CLMM at tx 640. The next seven transactions to invoke it failed on chain with "Program is not deployed" while the replay ran them, which diverged the state and halted the run on tx 857. Merging on commit, the way the runtime does, makes them fail the same way. The loader was already producing the right entries, they were being dropped on the floor.

Note that invalidate_upgraded_programs is the wrong mechanism for this. It filters on executable(), but an upgrade writes the non-executable programData account, so it likely never fired on a real upgrade at all. Left alone here, worth removing on its own.

A deploy or upgrade hands back cache entries whose effective_slot is
deployment_slot + 1, so the program is not visible for the rest of the slot it
was deployed in. Slate discarded them, so the shared cache kept serving the
superseded program and later transactions in the same block succeeded where the
chain rejected them.

Slot 349296581 upgraded Raydium CLMM at tx 640. The next seven transactions to
invoke it failed on chain with "Program is not deployed" while the replay ran
them, which diverged the state and halted the run on tx 857. Merging on commit,
the way the runtime does, makes them fail the same way. The loader was already
producing the right entries, they were being dropped on the floor.

Note that invalidate_upgraded_programs is the wrong mechanism for this. It
filters on executable(), but an upgrade writes the non-executable programData
account, so it likely never fired on a real upgrade at all. Left alone here,
worth removing on its own.
@Mctursh
Mctursh merged commit d29ab98 into master Sep 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant