#account #generics #solana #sanctum

solana-readonly-account

Readonly solana account field getter traits extendable for both on-chain and off-chain structs

4 stable releases

2.0.0 Aug 3, 2024
1.2.0 Jul 2, 2024
1.1.0 Jan 3, 2024
1.0.0 Dec 11, 2023

#79 in #generics

Download history 203/week @ 2024-06-28 120/week @ 2024-07-05 101/week @ 2024-07-12 72/week @ 2024-07-19 173/week @ 2024-07-26 167/week @ 2024-08-02 68/week @ 2024-08-09 45/week @ 2024-08-16 51/week @ 2024-08-23 22/week @ 2024-08-30 4/week @ 2024-09-06 42/week @ 2024-09-13 33/week @ 2024-09-20 59/week @ 2024-09-27 48/week @ 2024-10-04 46/week @ 2024-10-11

189 downloads per month

MIT/Apache

21KB
433 lines

solana-readonly-account

Reimplementation of ReadableAccount to enable code reuse across off-chain clients (solana-sdk) and on-chain programs (solana-program)

Why was this crate created?

  • You cannot use the original ReadableAccount trait from solana-sdk in on-chain programs because the solana-sdk feature flags don't work properly and it won't compile with build-sbf
  • Rc<RefCell<>>s in AccountInfo make it incompatible with &[u8] for .data

Library

The 6 main account fields (key, lamports, data, owner, is_executable, rent_epoch) are split into individual getter traits. This splitting allows for greater trait composability and flexibility.

For example, say you had a function that only requires the account's owner and this is a known static pubkey. Instead of having to fetch the full Account just to read its already-known owner field, or creating a dummy Account, you can simply define a newtype that only needs to implement ReadonlyAccountOwner, while still maintaining the ability to use this function with on-chain AccountInfos.

Usage

Importing the respective traits from the crate now enables you to write generic functions that work both on-chain and off-chain

use solana_program::{
    program_error::ProgramError, program_pack::Pack,
};
use solana_readonly_account::ReadonlyAccountData;
use spl_token_2022::state::Account;

pub fn try_deserialize_token_account<A: ReadonlyAccountData>(
    acc: A,
) -> Result<Account, ProgramError> {
    Account::unpack(&acc.data())
}

By default, this crate has zero dependencies and only provides the trait definitions.

Crate Features

keyed

Since many offchain account structs such as solana_sdk::Account don't have a pubkey field, the following Keyed wrapper struct is defined to impl ReadonlyAccountPubkey and ReadonlyAccountPubkeyBytes for:

pub struct Keyed<T> {
    pub pubkey: Pubkey,
    pub account: T,
}

keyed-bytes

Similar to keyed but using [u8; 32] instead of Pubkey for zero dependencies.

solana-pubkey

Enables support for solana's Pubkey types on top of the raw [u8; 32] types.

solana-program

impls the traits for AccountInfo

solana-sdk

impls the traits for Account and AccountSharedData.

Do NOT enable this feature in an on-chain program crate, or cargo-build-sbf will fail.

Testing

cargo test --all-features

Dependencies

~0–9.5MB
~93K SLoC