From 38ff47282b4daf3b6f1ae29b46ecdb2c2ef79471 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Thu, 31 Oct 2024 22:03:44 +0400 Subject: [PATCH] remove solana-program from tlv-account-resolution --- Cargo.lock | 10 +- libraries/tlv-account-resolution/Cargo.toml | 10 +- libraries/tlv-account-resolution/README.md | 4 +- .../tlv-account-resolution/src/account.rs | 10 +- libraries/tlv-account-resolution/src/error.rs | 99 ++++++++++++++++++- libraries/tlv-account-resolution/src/lib.rs | 5 +- .../tlv-account-resolution/src/pubkey_data.rs | 2 +- libraries/tlv-account-resolution/src/seeds.rs | 2 +- libraries/tlv-account-resolution/src/state.rs | 72 +++++++------- 9 files changed, 162 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9dc064bbd7c..e03939bdac1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8411,15 +8411,23 @@ dependencies = [ "bytemuck", "futures 0.3.31", "futures-util", + "num-derive", + "num-traits", "serde", + "solana-account-info", "solana-client", - "solana-program", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", "solana-program-test", + "solana-pubkey", "solana-sdk", "spl-discriminator 0.3.0", "spl-pod 0.4.0", "spl-program-error 0.5.0", "spl-type-length-value 0.6.0", + "thiserror", ] [[package]] diff --git a/libraries/tlv-account-resolution/Cargo.toml b/libraries/tlv-account-resolution/Cargo.toml index a3941a5f497..f755932852a 100644 --- a/libraries/tlv-account-resolution/Cargo.toml +++ b/libraries/tlv-account-resolution/Cargo.toml @@ -13,12 +13,20 @@ test-sbf = [] [dependencies] bytemuck = { version = "1.19.0", features = ["derive"] } +num-derive = "0.4" +num-traits = "0.2" serde = { version = "1.0.214", optional = true } -solana-program = "2.1.0" +solana-account-info = "2.1.0" +solana-decode-error = "2.1.0" +solana-instruction = { version = "2.1.0", features = ["std"] } +solana-program-error = "2.1.0" +solana-msg = "2.1.0" +solana-pubkey = "2.1.0" spl-discriminator = { version = "0.3.0", path = "../discriminator" } spl-program-error = { version = "0.5.0", path = "../program-error" } spl-pod = { version = "0.4.0", path = "../pod" } spl-type-length-value = { version = "0.6.0", path = "../type-length-value" } +thiserror = "1.0" [dev-dependencies] futures = "0.3.31" diff --git a/libraries/tlv-account-resolution/README.md b/libraries/tlv-account-resolution/README.md index 58a4bc7a269..2b7dd2d0d09 100644 --- a/libraries/tlv-account-resolution/README.md +++ b/libraries/tlv-account-resolution/README.md @@ -10,7 +10,9 @@ into a TLV entry in an account, you can do the following: ```rust use { - solana_program::{account_info::AccountInfo, instruction::{AccountMeta, Instruction}, pubkey::Pubkey}, + solana_account_info::AccountInfo, + solana_instruction::{AccountMeta, Instruction}, + solana_pubkey::Pubkey spl_discriminator::{ArrayDiscriminator, SplDiscriminate}, spl_tlv_account_resolution::{ account::ExtraAccountMeta, diff --git a/libraries/tlv-account-resolution/src/account.rs b/libraries/tlv-account-resolution/src/account.rs index 86575793a95..91305680773 100644 --- a/libraries/tlv-account-resolution/src/account.rs +++ b/libraries/tlv-account-resolution/src/account.rs @@ -6,12 +6,10 @@ use { crate::{error::AccountResolutionError, pubkey_data::PubkeyData, seeds::Seed}, bytemuck::{Pod, Zeroable}, - solana_program::{ - account_info::AccountInfo, - instruction::AccountMeta, - program_error::ProgramError, - pubkey::{Pubkey, PUBKEY_BYTES}, - }, + solana_account_info::AccountInfo, + solana_instruction::AccountMeta, + solana_program_error::ProgramError, + solana_pubkey::{Pubkey, PUBKEY_BYTES}, spl_pod::primitives::PodBool, }; diff --git a/libraries/tlv-account-resolution/src/error.rs b/libraries/tlv-account-resolution/src/error.rs index 03aeaeba709..919fe603415 100644 --- a/libraries/tlv-account-resolution/src/error.rs +++ b/libraries/tlv-account-resolution/src/error.rs @@ -1,13 +1,18 @@ //! Error types -use spl_program_error::*; +use { + solana_decode_error::DecodeError, + solana_msg::msg, + solana_program_error::{PrintProgramError, ProgramError}, +}; /// Errors that may be returned by the Account Resolution library. -#[spl_program_error(hash_error_code_start = 2_724_315_840)] +#[repr(u32)] +#[derive(Clone, Debug, Eq, thiserror::Error, num_derive::FromPrimitive, PartialEq)] pub enum AccountResolutionError { /// Incorrect account provided #[error("Incorrect account provided")] - IncorrectAccount, + IncorrectAccount = 2_724_315_840, /// Not enough accounts provided #[error("Not enough accounts provided")] NotEnoughAccounts, @@ -70,3 +75,91 @@ pub enum AccountResolutionError { #[error("Tried to pack an invalid pubkey data configuration")] InvalidPubkeyDataConfig, } + +impl From for ProgramError { + fn from(e: AccountResolutionError) -> Self { + ProgramError::Custom(e as u32) + } +} + +impl DecodeError for AccountResolutionError { + fn type_of() -> &'static str { + "AccountResolutionError" + } +} + +impl PrintProgramError for AccountResolutionError { + fn print(&self) + where + E: 'static + + std::error::Error + + DecodeError + + PrintProgramError + + num_traits::FromPrimitive, + { + match self { + AccountResolutionError::IncorrectAccount => { + msg!("Incorrect account provided") + } + AccountResolutionError::NotEnoughAccounts => { + msg!("Not enough accounts provided") + } + AccountResolutionError::TlvUninitialized => { + msg!("No value initialized in TLV data") + } + AccountResolutionError::TlvInitialized => { + msg!("Some value initialized in TLV data") + } + AccountResolutionError::TooManyPubkeys => { + msg!("Too many pubkeys provided") + } + AccountResolutionError::InvalidPubkey => { + msg!("Failed to parse `Pubkey` from bytes") + } + AccountResolutionError::AccountTypeNotAccountMeta => { + msg!( + "Attempted to deserialize an `AccountMeta` but the underlying type has PDA configs rather than a fixed address", + ) + } + AccountResolutionError::SeedConfigsTooLarge => { + msg!("Provided list of seed configurations too large for a validation account",) + } + AccountResolutionError::NotEnoughBytesForSeed => { + msg!("Not enough bytes available to pack seed configuration",) + } + AccountResolutionError::InvalidBytesForSeed => { + msg!("The provided bytes are not valid for a seed configuration",) + } + AccountResolutionError::InvalidSeedConfig => { + msg!("Tried to pack an invalid seed configuration",) + } + AccountResolutionError::InstructionDataTooSmall => { + msg!("Instruction data too small for seed configuration",) + } + AccountResolutionError::AccountNotFound => { + msg!("Could not find account at specified index",) + } + AccountResolutionError::CalculationFailure => { + msg!("Error in checked math operation") + } + AccountResolutionError::AccountDataNotFound => { + msg!("Could not find account data at specified index",) + } + AccountResolutionError::AccountDataTooSmall => { + msg!("Account data too small for requested seed configuration",) + } + AccountResolutionError::AccountFetchFailed => { + msg!("Failed to fetch account") + } + AccountResolutionError::NotEnoughBytesForPubkeyData => { + msg!("Not enough bytes available to pack pubkey data configuration",) + } + AccountResolutionError::InvalidBytesForPubkeyData => { + msg!("The provided bytes are not valid for a pubkey data configuration",) + } + AccountResolutionError::InvalidPubkeyDataConfig => { + msg!("Tried to pack an invalid pubkey data configuration",) + } + } + } +} diff --git a/libraries/tlv-account-resolution/src/lib.rs b/libraries/tlv-account-resolution/src/lib.rs index 5fbe38d1f70..e015fc972ec 100644 --- a/libraries/tlv-account-resolution/src/lib.rs +++ b/libraries/tlv-account-resolution/src/lib.rs @@ -15,4 +15,7 @@ pub mod state; // Export current sdk types for downstream users building with a different sdk // version -pub use solana_program; +pub use { + solana_account_info, solana_decode_error, solana_instruction, solana_msg, solana_program_error, + solana_pubkey, +}; diff --git a/libraries/tlv-account-resolution/src/pubkey_data.rs b/libraries/tlv-account-resolution/src/pubkey_data.rs index 6585ba5c38a..033d72f3a90 100644 --- a/libraries/tlv-account-resolution/src/pubkey_data.rs +++ b/libraries/tlv-account-resolution/src/pubkey_data.rs @@ -6,7 +6,7 @@ #[cfg(feature = "serde-traits")] use serde::{Deserialize, Serialize}; -use {crate::error::AccountResolutionError, solana_program::program_error::ProgramError}; +use {crate::error::AccountResolutionError, solana_program_error::ProgramError}; /// Enum to describe a required key stored in some data. #[derive(Clone, Debug, PartialEq)] diff --git a/libraries/tlv-account-resolution/src/seeds.rs b/libraries/tlv-account-resolution/src/seeds.rs index a3936ae8134..1f51128e30f 100644 --- a/libraries/tlv-account-resolution/src/seeds.rs +++ b/libraries/tlv-account-resolution/src/seeds.rs @@ -29,7 +29,7 @@ #[cfg(feature = "serde-traits")] use serde::{Deserialize, Serialize}; -use {crate::error::AccountResolutionError, solana_program::program_error::ProgramError}; +use {crate::error::AccountResolutionError, solana_program_error::ProgramError}; /// Enum to describe a required seed for a Program-Derived Address #[derive(Clone, Debug, PartialEq)] diff --git a/libraries/tlv-account-resolution/src/state.rs b/libraries/tlv-account-resolution/src/state.rs index 16230521251..f17ee3d06fb 100644 --- a/libraries/tlv-account-resolution/src/state.rs +++ b/libraries/tlv-account-resolution/src/state.rs @@ -2,12 +2,10 @@ use { crate::{account::ExtraAccountMeta, error::AccountResolutionError}, - solana_program::{ - account_info::AccountInfo, - instruction::{AccountMeta, Instruction}, - program_error::ProgramError, - pubkey::Pubkey, - }, + solana_account_info::AccountInfo, + solana_instruction::{AccountMeta, Instruction}, + solana_program_error::ProgramError, + solana_pubkey::Pubkey, spl_discriminator::SplDiscriminate, spl_pod::slice::{PodSlice, PodSliceMut}, spl_type_length_value::state::{TlvState, TlvStateBorrowed, TlvStateMut}, @@ -70,10 +68,9 @@ fn de_escalate_account_meta(account_meta: &mut AccountMeta, account_metas: &[Acc /// use { /// futures_util::TryFutureExt, /// solana_client::nonblocking::rpc_client::RpcClient, -/// solana_program::{ -/// account_info::AccountInfo, instruction::{AccountMeta, Instruction}, -/// pubkey::Pubkey -/// }, +/// solana_account_info::AccountInfo, +/// solana_instruction::{AccountMeta, Instruction}, +/// solana_pubkey::Pubkey, /// spl_discriminator::{ArrayDiscriminator, SplDiscriminate}, /// spl_tlv_account_resolution::{ /// account::ExtraAccountMeta, @@ -374,8 +371,9 @@ mod tests { use { super::*, crate::{pubkey_data::PubkeyData, seeds::Seed}, - solana_program::{clock::Epoch, instruction::AccountMeta, pubkey::Pubkey}, + solana_instruction::AccountMeta, solana_program_test::tokio, + solana_pubkey::Pubkey, spl_discriminator::{ArrayDiscriminator, SplDiscriminate}, std::collections::HashMap, }; @@ -467,7 +465,7 @@ mod tests { &mut data1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey2, @@ -477,7 +475,7 @@ mod tests { &mut data2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey3, @@ -487,7 +485,7 @@ mod tests { &mut data3, &owner, false, - Epoch::default(), + 0, ), ]; @@ -848,7 +846,7 @@ mod tests { &mut data1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey2, @@ -858,7 +856,7 @@ mod tests { &mut data2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey3, @@ -868,7 +866,7 @@ mod tests { &mut data3, &owner, false, - Epoch::default(), + 0, ), ]; @@ -1245,7 +1243,7 @@ mod tests { &mut data_ix_1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey_ix_2, @@ -1255,7 +1253,7 @@ mod tests { &mut data_ix_2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &extra_meta1.pubkey, @@ -1265,7 +1263,7 @@ mod tests { &mut data1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &extra_meta2.pubkey, @@ -1275,7 +1273,7 @@ mod tests { &mut data2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &extra_meta3.pubkey, @@ -1285,7 +1283,7 @@ mod tests { &mut data3, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_required_pda1_pubkey, @@ -1295,7 +1293,7 @@ mod tests { &mut data_pda1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_required_pda2_pubkey, @@ -1305,7 +1303,7 @@ mod tests { &mut data_pda2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_required_pda3_pubkey, @@ -1315,7 +1313,7 @@ mod tests { &mut data_pda3, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_required_pda4_pubkey, @@ -1325,7 +1323,7 @@ mod tests { &mut data_pda4, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_key_data1_pubkey, @@ -1335,7 +1333,7 @@ mod tests { &mut data_key_data1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_key_data2_pubkey, @@ -1345,7 +1343,7 @@ mod tests { &mut data_key_data2, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &check_key_data3_pubkey, @@ -1355,7 +1353,7 @@ mod tests { &mut data_key_data3, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey_arb_1, @@ -1365,7 +1363,7 @@ mod tests { &mut data_arb_1, &owner, false, - Epoch::default(), + 0, ), AccountInfo::new( &pubkey_arb_2, @@ -1375,7 +1373,7 @@ mod tests { &mut data_arb_2, &owner, false, - Epoch::default(), + 0, ), ]; @@ -1636,7 +1634,7 @@ mod tests { &mut data_ix_1, &owner, false, - Epoch::default(), + 0, ), // Instruction account 2 AccountInfo::new( @@ -1647,7 +1645,7 @@ mod tests { &mut data_ix_2, &owner, false, - Epoch::default(), + 0, ), // Required account 1 AccountInfo::new( @@ -1658,7 +1656,7 @@ mod tests { &mut data1, &owner, false, - Epoch::default(), + 0, ), // Required account 2 AccountInfo::new( @@ -1669,7 +1667,7 @@ mod tests { &mut data2, &owner, false, - Epoch::default(), + 0, ), // Required account 3 (PDA) AccountInfo::new( @@ -1680,7 +1678,7 @@ mod tests { &mut data3, &owner, false, - Epoch::default(), + 0, ), // Required account 4 (pubkey data) AccountInfo::new( @@ -1691,7 +1689,7 @@ mod tests { &mut data4, &owner, false, - Epoch::default(), + 0, ), ];