From 85811d9a88c7910d6b589966768aa975cfb7c412 Mon Sep 17 00:00:00 2001 From: Brett Etter Date: Mon, 15 Sep 2025 13:50:35 -0500 Subject: [PATCH 1/2] Added `solana-address` feature --- Cargo.lock | 27 ++++++++ Cargo.toml | 1 + .../src/instructions/allocate_with_seed.rs | 3 +- .../src/instructions/assign_with_seed.rs | 3 +- .../instructions/authorize_nonce_account.rs | 3 +- .../instructions/create_account_with_seed.rs | 4 +- .../instructions/initialize_nonce_account.rs | 3 +- .../src/instructions/initialize_account_2.rs | 6 +- .../src/instructions/initialize_account_3.rs | 6 +- .../src/instructions/initialize_mint.rs | 11 ++-- .../src/instructions/initialize_mint_2.rs | 11 ++-- .../src/instructions/set_authority.rs | 6 +- .../src/instructions/initialize_account_2.rs | 6 +- .../src/instructions/initialize_account_3.rs | 6 +- .../token/src/instructions/initialize_mint.rs | 11 ++-- .../src/instructions/initialize_mint_2.rs | 11 ++-- .../token/src/instructions/set_authority.rs | 6 +- sdk/pinocchio/Cargo.toml | 4 ++ sdk/pinocchio/src/entrypoint/mod.rs | 10 +-- sdk/pinocchio/src/pubkey.rs | 61 ++++++++++++++++--- sdk/pinocchio/src/sysvars/clock.rs | 6 +- sdk/pinocchio/src/sysvars/instructions.rs | 6 +- sdk/pinocchio/src/sysvars/rent.rs | 6 +- sdk/pinocchio/src/sysvars/slot_hashes/mod.rs | 8 +-- sdk/pinocchio/src/sysvars/slot_hashes/test.rs | 9 +-- .../src/sysvars/slot_hashes/test_edge.rs | 9 ++- .../src/sysvars/slot_hashes/test_utils.rs | 6 +- sdk/pubkey/src/lib.rs | 23 ++++--- 28 files changed, 190 insertions(+), 82 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ff293a5f..1109e711 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "five8" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875" +dependencies = [ + "five8_core", +] + [[package]] name = "five8_const" version = "0.1.4" @@ -37,6 +46,7 @@ name = "pinocchio" version = "0.9.2" dependencies = [ "five8_const", + "solana-address", ] [[package]] @@ -157,6 +167,23 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" +[[package]] +name = "solana-address" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7a457086457ea9db9a5199d719dc8734dc2d0342fad0d8f77633c31eb62f19" +dependencies = [ + "five8", + "five8_const", + "solana-program-error", +] + +[[package]] +name = "solana-program-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" + [[package]] name = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index 06e87351..dd51cf70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ pinocchio-log-macro = { version = "0.5", path = "sdk/log/macro" } pinocchio-pubkey = { version = "0.3", path = "sdk/pubkey" } quote = "1.0" regex = "1" +solana-address = { version = "1.0.0", features = ["decode"] } syn = "1.0" [workspace.metadata.cli] diff --git a/programs/system/src/instructions/allocate_with_seed.rs b/programs/system/src/instructions/allocate_with_seed.rs index 423f85b4..49a59db4 100644 --- a/programs/system/src/instructions/allocate_with_seed.rs +++ b/programs/system/src/instructions/allocate_with_seed.rs @@ -1,3 +1,4 @@ +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -56,7 +57,7 @@ impl AllocateWithSeed<'_, '_, '_> { // - [.. +32]: owner pubkey let mut instruction_data = [0; 112]; instruction_data[0] = 9; - instruction_data[4..36].copy_from_slice(self.base.key()); + instruction_data[4..36].copy_from_slice(pubkey_as_slice(self.base.key())); instruction_data[36..44].copy_from_slice(&u64::to_le_bytes(self.seed.len() as u64)); let offset = 44 + self.seed.len(); diff --git a/programs/system/src/instructions/assign_with_seed.rs b/programs/system/src/instructions/assign_with_seed.rs index 97d27e03..bdf06a55 100644 --- a/programs/system/src/instructions/assign_with_seed.rs +++ b/programs/system/src/instructions/assign_with_seed.rs @@ -1,3 +1,4 @@ +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -51,7 +52,7 @@ impl AssignWithSeed<'_, '_, '_> { // - [.. +32]: owner pubkey let mut instruction_data = [0; 104]; instruction_data[0] = 10; - instruction_data[4..36].copy_from_slice(self.base.key()); + instruction_data[4..36].copy_from_slice(pubkey_as_slice(self.base.key())); instruction_data[36..44].copy_from_slice(&u64::to_le_bytes(self.seed.len() as u64)); let offset = 44 + self.seed.len(); diff --git a/programs/system/src/instructions/authorize_nonce_account.rs b/programs/system/src/instructions/authorize_nonce_account.rs index 3402b1d9..7162706a 100644 --- a/programs/system/src/instructions/authorize_nonce_account.rs +++ b/programs/system/src/instructions/authorize_nonce_account.rs @@ -1,3 +1,4 @@ +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -43,7 +44,7 @@ impl AuthorizeNonceAccount<'_, '_> { // - [4..12]: lamports let mut instruction_data = [0; 36]; instruction_data[0] = 7; - instruction_data[4..36].copy_from_slice(self.new_authority); + instruction_data[4..36].copy_from_slice(pubkey_as_slice(self.new_authority)); let instruction = Instruction { program_id: &crate::ID, diff --git a/programs/system/src/instructions/create_account_with_seed.rs b/programs/system/src/instructions/create_account_with_seed.rs index 53602717..7bce3680 100644 --- a/programs/system/src/instructions/create_account_with_seed.rs +++ b/programs/system/src/instructions/create_account_with_seed.rs @@ -1,3 +1,4 @@ +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -91,7 +92,8 @@ impl<'a, 'b, 'c> CreateAccountWithSeed<'a, 'b, 'c> { // - [.. +32]: owner pubkey let mut instruction_data = [0; 120]; instruction_data[0] = 3; - instruction_data[4..36].copy_from_slice(self.base.unwrap_or(self.from).key()); + instruction_data[4..36] + .copy_from_slice(pubkey_as_slice(self.base.unwrap_or(self.from).key())); instruction_data[36..44].copy_from_slice(&u64::to_le_bytes(self.seed.len() as u64)); let offset = 44 + self.seed.len(); diff --git a/programs/system/src/instructions/initialize_nonce_account.rs b/programs/system/src/instructions/initialize_nonce_account.rs index 738ca1b8..cb94748c 100644 --- a/programs/system/src/instructions/initialize_nonce_account.rs +++ b/programs/system/src/instructions/initialize_nonce_account.rs @@ -1,3 +1,4 @@ +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -45,7 +46,7 @@ impl InitializeNonceAccount<'_, '_> { // - [4..36]: authority pubkey let mut instruction_data = [0; 36]; instruction_data[0] = 6; - instruction_data[4..36].copy_from_slice(self.authority); + instruction_data[4..36].copy_from_slice(pubkey_as_slice(self.authority)); let instruction = Instruction { program_id: &crate::ID, diff --git a/programs/token-2022/src/instructions/initialize_account_2.rs b/programs/token-2022/src/instructions/initialize_account_2.rs index e7bacaf2..f4e044b1 100644 --- a/programs/token-2022/src/instructions/initialize_account_2.rs +++ b/programs/token-2022/src/instructions/initialize_account_2.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new Token Account. /// /// ### Accounts: @@ -47,7 +47,7 @@ impl InitializeAccount2<'_, '_> { // Set discriminator as u8 at offset [0] write_bytes(&mut instruction_data, &[16]); // Set owner as [u8; 32] at offset [1..33] - write_bytes(&mut instruction_data[1..], self.owner); + write_bytes(&mut instruction_data[1..], pubkey_as_slice(self.owner)); let instruction = Instruction { program_id: self.token_program, diff --git a/programs/token-2022/src/instructions/initialize_account_3.rs b/programs/token-2022/src/instructions/initialize_account_3.rs index b7ef7a9c..b3571f99 100644 --- a/programs/token-2022/src/instructions/initialize_account_3.rs +++ b/programs/token-2022/src/instructions/initialize_account_3.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new Token Account. /// /// ### Accounts: @@ -43,7 +43,7 @@ impl InitializeAccount3<'_, '_> { // Set discriminator as u8 at offset [0] write_bytes(&mut instruction_data, &[18]); // Set owner as [u8; 32] at offset [1..33] - write_bytes(&mut instruction_data[1..], self.owner); + write_bytes(&mut instruction_data[1..], pubkey_as_slice(self.owner)); let instruction = Instruction { program_id: self.token_program, diff --git a/programs/token-2022/src/instructions/initialize_mint.rs b/programs/token-2022/src/instructions/initialize_mint.rs index 57563d52..3d9ab742 100644 --- a/programs/token-2022/src/instructions/initialize_mint.rs +++ b/programs/token-2022/src/instructions/initialize_mint.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new mint. /// /// ### Accounts: @@ -53,12 +53,15 @@ impl InitializeMint<'_, '_> { // Set decimals as u8 at offset [1] write_bytes(&mut instruction_data[1..2], &[self.decimals]); // Set mint_authority as Pubkey at offset [2..34] - write_bytes(&mut instruction_data[2..34], self.mint_authority); + write_bytes( + &mut instruction_data[2..34], + pubkey_as_slice(self.mint_authority), + ); if let Some(freeze_auth) = self.freeze_authority { // Set Option = `true` & freeze_authority at offset [34..67] write_bytes(&mut instruction_data[34..35], &[1]); - write_bytes(&mut instruction_data[35..], freeze_auth); + write_bytes(&mut instruction_data[35..], pubkey_as_slice(freeze_auth)); } else { // Set Option = `false` write_bytes(&mut instruction_data[34..35], &[0]); diff --git a/programs/token-2022/src/instructions/initialize_mint_2.rs b/programs/token-2022/src/instructions/initialize_mint_2.rs index f1d458b8..c634afda 100644 --- a/programs/token-2022/src/instructions/initialize_mint_2.rs +++ b/programs/token-2022/src/instructions/initialize_mint_2.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new mint. /// /// ### Accounts: @@ -47,12 +47,15 @@ impl InitializeMint2<'_, '_> { // Set decimals as u8 at offset [1] write_bytes(&mut instruction_data[1..2], &[self.decimals]); // Set mint_authority as Pubkey at offset [2..34] - write_bytes(&mut instruction_data[2..34], self.mint_authority); + write_bytes( + &mut instruction_data[2..34], + pubkey_as_slice(self.mint_authority), + ); if let Some(freeze_auth) = self.freeze_authority { // Set Option = `true` & freeze_authority at offset [34..67] write_bytes(&mut instruction_data[34..35], &[1]); - write_bytes(&mut instruction_data[35..], freeze_auth); + write_bytes(&mut instruction_data[35..], pubkey_as_slice(freeze_auth)); } else { // Set Option = `false` write_bytes(&mut instruction_data[34..35], &[0]); diff --git a/programs/token-2022/src/instructions/set_authority.rs b/programs/token-2022/src/instructions/set_authority.rs index 060771f3..072ff7e0 100644 --- a/programs/token-2022/src/instructions/set_authority.rs +++ b/programs/token-2022/src/instructions/set_authority.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - #[repr(u8)] #[derive(Clone, Copy)] pub enum AuthorityType { @@ -67,7 +67,7 @@ impl SetAuthority<'_, '_> { if let Some(new_authority) = self.new_authority { // Set new_authority as [u8; 32] at offset [2..35] write_bytes(&mut instruction_data[2..3], &[1]); - write_bytes(&mut instruction_data[3..], new_authority); + write_bytes(&mut instruction_data[3..], pubkey_as_slice(new_authority)); } else { write_bytes(&mut instruction_data[2..3], &[0]); // Adjust length if no new authority diff --git a/programs/token/src/instructions/initialize_account_2.rs b/programs/token/src/instructions/initialize_account_2.rs index 26cdfbdb..b8f7c719 100644 --- a/programs/token/src/instructions/initialize_account_2.rs +++ b/programs/token/src/instructions/initialize_account_2.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new Token Account. /// /// ### Accounts: @@ -45,7 +45,7 @@ impl InitializeAccount2<'_> { // Set discriminator as u8 at offset [0] write_bytes(&mut instruction_data, &[16]); // Set owner as [u8; 32] at offset [1..33] - write_bytes(&mut instruction_data[1..], self.owner); + write_bytes(&mut instruction_data[1..], pubkey_as_slice(self.owner)); let instruction = Instruction { program_id: &crate::ID, diff --git a/programs/token/src/instructions/initialize_account_3.rs b/programs/token/src/instructions/initialize_account_3.rs index 54f39406..4c4a90c2 100644 --- a/programs/token/src/instructions/initialize_account_3.rs +++ b/programs/token/src/instructions/initialize_account_3.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new Token Account. /// /// ### Accounts: @@ -41,7 +41,7 @@ impl InitializeAccount3<'_> { // Set discriminator as u8 at offset [0] write_bytes(&mut instruction_data, &[18]); // Set owner as [u8; 32] at offset [1..33] - write_bytes(&mut instruction_data[1..], self.owner); + write_bytes(&mut instruction_data[1..], pubkey_as_slice(self.owner)); let instruction = Instruction { program_id: &crate::ID, diff --git a/programs/token/src/instructions/initialize_mint.rs b/programs/token/src/instructions/initialize_mint.rs index 0a4fbf86..a47d5640 100644 --- a/programs/token/src/instructions/initialize_mint.rs +++ b/programs/token/src/instructions/initialize_mint.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new mint. /// /// ### Accounts: @@ -51,12 +51,15 @@ impl InitializeMint<'_> { // Set decimals as u8 at offset [1] write_bytes(&mut instruction_data[1..2], &[self.decimals]); // Set mint_authority as Pubkey at offset [2..34] - write_bytes(&mut instruction_data[2..34], self.mint_authority); + write_bytes( + &mut instruction_data[2..34], + pubkey_as_slice(self.mint_authority), + ); if let Some(freeze_auth) = self.freeze_authority { // Set Option = `true` & freeze_authority at offset [34..67] write_bytes(&mut instruction_data[34..35], &[1]); - write_bytes(&mut instruction_data[35..], freeze_auth); + write_bytes(&mut instruction_data[35..], pubkey_as_slice(freeze_auth)); } else { // Set Option = `false` write_bytes(&mut instruction_data[34..35], &[0]); diff --git a/programs/token/src/instructions/initialize_mint_2.rs b/programs/token/src/instructions/initialize_mint_2.rs index d8e065c6..d5564a4f 100644 --- a/programs/token/src/instructions/initialize_mint_2.rs +++ b/programs/token/src/instructions/initialize_mint_2.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, cpi::invoke, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - /// Initialize a new mint. /// /// ### Accounts: @@ -45,12 +45,15 @@ impl InitializeMint2<'_> { // Set decimals as u8 at offset [1] write_bytes(&mut instruction_data[1..2], &[self.decimals]); // Set mint_authority as Pubkey at offset [2..34] - write_bytes(&mut instruction_data[2..34], self.mint_authority); + write_bytes( + &mut instruction_data[2..34], + pubkey_as_slice(self.mint_authority), + ); if let Some(freeze_auth) = self.freeze_authority { // Set Option = `true` & freeze_authority at offset [34..67] write_bytes(&mut instruction_data[34..35], &[1]); - write_bytes(&mut instruction_data[35..], freeze_auth); + write_bytes(&mut instruction_data[35..], pubkey_as_slice(freeze_auth)); } else { // Set Option = `false` write_bytes(&mut instruction_data[34..35], &[0]); diff --git a/programs/token/src/instructions/set_authority.rs b/programs/token/src/instructions/set_authority.rs index 94108bb7..4e9a2fb3 100644 --- a/programs/token/src/instructions/set_authority.rs +++ b/programs/token/src/instructions/set_authority.rs @@ -1,5 +1,7 @@ use core::slice::from_raw_parts; +use crate::{write_bytes, UNINIT_BYTE}; +use pinocchio::pubkey::pubkey_as_slice; use pinocchio::{ account_info::AccountInfo, instruction::{AccountMeta, Instruction, Signer}, @@ -8,8 +10,6 @@ use pinocchio::{ ProgramResult, }; -use crate::{write_bytes, UNINIT_BYTE}; - #[repr(u8)] #[derive(Clone, Copy)] pub enum AuthorityType { @@ -65,7 +65,7 @@ impl SetAuthority<'_> { if let Some(new_authority) = self.new_authority { // Set new_authority as [u8; 32] at offset [2..35] write_bytes(&mut instruction_data[2..3], &[1]); - write_bytes(&mut instruction_data[3..], new_authority); + write_bytes(&mut instruction_data[3..], pubkey_as_slice(new_authority)); } else { write_bytes(&mut instruction_data[2..3], &[0]); // Adjust length if no new authority diff --git a/sdk/pinocchio/Cargo.toml b/sdk/pinocchio/Cargo.toml index f327b4b0..b6713e99 100644 --- a/sdk/pinocchio/Cargo.toml +++ b/sdk/pinocchio/Cargo.toml @@ -19,6 +19,10 @@ unexpected_cfgs = { level = "warn", check-cfg = [ [features] std = [] +solana-address = ["dep:solana-address"] + +[dependencies] +solana-address = { workspace = true, optional = true } [dev-dependencies] five8_const = { workspace = true } diff --git a/sdk/pinocchio/src/entrypoint/mod.rs b/sdk/pinocchio/src/entrypoint/mod.rs index 6422566f..e0cd3aaf 100644 --- a/sdk/pinocchio/src/entrypoint/mod.rs +++ b/sdk/pinocchio/src/entrypoint/mod.rs @@ -692,16 +692,16 @@ unsafe impl GlobalAlloc for NoAllocator { mod tests { extern crate std; + use super::*; + use crate::pubkey::{pubkey_as_slice, pubkey_from_bytes}; use core::{alloc::Layout, ptr::copy_nonoverlapping}; use std::{ alloc::{alloc, dealloc}, vec, }; - use super::*; - /// The mock program ID used for testing. - const MOCK_PROGRAM_ID: Pubkey = [5u8; 32]; + const MOCK_PROGRAM_ID: Pubkey = pubkey_from_bytes([5u8; 32]); /// An uninitialized account info. const UNINIT: MaybeUninit = MaybeUninit::::uninit(); @@ -784,7 +784,7 @@ mod tests { input.write(instruction_data, offset); offset += instruction_data.len(); // Program ID (mock). - input.write(&MOCK_PROGRAM_ID, offset); + input.write(pubkey_as_slice(&MOCK_PROGRAM_ID), offset); input } @@ -847,7 +847,7 @@ mod tests { input.write(instruction_data, offset); offset += instruction_data.len(); // Program ID (mock). - input.write(&MOCK_PROGRAM_ID, offset); + input.write(pubkey_as_slice(&MOCK_PROGRAM_ID), offset); input } diff --git a/sdk/pinocchio/src/pubkey.rs b/sdk/pinocchio/src/pubkey.rs index 796cdd75..2f592ca4 100644 --- a/sdk/pinocchio/src/pubkey.rs +++ b/sdk/pinocchio/src/pubkey.rs @@ -21,7 +21,47 @@ pub const PDA_MARKER: &[u8; 21] = b"ProgramDerivedAddress"; /// The address of a [Solana account][account]. /// /// [account]: https://solana.com/docs/core/accounts +#[cfg(not(feature = "solana-address"))] pub type Pubkey = [u8; PUBKEY_BYTES]; +#[cfg(feature = "solana-address")] +pub use solana_address::Address as Pubkey; + +/// Create a `Pubkey` from a byte array. Will use the correct type of `Pubkey` depending on the features enabled. +#[inline(always)] +pub const fn pubkey_from_bytes(bytes: [u8; PUBKEY_BYTES]) -> Pubkey { + #[cfg(feature = "solana-address")] + { + Pubkey::new_from_array(bytes) + } + #[cfg(not(feature = "solana-address"))] + { + bytes + } +} + +#[inline(always)] +pub const fn pubkey_ref_from_slice(bytes: &[u8; PUBKEY_BYTES]) -> &Pubkey { + #[cfg(feature = "solana-address")] + { + unsafe { &*(bytes.as_ptr() as *const solana_address::Address) } + } + #[cfg(not(feature = "solana-address"))] + { + bytes + } +} + +#[inline(always)] +pub const fn pubkey_as_slice(pubkey: &Pubkey) -> &[u8; PUBKEY_BYTES] { + #[cfg(feature = "solana-address")] + { + pubkey.as_array() + } + #[cfg(not(feature = "solana-address"))] + { + pubkey + } +} /// Log a `Pubkey` from a program. #[inline(always)] @@ -35,6 +75,11 @@ pub fn log(pubkey: &Pubkey) { core::hint::black_box(pubkey); } +#[inline(always)] +pub fn log_bytes(bytes: &[u8; PUBKEY_BYTES]) { + log(pubkey_ref_from_slice(bytes)) +} + /// Compare two `Pubkey`s for equality. /// /// The implementation of this function is currently more efficient @@ -42,8 +87,8 @@ pub fn log(pubkey: &Pubkey) { /// byte-by-byte. #[inline(always)] pub const fn pubkey_eq(p1: &Pubkey, p2: &Pubkey) -> bool { - let p1_ptr = p1.as_ptr() as *const u64; - let p2_ptr = p2.as_ptr() as *const u64; + let p1_ptr = pubkey_as_slice(p1).as_ptr() as *const u64; + let p2_ptr = pubkey_as_slice(p2).as_ptr() as *const u64; unsafe { read_unaligned(p1_ptr) == read_unaligned(p2_ptr) @@ -269,7 +314,7 @@ pub fn create_with_seed( return Err(ProgramError::MaxSeedLengthExceeded); } - if program_id.ends_with(PDA_MARKER) { + if pubkey_as_slice(program_id).ends_with(PDA_MARKER) { return Err(ProgramError::IllegalOwner); } @@ -300,20 +345,20 @@ pub fn create_with_seed( #[cfg(test)] mod tests { - use crate::pubkey::{pubkey_eq, Pubkey, PUBKEY_BYTES}; + use crate::pubkey::{pubkey_eq, pubkey_from_bytes, Pubkey, PUBKEY_BYTES}; #[test] fn test_pubkey_eq_matches_default_eq() { for i in 0..u8::MAX { - let p1: Pubkey = [i; PUBKEY_BYTES]; - let p2: Pubkey = [i; PUBKEY_BYTES]; + let p1: Pubkey = pubkey_from_bytes([i; PUBKEY_BYTES]); + let p2: Pubkey = pubkey_from_bytes([i; PUBKEY_BYTES]); assert_eq!(pubkey_eq(&p1, &p2), p1 == p2); } for i in 0..u8::MAX { - let p1: Pubkey = [i; PUBKEY_BYTES]; - let p2: Pubkey = [u8::MAX - i; PUBKEY_BYTES]; + let p1: Pubkey = pubkey_from_bytes([i; PUBKEY_BYTES]); + let p2: Pubkey = pubkey_from_bytes([u8::MAX - i; PUBKEY_BYTES]); assert_eq!(!pubkey_eq(&p1, &p2), p1 != p2); } diff --git a/sdk/pinocchio/src/sysvars/clock.rs b/sdk/pinocchio/src/sysvars/clock.rs index 7ac94c71..c199abc6 100644 --- a/sdk/pinocchio/src/sysvars/clock.rs +++ b/sdk/pinocchio/src/sysvars/clock.rs @@ -6,14 +6,14 @@ use crate::{ hint::unlikely, impl_sysvar_get, program_error::ProgramError, - pubkey::{pubkey_eq, Pubkey}, + pubkey::{pubkey_eq, pubkey_from_bytes, Pubkey}, }; /// The ID of the clock sysvar. -pub const CLOCK_ID: Pubkey = [ +pub const CLOCK_ID: Pubkey = pubkey_from_bytes([ 6, 167, 213, 23, 24, 199, 116, 201, 40, 86, 99, 152, 105, 29, 94, 182, 139, 94, 184, 163, 155, 75, 109, 92, 115, 85, 91, 33, 0, 0, 0, 0, -]; +]); /// The unit of time given to a leader for encoding a block. /// diff --git a/sdk/pinocchio/src/sysvars/instructions.rs b/sdk/pinocchio/src/sysvars/instructions.rs index a17ca923..920ec0c3 100644 --- a/sdk/pinocchio/src/sysvars/instructions.rs +++ b/sdk/pinocchio/src/sysvars/instructions.rs @@ -2,16 +2,16 @@ use crate::{ account_info::{AccountInfo, Ref}, instruction::AccountMeta, program_error::ProgramError, - pubkey::{Pubkey, PUBKEY_BYTES}, + pubkey::{pubkey_from_bytes, Pubkey, PUBKEY_BYTES}, }; use core::{marker::PhantomData, mem::size_of, ops::Deref}; /// Instructions sysvar ID `Sysvar1nstructions1111111111111111111111111`. -pub const INSTRUCTIONS_ID: Pubkey = [ +pub const INSTRUCTIONS_ID: Pubkey = pubkey_from_bytes([ 0x06, 0xa7, 0xd5, 0x17, 0x18, 0x7b, 0xd1, 0x66, 0x35, 0xda, 0xd4, 0x04, 0x55, 0xfd, 0xc2, 0xc0, 0xc1, 0x24, 0xc6, 0x8f, 0x21, 0x56, 0x75, 0xa5, 0xdb, 0xba, 0xcb, 0x5f, 0x08, 0x00, 0x00, 0x00, -]; +]); #[derive(Clone, Copy, Debug)] pub struct Instructions diff --git a/sdk/pinocchio/src/sysvars/rent.rs b/sdk/pinocchio/src/sysvars/rent.rs index 479823f1..16c3dc34 100644 --- a/sdk/pinocchio/src/sysvars/rent.rs +++ b/sdk/pinocchio/src/sysvars/rent.rs @@ -8,14 +8,14 @@ use crate::{ hint::unlikely, impl_sysvar_get, program_error::ProgramError, - pubkey::{pubkey_eq, Pubkey}, + pubkey::{pubkey_eq, pubkey_from_bytes, Pubkey}, }; /// The ID of the rent sysvar. -pub const RENT_ID: Pubkey = [ +pub const RENT_ID: Pubkey = pubkey_from_bytes([ 6, 167, 213, 23, 25, 44, 92, 81, 33, 140, 201, 76, 61, 74, 241, 127, 88, 218, 238, 8, 155, 161, 253, 68, 227, 219, 217, 138, 0, 0, 0, 0, -]; +]); /// Default rental rate in lamports/byte-year. /// diff --git a/sdk/pinocchio/src/sysvars/slot_hashes/mod.rs b/sdk/pinocchio/src/sysvars/slot_hashes/mod.rs index ed35f57e..4b094f27 100644 --- a/sdk/pinocchio/src/sysvars/slot_hashes/mod.rs +++ b/sdk/pinocchio/src/sysvars/slot_hashes/mod.rs @@ -17,7 +17,7 @@ use crate::{ account_info::{AccountInfo, Ref}, hint::unlikely, program_error::ProgramError, - pubkey::{pubkey_eq, Pubkey}, + pubkey::{pubkey_eq, pubkey_from_bytes, Pubkey}, sysvars::clock::Slot, }; use core::{mem, ops::Deref, slice::from_raw_parts}; @@ -25,10 +25,10 @@ use core::{mem, ops::Deref, slice::from_raw_parts}; use std::boxed::Box; /// `SysvarS1otHashes111111111111111111111111111` -pub const SLOTHASHES_ID: Pubkey = [ +pub const SLOTHASHES_ID: Pubkey = pubkey_from_bytes([ 6, 167, 213, 23, 25, 47, 10, 175, 198, 242, 101, 227, 251, 119, 204, 122, 218, 130, 197, 41, 208, 190, 59, 19, 110, 45, 0, 85, 32, 0, 0, 0, -]; +]); /// Number of bytes in a hash. pub const HASH_BYTES: usize = 32; /// Sysvar data is: @@ -68,7 +68,7 @@ pub struct SlotHashes> { /// Log a `Hash` from a program. pub fn log(hash: &Hash) { - crate::pubkey::log(hash); + crate::pubkey::log_bytes(hash); } /// Reads the entry count from the first 8 bytes of data. diff --git a/sdk/pinocchio/src/sysvars/slot_hashes/test.rs b/sdk/pinocchio/src/sysvars/slot_hashes/test.rs index 269c3c47..671bcdee 100644 --- a/sdk/pinocchio/src/sysvars/slot_hashes/test.rs +++ b/sdk/pinocchio/src/sysvars/slot_hashes/test.rs @@ -10,6 +10,7 @@ use core::{ }; extern crate std; +use crate::pubkey::pubkey_as_slice; use std::io::Write; use std::vec::Vec; @@ -24,10 +25,10 @@ fn test_layout_constants() { assert_eq!(align_of::(), align_of::<[u8; 8]>()); assert_eq!( SLOTHASHES_ID, - [ + pubkey_from_bytes([ 6, 167, 213, 23, 25, 47, 10, 175, 198, 242, 101, 227, 251, 119, 204, 122, 218, 130, 197, 41, 208, 190, 59, 19, 110, 45, 0, 85, 32, 0, 0, 0, - ] + ]) ); pub fn check_base58(input_bytes: &[u8], expected_b58: &str) { @@ -35,7 +36,7 @@ fn test_layout_constants() { } check_base58( - &SLOTHASHES_ID, + pubkey_as_slice(&SLOTHASHES_ID), "SysvarS1otHashes111111111111111111111111111", ); } @@ -430,7 +431,7 @@ fn test_from_account_info_constructor() { executable: 0, resize_delta: 0, key: SLOTHASHES_ID, - owner: [0u8; 32], + owner: pubkey_from_bytes([0u8; 32]), lamports: 0, data_len: data.len() as u64, }, diff --git a/sdk/pinocchio/src/sysvars/slot_hashes/test_edge.rs b/sdk/pinocchio/src/sysvars/slot_hashes/test_edge.rs index 4990996c..e19f122c 100644 --- a/sdk/pinocchio/src/sysvars/slot_hashes/test_edge.rs +++ b/sdk/pinocchio/src/sysvars/slot_hashes/test_edge.rs @@ -5,8 +5,13 @@ use super::test_utils::{build_slot_hashes_bytes as raw_slot_hashes, make_account #[test] fn test_wrong_key_from_account_info() { let bytes = raw_slot_hashes(0, &[]); - let (info, _backing) = - unsafe { make_account_info([1u8; 32], &bytes, crate::entrypoint::NON_DUP_MARKER) }; + let (info, _backing) = unsafe { + make_account_info( + pubkey_from_bytes([1u8; 32]), + &bytes, + crate::entrypoint::NON_DUP_MARKER, + ) + }; assert!(matches!( SlotHashes::from_account_info(&info), Err(ProgramError::InvalidArgument) diff --git a/sdk/pinocchio/src/sysvars/slot_hashes/test_utils.rs b/sdk/pinocchio/src/sysvars/slot_hashes/test_utils.rs index f8753e30..508bf8e7 100644 --- a/sdk/pinocchio/src/sysvars/slot_hashes/test_utils.rs +++ b/sdk/pinocchio/src/sysvars/slot_hashes/test_utils.rs @@ -140,7 +140,7 @@ pub unsafe fn make_account_info( executable: 0, resize_delta: 0, key, - owner: [0u8; 32], + owner: pubkey_from_bytes([0u8; 32]), lamports: 0, data_len: data.len() as u64, }, @@ -181,8 +181,8 @@ fn test_account_layout_compatibility() { is_writable: 1, executable: 0, resize_delta: 100, - key: [1u8; 32], - owner: [2u8; 32], + key: pubkey_from_bytes([1u8; 32]), + owner: pubkey_from_bytes([2u8; 32]), lamports: 1000, data_len: 256, }; diff --git a/sdk/pubkey/src/lib.rs b/sdk/pubkey/src/lib.rs index 18f096c4..fcfa9c86 100644 --- a/sdk/pubkey/src/lib.rs +++ b/sdk/pubkey/src/lib.rs @@ -10,7 +10,7 @@ pub mod reexport { use core::mem::MaybeUninit; #[cfg(feature = "const")] pub use five8_const::decode_32_const; -use pinocchio::pubkey::{Pubkey, MAX_SEEDS, PDA_MARKER}; +use pinocchio::pubkey::{pubkey_as_slice, pubkey_from_bytes, Pubkey, MAX_SEEDS, PDA_MARKER}; #[cfg(target_os = "solana")] use pinocchio::syscalls::sol_sha256; #[cfg(feature = "const")] @@ -143,13 +143,20 @@ pub const fn derive_address_const( // TODO: replace this with `is_some` when the MSRV is upgraded // to `1.84.0+`. if let Some(bump) = bump { - hasher - .update(&[bump]) - .update(program_id) - .update(PDA_MARKER) - .finalize() + pubkey_from_bytes( + hasher + .update(&[bump]) + .update(pubkey_as_slice(program_id)) + .update(PDA_MARKER) + .finalize(), + ) } else { - hasher.update(program_id).update(PDA_MARKER).finalize() + pubkey_from_bytes( + hasher + .update(pubkey_as_slice(program_id)) + .update(PDA_MARKER) + .finalize(), + ) } } @@ -191,5 +198,5 @@ macro_rules! declare_id { #[cfg(feature = "const")] #[inline(always)] pub const fn from_str(value: &str) -> Pubkey { - decode_32_const(value) + pubkey_from_bytes(decode_32_const(value)) } From 484feec4cad65eb19c5b3d12d73202335a3c280d Mon Sep 17 00:00:00 2001 From: Brett Etter Date: Mon, 15 Sep 2025 14:00:18 -0500 Subject: [PATCH 2/2] Added `solana-program2` feature --- Cargo.lock | 421 +++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + sdk/pinocchio/Cargo.toml | 4 +- sdk/pinocchio/src/pubkey.rs | 39 ++-- 4 files changed, 450 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1109e711..04a83354 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,68 @@ dependencies = [ "memchr", ] +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "five8" version = "0.2.1" @@ -35,18 +97,112 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "js-sys" +version = "0.3.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "pinocchio" version = "0.9.2" dependencies = [ "five8_const", "solana-address", + "solana-pubkey", ] [[package]] @@ -70,7 +226,7 @@ version = "0.5.0" dependencies = [ "quote", "regex", - "syn", + "syn 1.0.109", ] [[package]] @@ -132,6 +288,15 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.11.1" @@ -161,12 +326,41 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2-const-stable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + [[package]] name = "solana-address" version = "1.0.0" @@ -178,12 +372,85 @@ dependencies = [ "solana-program-error", ] +[[package]] +name = "solana-atomic-u64" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-decode-error" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" + +[[package]] +name = "solana-hash" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "five8", + "js-sys", + "solana-atomic-u64", + "solana-sanitize", + "wasm-bindgen", +] + [[package]] name = "solana-program-error" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" +[[package]] +name = "solana-pubkey" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" +dependencies = [ + "five8", + "five8_const", + "getrandom", + "js-sys", + "num-traits", + "solana-atomic-u64", + "solana-decode-error", + "solana-define-syscall", + "solana-sanitize", + "solana-sha256-hasher", + "wasm-bindgen", +] + +[[package]] +name = "solana-sanitize" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" + +[[package]] +name = "solana-sha256-hasher" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" +dependencies = [ + "sha2", + "solana-define-syscall", + "solana-hash", +] + [[package]] name = "syn" version = "1.0.109" @@ -195,8 +462,160 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml index dd51cf70..84b5eb04 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ pinocchio-pubkey = { version = "0.3", path = "sdk/pubkey" } quote = "1.0" regex = "1" solana-address = { version = "1.0.0", features = ["decode"] } +solana-pubkey = { version = "2" } syn = "1.0" [workspace.metadata.cli] diff --git a/sdk/pinocchio/Cargo.toml b/sdk/pinocchio/Cargo.toml index b6713e99..03273733 100644 --- a/sdk/pinocchio/Cargo.toml +++ b/sdk/pinocchio/Cargo.toml @@ -19,10 +19,12 @@ unexpected_cfgs = { level = "warn", check-cfg = [ [features] std = [] -solana-address = ["dep:solana-address"] +solana-address1 = ["dep:solana-address"] +solana-pubkey2 = ["dep:solana-pubkey"] [dependencies] solana-address = { workspace = true, optional = true } +solana-pubkey = { workspace = true, optional = true } [dev-dependencies] five8_const = { workspace = true } diff --git a/sdk/pinocchio/src/pubkey.rs b/sdk/pinocchio/src/pubkey.rs index 2f592ca4..208cedd5 100644 --- a/sdk/pinocchio/src/pubkey.rs +++ b/sdk/pinocchio/src/pubkey.rs @@ -21,45 +21,58 @@ pub const PDA_MARKER: &[u8; 21] = b"ProgramDerivedAddress"; /// The address of a [Solana account][account]. /// /// [account]: https://solana.com/docs/core/accounts -#[cfg(not(feature = "solana-address"))] +#[cfg(not(any(feature = "solana-address1", feature = "solana-pubkey2")))] pub type Pubkey = [u8; PUBKEY_BYTES]; -#[cfg(feature = "solana-address")] +#[cfg(feature = "solana-address1")] pub use solana_address::Address as Pubkey; +#[cfg(feature = "solana-pubkey2")] +pub use solana_pubkey::Pubkey; + +#[cfg(all(feature = "solana-pubkey2", feature = "solana-address1"))] +compile_error!("Cannot enable both `solana-pubkey` and `solana-address` features"); /// Create a `Pubkey` from a byte array. Will use the correct type of `Pubkey` depending on the features enabled. #[inline(always)] pub const fn pubkey_from_bytes(bytes: [u8; PUBKEY_BYTES]) -> Pubkey { - #[cfg(feature = "solana-address")] + #[cfg(not(any(feature = "solana-address1", feature = "solana-pubkey2")))] { - Pubkey::new_from_array(bytes) + bytes } - #[cfg(not(feature = "solana-address"))] + + #[cfg(any(feature = "solana-address1", feature = "solana-pubkey2"))] { - bytes + Pubkey::new_from_array(bytes) } } #[inline(always)] pub const fn pubkey_ref_from_slice(bytes: &[u8; PUBKEY_BYTES]) -> &Pubkey { - #[cfg(feature = "solana-address")] + #[cfg(not(any(feature = "solana-address1", feature = "solana-pubkey2")))] + { + bytes + } + + #[cfg(feature = "solana-address1")] { unsafe { &*(bytes.as_ptr() as *const solana_address::Address) } } - #[cfg(not(feature = "solana-address"))] + + #[cfg(feature = "solana-pubkey2")] { - bytes + unsafe { &*(bytes.as_ptr() as *const solana_pubkey::Pubkey) } } } #[inline(always)] pub const fn pubkey_as_slice(pubkey: &Pubkey) -> &[u8; PUBKEY_BYTES] { - #[cfg(feature = "solana-address")] + #[cfg(not(any(feature = "solana-address1", feature = "solana-pubkey2")))] { - pubkey.as_array() + pubkey } - #[cfg(not(feature = "solana-address"))] + + #[cfg(any(feature = "solana-address1", feature = "solana-pubkey2"))] { - pubkey + pubkey.as_array() } }