All notable changes to this repository are documented here.
The format is based on Keep a Changelog.
tokens/quasar-metadata: a vendored copy of thequasar-metadatacrate from blueshift-gg/quasar rev623bb70f(the last revision that shipped it), adapted to compile against the 0.1.0quasar-langAPI (RentAccesstype parameter onAccountInit::init,try_find_program_addressrename,Seedimport fromquasar_lang::cpi,unsafeset_data_len). Upstream removed the crate before 0.1.0 with no replacement; vendoring it lets the Metaplex-metadata examples ride the same release pin as everything else. Provenance and local changes are documented in the crate's README and CHANGELOG.
tokens/token-minter,tokens/nft-minter, andtokens/nft-operationsnow migrate to the 0.1.0-release pin (be60fca) like every other example, depending on the vendored crate viaquasar-metadata = { path = "../quasar-metadata" }. This supersedes the previous day's "not migrated" limitation: all 53 Quasar examples are now on 0.1.0.quasar.ymldrops thelegacy-metadata-examplesjob and.github/.ghaignoreis empty again — the whole matrix builds with the one 0.1.0 CLI.
- Migrated 50 of the 53 Quasar examples to the Quasar
0.1.0-releaseline, pinned by rev (be60fca) because crates.io still hosts0.0.0placeholders forquasar-lang/quasar-cli. Per project:quasar-lang/quasar-splrepinned (the four previously floating examples —basics/pythand the threecompressionexamples — are now pinned too);Quasar.tomlrewritten to the 0.1.0 schema ([testing] command,[clients] targets; the old[toolchain]/testing.language/testing.rust/clients.languageskeys are hard errors in 0.1.0); theidl-buildfeature and"lib"crate-type added for the new IDL build; and tests fully rewritten from the direct QuasarSVM harness (QuasarSvm::new().with_program(...),include_bytes!,assert_success) to the newquasar-testfixture harness (#[quasar_test],Wallet/Mint/TokenAccountfixtures,crate::cpiinstruction builders,Outcomeassertions). The standalonequasar-svmgit dev-dependency is gone —quasar-testpulls the publishedquasar-svm 0.1.0from crates.io — and generated-client path dev-dependencies were dropped in favor ofcrate::cpi(a path dev-dependency to a not-yet-generated crate now breaks the requiredcargo generate-lockfile). quasar.ymlCI installs the 0.1.0 CLI (--rev be60fca), runscargo generate-lockfilebeforequasar build(the 0.1.0 IDL step runscargo metadata --locked), and builds the three unmigrated examples in a separatelegacy-metadata-examplesjob with the pre-0.1.0 CLI.- Compute-unit assertions were dropped from the migrated tests pending recalibration under 0.1.0 (correct values are unknowable until the suite first runs on the new line).
tokens/token-minter,tokens/nft-minter, andtokens/nft-operationsstay on the pre-0.1.0 pins (quasar623bb70/ quasar-svmcb7565d): they depend onquasar-metadata, which was removed upstream before 0.1.0 with no replacement. They are listed in.github/.ghaignoreand built by the legacy CI job.
- Quasar CI broke repo-wide when
quasar-svm's HEAD (c63afd2, "sbpf v3") moved tosolana-program-runtime4.1 /solana-address2.6, which cannot co-resolve with the pinnedquasar-langrev623bb70(needssolana-address<2.6). Pinnedquasar-svmtocb7565d(the last rev before the bump) in every Quasar example that pinsquasar-lang, matching the pinprop-ammalready carried.basics/pythand the threecompressionQuasar examples float both dependencies and are left as-is.
- FAQ sections, written as the questions people actually ask, in the root README and every finance example's
anchor/README. llms.txtat the repository root: a summary and link manifest for LLM crawlers and answer engines.docs/example-readme-template.md, the example-README template thatCONTRIBUTING.mdreferenced but which did not exist. It documents the H1 convention and the definition-first opener.
- Every finance example README now titles itself
# Solana <Example> (<Framework>)(e.g.# Solana Escrow (Anchor)) and opens with a self-contained definition that names Solana, so each example page stands alone in search results. - The root README states its toolchain currency explicitly (Anchor 1.1, LiteSVM, July 2026) with a pointer to this changelog.
CONTRIBUTING.mdstyle rules now include the README H1 naming convention and the no-em-dash rule.
token-fundraiser(Anchor): aclose_fundraiserinstruction handler. The Fundraiser PDA is derived from the maker's key alone, so a failed raise used to lock its maker out of ever raising again. The maker can now retire a failed fundraiser (after the deadline, target missed, all contributions refunded), sweeping any direct vault donations to themselves and recovering both rent deposits, then initialize a fresh fundraiser. New error variantRefundsOutstanding.token-fundraiser(Anchor): tests for both contribution caps (test_contribute_above_cap_fails,test_cumulative_contributions_above_cap_fail) and for every branch of the close path (before deadline, target met, refunds outstanding, donation sweep, and close-then-raise-again).
- Upgraded every Anchor program from
anchor-lang/anchor-spl1.0.0to the latest stable1.1.2, and bumped the Anchor CLI used byanchor.ymlCI to match (anchor-version: 1.1.2).
anchor.ymlbuilt no projects when.ghaignorewas empty:find … | grep -vE "$ignore_pattern"treated the empty pattern as "match everything" and dropped the whole list, so the workflow passed without building anything. Guarded the filter (asnative.yml,pinocchio.ymlandsolana-asm.ymlalready do).vault-strategyandperpetual-futuresLiteSVM tests loaded their sibling mock program's.sowithinclude_bytes!, which is evaluated at compile time. Anchor's IDL build compiles the tests before that sibling.sois built, so the build failed. They now read the sibling.soat runtime withstd::fs::read, matching the existingcross-program-invocation/handtest.
- All native, Pinocchio, and ASM examples are now tested exclusively with Rust + LiteSVM. The web3.js v1 / solana-bankrun / ts-mocha TypeScript test suites (which duplicated existing Rust tests) were removed, along with their
package.json,pnpm-lock.yaml, andtsconfig.jsonfiles and thets/client directories. - Rust tests now load the program binary from the workspace
target/deploy/(built withcargo build-sbf --manifest-path=./program/Cargo.toml) instead of per-projecttests/fixturesdirectories. Committed foreign-program fixtures (e.g.mpl_token_metadata.so) stay where they were. - ASM examples standardized on
sbpf build's defaultdeploy/output directory; their inline LiteSVM tests load from there. tools/shank-and-codamanow generates a Rust client (@codama/renderers-rust) instead of a TypeScript one, wrapped in thecar-rental-service-clientcrate, and its tests are Rust + LiteSVM underprogram/tests/.transfer-hook/block-listgained a Rust + LiteSVM lifecycle test (program/tests/) driving the program through its Codama-generated Rust SDK; the mocha/web3.js test was removed. Itspackage.jsonnow only covers SDK generation.- CI (
native.yml,pinocchio.yml,solana-asm.yml) no longer installs Node/pnpm; it builds withcargo build-sbf(orsbpf build) and tests withcargo test.
basics/hello-solana/pinocchioRust + LiteSVM test (it previously had only a TypeScript test).
Mike MacCana led the Quicknode fork of the Solana Foundation program examples from late 2025. The first commits on this repository lineage are dated 8 April 2026; the summary below covers that work through the initial merge.
Toolchain and frameworks. The tree had accumulated examples from several years of Solana development (including Anchor releases going back to the ~0.26 era in 2022 and many intermediate versions). The fork brought the Anchor examples up to Anchor 1.0.0 stable (from 1.0.0-rc.5), refreshed Agave/Solana CLI pins, standardized on pnpm, and added parallel implementations in Quasar, Pinocchio, Native Rust, and ASM where applicable. Token-2022 examples were renamed to token-extensions.
Testing. Replaced the old pattern of local validators, Bankrun, and scattered TypeScript anchor test flows with LiteSVM in-process tests for most Anchor programs - matching current Anchor defaults (cargo test wired through Anchor.toml / pnpm test). Fixed broken or flaky tests across Native, Pinocchio, and Anchor; added missing harnesses (e.g. block-list Pinocchio). CI was reworked for a repo this size: path filtering, caching, matrix sharding, and reliable detection of framework roots.
Programs and layout. Broke large monolithic lib.rs files into instruction handler modules; adopted InitSpace and explicit PDA bumps instead of magic account sizes; corrected several logic bugs (escrow, token swap invariant, counter authority checks, compression Bubblegum program id, and more). Expanded finance and token-extension coverage; reorganized transfer-hook examples (including block-list under Pinocchio).
Documentation. Rewrote the root README (framework badges, clearer example blurbs, ASM links), ran a style and truth audit on READMEs, and linked canonical Solana terminology on first mention. Added this changelog, CONTRIBUTING.md (aligned with LiteSVM testing), README templates, per-example Anchor and Quasar READMEs, fixed Husky for GUI git clients, removed unused maintainer scripts (sync-package-json, cicd.sh, local-validator helpers for the allow/block-list UI), dropped the orphan tokens/spl-token-minter/ tree, and removed legacy root package.json dependencies (web3.js, Bankrun, chai).
Removed / deferred. Dropped duplicate or WIP trees (duplicate block-list Pinocchio copy, Quasar metadata example blocked on sol_realloc, root yarn.lock). Some examples remain excluded from CI via .ghaignore until they build cleanly again (compression, escrow, pyth, and others - see that file for the live list).
There was no changelog before June 2026. Older history lives in git only.