chore(release): prepare release - #184
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
monochange/release/release
branch
8 times, most recently
from
August 16, 2026 19:26
93b3516 to
42f51cc
Compare
10 tasks
github-actions
Bot
force-pushed
the
monochange/release/release
branch
15 times, most recently
from
August 19, 2026 13:35
4bffeae to
204a8b7
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
github-actions
Bot
force-pushed
the
monochange/release/release
branch
from
August 19, 2026 14:42
204a8b7 to
d8e9bdc
Compare
Prepare release. - release targets: core (0.9.0) - released packages: codama-nodes-from-pina, pina, pina_cli, pina_codama_renderer, pina_macros, pina_profile, pina_sdk_ids - updated changelogs: changelog.md - deleted changesets: .changeset/accounts-cursor-writable-enforcement.md, .changeset/anchor_realloc_authorization.md, .changeset/client_account_resolution.md, .changeset/codama_idl_coverage_and_docs.md, .changeset/correct_cpi_introspection_claim.md, .changeset/dart_codama_clients.md, .changeset/dependency_refresh.md, .changeset/devenv_drop_broken_sbpf_linker.md, .changeset/devenv_nixpkgs_activation_followup.md, .changeset/discriminator_error_message.md, .changeset/docs_invariants.md, .changeset/docs_mdt_sweep.md, .changeset/fuzz_harness.md, .changeset/harden_renderer_output.md, .changeset/instruction-discriminator-path-syntax.md, .changeset/macro_panic_paths.md, .changeset/pina_cli_ux_and_parallel_io.md, .changeset/pinocchio_0_11_migration.md, .changeset/pod_collections_and_refactor.md, .changeset/pod_collections_idl_support.md, .changeset/pod_enum_derive.md, .changeset/port_to_zeropod.md, .changeset/post_merge_audit.md, .changeset/preflight_account_mutations.md, .changeset/profile_test_errors.md, .changeset/token_loader_hardening.md, .changeset/typed_pda_seeds.md, .changeset/update_js_dependencies.md, .changeset/use_released_solana_kit.md, .changeset/wide_discriminator_idls.md
github-actions
Bot
force-pushed
the
monochange/release/release
branch
from
August 19, 2026 15:51
d8e9bdc to
2a7669e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prepared release
releasecore->v0.9.0Release notes
core 0.9.0
Grouped release for
core.Breaking Changes
Enforce writability at account parse time:
AccountsCursor::next_mutnow validates that the account is marked writable in the instruction before returning a&mut AccountView, andremaining_mutvalidates every trailing account. A&mut AccountView(or&mut [AccountView]) field is now the single source of truth for writable accounts — the separateassert_writable()call is no longer required for mutable fields.Packages: pina
Migration guide
assert_writable()calls. Anyassert_writable()invoked on a field declared as&'a mut AccountView(or inside a&'a mut [AccountView]remaining slice) is now redundant and can be deleted. The check happens once, duringtry_from/try_from_account_infos, before any instruction processing.assert_writable()on immutable fields. Accounts declared as&'a AccountViewthat must be writable (for example, CPI targets the program never mutates directly) still require an explicitassert_writable()call.remaining_mutnow returnsResult.AccountsCursor::remaining_mutchanged from&'a mut [AccountView]toResult<&'a mut [AccountView], ProgramError>and rejects the call when any remaining account is not writable. The#[derive(Accounts)]expansion was updated accordingly; manual cursor users must add?.&mutfields without asserting writability will now fail withProgramError::InvalidAccountDatawhen a non-writable account is passed. This is the intended fix: a mutable view of a non-writable account is never legitimate.Owner: @ifiokjr · Review: PR #172
Bind Anchor Realloc Samples to Their Authority
Packages: core
examples/anchor_reallocis now a secure, intentionally non-ABI-compatible adaptation of Anchor's test fixture. It addsInitialize(discriminator2) and creates a per-authority sample PDA at[b"sample", authority].Reallocstill uses discriminator0, but its authority must now be writable and a signer, its sample must be initialized at the canonical PDA, and itslenincludes the 34-byte authenticatedSampleheader.Realloc2(discriminator1) no longer resizes two arbitrary accounts. It validates both authenticated targets and returnsAccountDuplicateReallocsbefore mutation, matching Anchor's duplicate-reallocation regression intent.This removes the previous capability for an unrelated signer to resize an arbitrary writable account owned by the program. Regenerate Codama clients and initialize the sample before calling
Realloc.Owner: @ifiokjr · Review: PR #203 · Related issues: #205
Refresh workspace dependencies
Packages: pina, pina_cli
Refresh workspace dependencies to their latest compatible versions.
pinocchio-tokento0.7andpinocchio-token-2022to0.4(drops thetoken_programfield fromTransferChecked/CloseAccount; examples now use thenew()constructors).codama-nodesto0.11(spec1.8.0),mollusk-svmto0.15,solana-accountto4,solana-system-interfaceto3,insta-cmdto0.7, andobjectto0.40.codamato1.10,@codama/renderers-jsto2.3) and regenerate all IDLs and Rust/JS clients.syn3, including the publicpina_cliparsing API, and release the temporary derive-crate pins used during the migration.RUSTSEC-2026-0097(unsoundrand0.7.3) andRUSTSEC-2026-0173(unmaintainedproc-macro-error2), dropping them from the dependency tree, and updatesjiff,defmt,env_logger,solana-logger, andcrossbeam-epochto patched versions.Owner: @ifiokjr · Review: PR #167 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
Upgrade workspace to Pinocchio 0.11
Packages: core
Upgrade the workspace to Pinocchio 0.11 and migrate Pina's core account APIs to the new mutable
AccountViewmodel.Breaking changes include:
TryFromAccountInfos, and downstream account parsing now use&mut [AccountView]ProcessAccountInfos::processnow consumesselfAsAccount::as_accountandas_account_mutnow return guard-backedRef/RefMutvalues instead of bare references#[derive(Accounts)]now supports mutable account refs and slices, and writable IDL inference now follows mutable fieldszeroed()flow or use the newclose_account_zeroed()helper when stale bytes must be cleared before closeThis release also upgrades the Pinocchio companion crates, adds the standalone
memoandaccount-resizefeatures, preserves token account compatibility aliases, refreshes docs/examples/security guidance for the new borrow model, and regenerates the affected Codama IDLs and generated clients.Owner: @ifiokjr · Review: PR #149
Port to zeropod
Packages: pina, pina_cli, pina_macros, pina_codama_renderer
Replace pina's own pod primitives (
pina_pod_primitives, based onbytemuck) with zeropod as the primitives library. This is a major change to the account model:pina_pod_primitivesis deleted. Its types (PodU64,PodBool,PodString,PodVec,PodOption) are re-exported fromzeropodwith the same names.bytemuck::PodandZeroableare removed from Pina's public account model.pina::Pod/pina::Zeroablere-exports are gone; transitive Solana dependencies may still use bytemuck internally.AccountDeserializeis replaced byPinaAccount. Account schemas derivezeropod::ZeroPod; loaders return the generatedAccountZccompanion rather than reinterpreting the native schema as account memory.PodBoolbytes, invalid UTF-8 inPodString, and overlengthPodVecprefixes are now rejected bytry_from_bytes/as_accountinstead of silently accepted.PodString::as_str()is now safe (validated at the boundary);as_str_unchecked/try_as_strare gone.PodU64::from_primitiveis replaced byFrom<u64>(zeropod's API).from_primitivecallers should usePodU64::from(n)orn.into().PodBool::from_boolis replaced byFrom<bool>.PodVec::as_mut_sliceis renamed toas_slice_mut(zeropod's API).#[account],#[instruction], and#[event]macros derivezeropod::ZeroPodand expose checkedtry_from_bytes/initializehelpers. Pina no longer generatesto_bytes()or any whole-object serialization API.Address, literal-length byte arrays, and native scalar options. Generics, custom/nested mappings, enums,NonZero*,char, rawPodOption, and string/vector collections are rejected at macro expansion.get/setaccessors. Bounded text and list examples use fully initialized byte arrays with checked semantic helpers.PinaAccount/ZeroPodFixedimplementations remain advanced escape hatches outside Pina's audited macro-generated contract; their authors own all zeropod safety invariants.PinaSerialize, Pina's genericInstructionBuilder, the customPodEnumderive, and Pina's generic raw-cast helpers are removed. Zeropod owns the byte-to-view boundary.#[discriminator]macro no longer emitsunsafe impl Pod/unsafe impl Zeroablefor enums.Owner: @ifiokjr · Review: PR #195 · Closed issues: #193 · Related issues: #194, #205
Use zeropod's native enum schema support
Packages: pina_macros
Remove Pina's custom
PodEnumderive in favor of zeropod's standalone native enum schema support. Pina's audited#[account],#[instruction], and#[event]schemas reject enum and customZcFieldfields because the macro cannot establish their full mapping and validation-order invariants. Standalone enums can still derivezeropod::ZeroPodfor advanced direct zeropod integrations outside that closed contract.For macro-generated Pina schemas, store an audited scalar discriminant and convert it to a domain enum only after explicit semantic validation.
Owner: @ifiokjr · Review: PR #195 · Closed issues: #193 · Related issues: #194, #205
Features
Add fuzz harness infrastructure for pina-rs targeting
PinaAccount::try_from_bytesandparse_instruction.Packages: pina
crates/pina_fuzz/crate withlibfuzzer-sysintegrationCounterState,RegistryConfig, andRoleEntryCounterInstructionandRegistryInstructionOwner: @ifiokjr · Review: PR #172 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
Re-export zeropod fixed-capacity collection types
Packages: pina
Replace Pina's local collection implementation with re-exports of zeropod's allocation-free
PodOption,PodString, andPodVecstorage types for advanced direct zeropod integrations. Pina's macro-generated account, instruction, and event schemas deliberately reject string/vector collection fields because not every upstream construction path initializes inactive capacity. Macro schemas support semanticOption<scalar>fields through an exact auditedPodOptionmapping; use fully initialized fixed byte arrays plus checked helpers for bounded text and lists.Owner: @ifiokjr · Review: PR #147 · Related issues: #205
feat: add typed
#[pda]attribute for PDA seed declarationsPackages: pina, pina_cli, pina_macros, pina_codama_renderer
Adds a
#[pda(seeds = [...], bump = <field>)]attribute macro for#[account]structs, inspired by Quasar's typed seed declarations. The macro generates owned seed structs (XxxSeeds/XxxSeedsWithBump),seeds()/as_slices()/with_bump()helpers,try_find_pda()/find_pda()derivation helpers, andassert_seeds()stored-bump verification when a bump field is declared.Supported seed types:
Address,u8,u16,u32,u64,[u8; N], andconst &[u8]references. The CLI parses the attribute for IDL generation with accurate seed types (fixing the escrowu64seed being mis-typed as an address in generated clients), and the renderer emitsfind_pda/create_pdahelpers for linked accounts. All examples now use the attribute instead of manual seed macros.Owner: @ifiokjr · Review: PR #194
Resolve PDA-derived account defaults in clients
Packages: pina_cli, pina_codama_renderer
Resolve explicit PDA-derived account defaults in generated clients. Codama lowering now preserves deterministic PDA default metadata from account seeds, and the Rust renderer emits builders that derive those defaults while keeping signer and writable expectations explicit.
Owner: @ifiokjr · Review: PR #158 · Closed issues: #144
Add UX improvements and parallel file I/O to the pina CLI
Packages: pina_cli
Add UX improvements and parallel file I/O to the
pinaCLI.resolve_cratereads sibling module files in parallel viarayonwhile preserving deterministic parsing and error reporting.owo-colorsfor semantic terminal styling.pina idlprints acomfy-tablesummary showing instruction, account, PDA, and error counts after generation.docssubcommand:pina docs <topic>renders bundled.t.mddocumentation in-terminal usingtermimad, withPINA_TEMPLATES_DIRsupport for custom topics.rayon,owo-colors,comfy-table(8.0), andtermimad(0.35.1).Owner: @ifiokjr · Review: PR #156
Add semantic zeropod
String<N, PFX>,Vec<T, N, PFX>, and fixedOption<T>parsing to the IDL toolchain for legacy IDLs and advanced direct zeropod integrations. Pina's audited account, instruction, and event macros accept only scalarOption<T>and reject string/vector, explicitPodOption, enum, custom, and nested layouts. Generated clients for supported Pina schemas therefore use scalar options and fully initialized fixed byte arrays; layouts Codama cannot represent faithfully fail generation instead of falling back to public keys.Packages: pina_cli
Encode account and instruction discriminators in generated clients, map signed Pod numeric elements at their real sizes, preserve generic capacity parameters during IDL extraction, reject noncanonical
PodStringlength prefixes, initialize discriminators in typed account-creation helpers, and run the profile program's real SBF lifecycle in CI.Generated JavaScript codecs validate discriminators, canonical booleans, and scalar-option tags. Advanced collection codecs reject values that exceed fixed capacity, decode UTF-8 strictly, and preserve embedded NUL characters, but those collection layouts are outside Pina's macro-generated schema contract.
Owner: @ifiokjr · Review: PR #171 · Related issues: #205
Support
discriminator = Enum::Variantin the#[instruction],#[account], and#[event]attribute macros, replacing the separatevariant = Variantargument.Packages: pina_macros
The shorthand form is unchanged: when the struct name matches the variant,
discriminator = Enumalone still works.Migration guide
#[instruction(discriminator = Enum, variant = Variant)]with#[instruction(discriminator = Enum::Variant)]. The same applies to#[account(...)]and#[event(...)].variant = Variantargument remains supported for backwards compatibility. When it is present, the completediscriminatorvalue is treated as the enum path, which preserves qualified forms such ascrate::types::Enum, variant = Variant.pina_cliIDL extraction understands all three forms:Enum::Variant,Enum+variant = Variant, and bareEnum(variant defaults to the struct name). Thepina inittemplate now emits the new syntax.Owner: @ifiokjr · Review: PR #172 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
Fixes
Improve Codama IDL extraction coverage
Packages: core
Improve Codama IDL extraction coverage so grouped match arms, accountless instructions, and instruction-only programs generate complete IDL and client surfaces. Document the supported extractor shapes and validation guarantees across the README, CLI docs, and mdBook.
Owner: @ifiokjr · Review: PR #132
Correct the CPI introspection guarantee
Packages: pina
Expose
assert_current_instruction_program_idfor the guarantee the Instructions sysvar can actually provide. Deprecate the misleadingassert_no_cpiname because transaction-level instruction metadata cannot detect self-CPI.Owner: @ifiokjr · Review: PR #204
Add semantic zeropod
String<N, PFX>,Vec<T, N, PFX>, and fixedOption<T>parsing to the IDL toolchain for legacy IDLs and advanced direct zeropod integrations. Pina's audited account, instruction, and event macros accept only scalarOption<T>and reject string/vector, explicitPodOption, enum, custom, and nested layouts. Generated clients for supported Pina schemas therefore use scalar options and fully initialized fixed byte arrays; layouts Codama cannot represent faithfully fail generation instead of falling back to public keys.Packages: pina, pina_codama_renderer
Encode account and instruction discriminators in generated clients, map signed Pod numeric elements at their real sizes, preserve generic capacity parameters during IDL extraction, reject noncanonical
PodStringlength prefixes, initialize discriminators in typed account-creation helpers, and run the profile program's real SBF lifecycle in CI.Generated JavaScript codecs validate discriminators, canonical booleans, and scalar-option tags. Advanced collection codecs reject values that exceed fixed capacity, decode UTF-8 strictly, and preserve embedded NUL characters, but those collection layouts are outside Pina's macro-generated schema contract.
Owner: @ifiokjr · Review: PR #171 · Related issues: #205
Preflight fallible account mutations
Packages: pina
Check active borrows and the per-instruction growth limit before moving rent or closing account balances, so expected validation failures do not leave helper callers with partially mutated in-memory state.
Owner: @ifiokjr · Review: PR #201
StateWithExtensionstype and validation. The newTokenMintRefandTokenAccountRefenums provide common field access for code that supports either program, while still exposing the concrete Token-2022 state when extensions are needed. Associated-token loaders validate against the explicitly selected program, so valid extensions are accepted without accepting overlong legacy accounts, malformed extensions, or mixed-program account sets.Support
discriminator = Enum::Variantin the#[instruction],#[account], and#[event]attribute macros, replacing the separatevariant = Variantargument.Packages: pina_cli
The shorthand form is unchanged: when the struct name matches the variant,
discriminator = Enumalone still works.Migration guide
#[instruction(discriminator = Enum, variant = Variant)]with#[instruction(discriminator = Enum::Variant)]. The same applies to#[account(...)]and#[event(...)].variant = Variantargument remains supported for backwards compatibility. When it is present, the completediscriminatorvalue is treated as the enum path, which preserves qualified forms such ascrate::types::Enum, variant = Variant.pina_cliIDL extraction understands all three forms:Enum::Variant,Enum+variant = Variant, and bareEnum(variant defaults to the struct name). Thepina inittemplate now emits the new syntax.Owner: @ifiokjr · Review: PR #172 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
codama-renderers-dart@0.5.1renderer and Solana Kit Dart^0.8.0runtime packages for generated clients, removing the temporary renderer patch and Git dependency overrides.Preserve wide discriminator encodings
Packages: pina_cli
Parse the complete discriminator attribute grammar when generating Codama IDLs and preserve
u16,u32, andu64discriminator widths instead of silently lowering them tou8.Owner: @ifiokjr · Review: PR #200
Refresh workspace dependencies
Packages: pina_macros, pina_codama_renderer, pina_profile, pina_sdk_ids
Refresh workspace dependencies to their latest compatible versions.
pinocchio-tokento0.7andpinocchio-token-2022to0.4(drops thetoken_programfield fromTransferChecked/CloseAccount; examples now use thenew()constructors).codama-nodesto0.11(spec1.8.0),mollusk-svmto0.15,solana-accountto4,solana-system-interfaceto3,insta-cmdto0.7, andobjectto0.40.codamato1.10,@codama/renderers-jsto2.3) and regenerate all IDLs and Rust/JS clients.syn3, including the publicpina_cliparsing API, and release the temporary derive-crate pins used during the migration.RUSTSEC-2026-0097(unsoundrand0.7.3) andRUSTSEC-2026-0173(unmaintainedproc-macro-error2), dropping them from the dependency tree, and updatesjiff,defmt,env_logger,solana-logger, andcrossbeam-epochto patched versions.Owner: @ifiokjr · Review: PR #167 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
#[discriminator]size-assertion error message: it now reports the primitive's byte width (e.g.u128(16 bytes)) and lists the supported primitives (u8,u16,u32,u64), instead of only naming the symbolicMAX_DISCRIMINATOR_SPACEconstant.#[derive(Accounts)]now reports a clear error instead of panicking if the input shape is ever accepted bydarlingwithout named fields, and the remainingunwrap()calls on provably-safe values carry explanatory messages. Add trybuild negative tests for#[derive(Accounts)]on enums and tuple structs.Harden generated output boundaries
Packages: pina_codama_renderer
Reject unsafe names and literals before rendering, validate generated Rust before replacing existing output, and constrain cleanup to managed files within the requested destination.
Owner: @ifiokjr · Review: PR #198
Documentation
Improve documentation for guard-backed account access, cursor safety, inline_always allowance, and the log macro.
Packages: pina
AsAccountexplaining thatRef/RefMutguards block incompatible borrows while alive and should be dropped before later mutable access or CPIs.AccountsCursor::next_mutrejects aliases for individually parsed mutable fields, whilepeekperforms no validation andremaining_mutdeliberately preserves trailing-account aliases.#![allow(clippy::inline_always)]with a rationale comment explaining CU optimization for on-chain programs.log!format-arg limitation into a dedicated# Limitationsdoc section.Owner: @ifiokjr · Review: PR #177 · Related issues: #165, #166, #167, #168, #169, #170, #171, #172, #173, #174, #175, #176, #177, #179, #180, #181, #185, #186, #187, #189, #195
Refresh shared documentation after Pinocchio 0.11 migration
Packages: core
Refresh the shared documentation after the Pinocchio 0.11 migration. This expands feature-selection guidance, adds explicit instruction-authoring tips for the new mutable
AccountViewand guard-backed loader model, clarifies close-account safety withclose_account_zeroed(), and updates the security and design notes to match the current APIs.Owner: @ifiokjr · Review: PR #151
Correct the CPI introspection guarantee
Packages: pina_cli
Expose
assert_current_instruction_program_idfor the guarantee the Instructions sysvar can actually provide. Deprecate the misleadingassert_no_cpiname because transaction-level instruction metadata cannot detect self-CPI.Owner: @ifiokjr · Review: PR #204
Notes
Keep prebuilt sbpf-linker available in devenv
Packages: core
Keep the prebuilt
custom.sbpf-linkerpackage available indevenvso BPF and binary-size jobs can findsbpf-linkeronPATH, while disabling the package's NixinstallCheckPhase. The upstream binary now requires linker inputs and--output, so invoking it with no arguments during the install check fails on Linux; on Darwin the same check also exposed a stale Homebrew LLVM load path. Skipping the install check unblocksdevenv shellwithout removing the linker used by CI.Owner: @ifiokjr · Review: PR #161
Refresh devenv.lock
Packages: core
Refresh
devenv.lockto pick up the latestifiokjr/nixpkgsfixes forpnpm-standaloneactivation in CI.Owner: @ifiokjr · Review: PR #107
.expect()/.unwrap()calls in pina_profile tests withunwrap_or_elseand explicit, descriptive panic messages per repo conventions.Changed files