pina 0.7.0

a solana and pinocchio smart contract framework
Documentation

pina

Core runtime crate for building Solana programs on top of pinocchio.

It provides zero-copy account loaders, discriminator-aware account/instruction/event modeling, account validation traits, and no_std entrypoint helpers.

Crates.io Docs.rs CI License codecov

Installation

cargo add pina

Enable optional token helpers:

cargo add pina --features token

What This Crate Includes

  • nostd_entrypoint! for no_std Solana entrypoint wiring.
  • #[account], #[instruction], #[event], #[error], #[discriminator], and #[derive(Accounts)] integration via the default derive feature.
  • Validation chains on AccountView (assert_signer, assert_writable, assert_owner, PDA checks, sysvar checks, and more).
  • Zero-copy POD wrappers (PodU*, PodI*, PodBool) for stable on-chain layouts.
  • CPI helpers for system/token operations.

Feature Flags

Feature Default Description
derive Yes Enables proc macros (#[account], #[instruction], etc.)
logs Yes Enables on-chain logging via solana-program-log
token No Enables SPL token / token-2022 helpers and ATA utilities

Minimal Program Skeleton

#![no_std]

use pina::*;

declare_id!("YourProgramId11111111111111111111111111111111");

#[discriminator]
pub enum Instruction {
	Initialize = 0,
}

#[instruction(discriminator = Instruction, variant = Initialize)]
pub struct InitializeInstruction {}

nostd_entrypoint!(process_instruction);

fn process_instruction(
	program_id: &Address,
	accounts: &[AccountView],
	data: &[u8],
) -> ProgramResult {
	let ix: Instruction = parse_instruction(program_id, &ID, data)?;
	match ix {
		Instruction::Initialize => {
			let _ = InitializeInstruction::try_from_bytes(data)?;
			let _ = accounts;
			Ok(())
		}
	}
}

Related Crates

  • pina_macros: proc-macro implementations for the attributes and derives used here.
  • pina_cli: CLI/library used to generate Codama IDLs from Pina programs.
  • pina_sdk_ids: shared Solana program/sysvar IDs.

Codama IDLs

pina models are designed to be extracted into Codama IDLs through pina_cli.

pina idl --path ./my_program --output ./idls/my_program.json

From there you can generate JS clients with Codama renderers, or Pina-style Rust clients using this repository's pina_codama_renderer tool.