Native enhancements
Native backend capabilities that make Hopper programs inspectable without changing the wire format.
Hopper Native is the sovereign substrate. It already owns loader parsing,
syscalls, eager + lazy entrypoints, duplicate-account resolution, and
AccountView. This document is the source of record for what we absorb
from Pinocchio and Quasar's substrates, what we deliberately do not,
and the priority order.
Pinocchio is the Pareto frontier for raw substrate efficiency. Quasar is the Pareto frontier for substrate-plus-DX integration. Hopper Native should aim to be substrate-competitive with Pinocchio and DX-competitive with Quasar - without becoming a copy of either.
Substrate-boundary commitment (Option A)
Hopper Native is the canonical substrate. legacy-pinocchio-compat and
solana-program-backend are compat shims for users with existing
dep trees, not peer targets. Enhancement effort goes into Hopper Native.
The legacy-pinocchio-compat feature surface is frozen.
Product repositories
Framework-internal crates live in this repo so Hopper's runtime, core, macros, schema, SPL wrappers, and CLI evolve together. The earlier one-repo-per-crate split was folded back with subtree history preserved; those temporary repos are archived/private.
Only coherent standalone products remain public siblings:
| Repo | Purpose |
|---|---|
| Hopper-Solana-Zero-copy-State-Framework | Main framework workspace. |
| hopper-bench | Cross-framework benchmark harness and CU regression lab. |
| hopper-svm | In-process Solana execution harness for tests. |
Status
| # | Item | Status |
|---|---|---|
| 1.1 | Public process_entrypoint |
✅ shipped (hopper_native::entrypoint::process_entrypoint) |
| 1.2 | MAX_TX_ACCOUNTS configurability |
✅ shipped (hopper_program_entrypoint!(fn, max)) |
| 1.3 | no_allocator! macro |
✅ shipped |
| 1.4 | hopper-log crate |
⏳ planned |
| 1.5 | Static syscalls feature | ✅ feature flag added (static-syscalls) |
| 1.6 | Anza modular SDK 2.x audit | ⏳ planned |
| 2.1 | Wire integer arithmetic convenience | ✅ shipped on all Wire* integer types (+, -, *, +=, -=, *=) |
| 2.2 | Wrapping in release / panic in debug | ✅ matches Rust default for direct operators; checked helpers stay explicit |
| 2.3 | Compile-time discriminator dispatch | ⏳ planned substrate audit item; not part of current release claims |
| 2.4 | Self-CPI event emission | ⏳ planned |
| 2.5 | init_if_needed, realloc, close parity |
⏳ planned Anchor-keyword parity audit; current release documents only shipped keywords |
Tier 3 - explicitly not porting
- Anchor's runtime types verbatim. Hopper's public surface is Hopper-owned:
Account<'info, T>,InitAccount<'info, T>,Signer<'info>, and the lower-level modifier composition remain separate layers. - Quasar's IDL-by-default. We separate that into
hopper-schema. - Bump allocator on by default.
no_allocstays default; heap is opt-in. - Pinocchio-style "zero deps" minimalism for the whole framework. We
keep
bytemuck,sha2-const-stable,five8_const.
Priority order for the next quarter
hopper-logcrate (1.4)- Self-CPI event pattern (2.4)
- Anza modular SDK 2.x migration audit (1.6)
- Compile-time dispatch table audit (2.3)
- Anchor-keyword parity audit (2.5)
