Skip to content

fix(solana): support Transaction v1 when fetching transactions and blocks - #1040

Merged
rickyrombo merged 1 commit into
mainfrom
audit/solana-tx-v1
Sep 15, 2026
Merged

rickyrombo merged 1 commit into
mainfrom
audit/solana-tx-v1

Conversation

@rickyrombo

Copy link
Copy Markdown
Contributor

Why

Helius flagged that our getTransaction calls do not set maxSupportedTransactionVersion: 1. Transaction v1 activates on mainnet 2026-09-15 ~01:20 UTC (epoch 1035). After that, fetching a v1 transaction without the flag returns error -32015 and the indexer would stall retrying.

Every indexed transaction (including Geyser-subscribed ones) is re-fetched through FetchTransactionWithCache, which pinned the version to 0. Two backfiller getBlock calls and two CLI tools had the same pin.

There was also a hidden blocker: we pinned a personal fork of solana-go (based on v1.13.0) via replace. Its decoder treats every versioned prefix as v0, so setting the flag alone would have mis-parsed v1 bytes.

What

  • Request maxSupportedTransactionVersion=1 in FetchTransactionWithCache, the backfiller's getBlock calls, geyser_transform and sol_refresher.
  • Upgrade github.com/gagliardetto/solana-go to upstream v1.23.0, which decodes v1 messages (SIMD-0385), and drop the fork replace. All fork-only changes (ATL length encoding, ATA SysVarRent removal, signature padding, SetAccounts) are already upstream, except getProgramAccountsV2.
  • Port the paginated getProgramAccountsV2 wrapper into cmd/reclaim_rent/gpa_v2.go, its only caller.
  • Add transaction_version_test.go asserting the indexer requests version 1.

go mod tidy also bumps grpc v1.71.1 → v1.80.0 and several indirect deps.

Notes

  • geyser_transform maps reward types with a fallthrough to Unspecified, so the new v1 reward type is safe. Nothing parses ComputeBudget priority fees, so the fee relocation does not affect indexing.
  • This should deploy before Monday's activation.

Verification

  • go build ./..., go vet, gofmt clean.
  • New test plus existing TestFetchTransactionWithCache_* and TestResolveLookupTables pass.
  • Upstream solana-go v1 decode tests pass against the pinned version.
  • Remaining tests in the package need a live test database and were not run locally.

🤖 Generated with Claude Code

…ocks

Transaction v1 activates on Solana mainnet on 2026-09-15 (epoch 1035). RPC
providers reject getTransaction/getBlock for v1 transactions unless the client
sets maxSupportedTransactionVersion to 1, which would stall the indexer once
third-party token, DBC or DAMM transactions start landing as v1.

- Request maxSupportedTransactionVersion=1 in FetchTransactionWithCache, the
  backfiller's getBlock calls, geyser_transform and sol_refresher.
- Upgrade solana-go to upstream v1.23.0, which decodes v1 messages
  (SIMD-0385), and drop the rickyrombo/solana-go fork replace. The fork's
  decoder treated every versioned prefix as v0. All fork changes except
  getProgramAccountsV2 are already upstream.
- Port the paginated getProgramAccountsV2 wrapper into cmd/reclaim_rent,
  its only caller.
- Add a regression test asserting the indexer requests version 1.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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