light-sdk-types 0.24.0

Core types for Light Protocol SDK
Documentation
//! `Pubkey` is the standard Solana pubkey type.
//!
//! Previously this module defined a custom `Pubkey([u8; 32])` newtype so it
//! could implement zero-copy traits. For the general SDK surface we re-export
//! `solana_pubkey::Pubkey` directly.
//!
//! [`ZeroCopyPubkey`] is a `[u8; 32]` newtype that additionally implements the
//! `zerocopy` and `bytemuck` traits. It is used only where a pubkey must be
//! embedded in a zero-copy / `Pod` struct (e.g. on-chain account metadata),
//! since `solana_pubkey::Pubkey` does not implement those traits.

pub use solana_pubkey::Pubkey;

use bytemuck::{Pod, Zeroable};
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout, Unaligned};

#[repr(C)]
#[cfg_attr(
    all(feature = "std", feature = "anchor"),
    derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
)]
#[cfg_attr(
    not(feature = "anchor"),
    derive(borsh::BorshDeserialize, borsh::BorshSerialize)
)]
#[derive(
    Pod,
    Zeroable,
    FromBytes,
    IntoBytes,
    KnownLayout,
    Immutable,
    Unaligned,
    Debug,
    Default,
    Copy,
    Clone,
    PartialEq,
    Eq,
    Hash,
)]
pub struct ZeroCopyPubkey(pub [u8; 32]);

impl ZeroCopyPubkey {
    pub fn to_bytes(&self) -> [u8; 32] {
        self.0
    }
}

impl From<[u8; 32]> for ZeroCopyPubkey {
    fn from(bytes: [u8; 32]) -> Self {
        Self(bytes)
    }
}

impl From<ZeroCopyPubkey> for [u8; 32] {
    fn from(value: ZeroCopyPubkey) -> Self {
        value.0
    }
}

impl From<Pubkey> for ZeroCopyPubkey {
    fn from(value: Pubkey) -> Self {
        Self(value.to_bytes())
    }
}

impl From<ZeroCopyPubkey> for Pubkey {
    fn from(value: ZeroCopyPubkey) -> Self {
        Pubkey::from(value.0)
    }
}