diff --git a/Cargo.lock b/Cargo.lock index f9f5dbbc541b07..868f16d3ed0e97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5323,7 +5323,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-config-program", + "solana-config-program-api", "solana-sdk", "spl-pod", "spl-token", @@ -5917,11 +5917,22 @@ dependencies = [ "chrono", "serde", "serde_derive", + "solana-config-program-api", "solana-logger", "solana-program-runtime", "solana-sdk", ] +[[package]] +name = "solana-config-program-api" +version = "0.0.1" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-sdk", +] + [[package]] name = "solana-connection-cache" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index c4802c1ba0fd5e..1a03394937fdcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -325,6 +325,7 @@ solana-cli-output = { path = "cli-output", version = "=2.0.0" } solana-client = { path = "client", version = "=2.0.0" } solana-compute-budget-program = { path = "programs/compute-budget", version = "=2.0.0" } solana-config-program = { path = "programs/config", version = "=2.0.0" } +solana-config-program-api = { path = "programs/config-api", version = "=0.0.1" } solana-connection-cache = { path = "connection-cache", version = "=2.0.0", default-features = false } solana-core = { path = "core", version = "=2.0.0" } solana-cost-model = { path = "cost-model", version = "=2.0.0" } diff --git a/account-decoder/Cargo.toml b/account-decoder/Cargo.toml index 7aee8478b4f126..8942506df83221 100644 --- a/account-decoder/Cargo.toml +++ b/account-decoder/Cargo.toml @@ -19,7 +19,7 @@ lazy_static = { workspace = true } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } -solana-config-program = { workspace = true } +solana-config-program-api = { workspace = true } solana-sdk = { workspace = true } spl-token = { workspace = true, features = ["no-entrypoint"] } spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } diff --git a/account-decoder/src/parse_account_data.rs b/account-decoder/src/parse_account_data.rs index 81886e94986632..ec50fda6f0e5b4 100644 --- a/account-decoder/src/parse_account_data.rs +++ b/account-decoder/src/parse_account_data.rs @@ -18,7 +18,7 @@ use { lazy_static! { static ref ADDRESS_LOOKUP_PROGRAM_ID: Pubkey = address_lookup_table::program::id(); static ref BPF_UPGRADEABLE_LOADER_PROGRAM_ID: Pubkey = solana_sdk::bpf_loader_upgradeable::id(); - static ref CONFIG_PROGRAM_ID: Pubkey = solana_config_program::id(); + static ref CONFIG_PROGRAM_ID: Pubkey = solana_sdk::config::program::id(); static ref STAKE_PROGRAM_ID: Pubkey = stake::program::id(); static ref SYSTEM_PROGRAM_ID: Pubkey = system_program::id(); static ref SYSVAR_PROGRAM_ID: Pubkey = sysvar::id(); diff --git a/account-decoder/src/parse_config.rs b/account-decoder/src/parse_config.rs index eadc2675558635..907e1abca288bb 100644 --- a/account-decoder/src/parse_config.rs +++ b/account-decoder/src/parse_config.rs @@ -5,7 +5,7 @@ use { }, bincode::deserialize, serde_json::Value, - solana_config_program::{get_config_data, ConfigKeys}, + solana_config_program_api::{get_config_data, ConfigKeys}, solana_sdk::{ pubkey::Pubkey, stake::config::{ @@ -99,7 +99,7 @@ pub struct UiConfig { mod test { use { super::*, crate::validator_info::ValidatorInfo, serde_json::json, - solana_config_program::create_config_account, solana_sdk::account::ReadableAccount, + solana_config_program_api::create_config_account, solana_sdk::account::ReadableAccount, }; #[test] diff --git a/account-decoder/src/validator_info.rs b/account-decoder/src/validator_info.rs index 7094fe2fb33033..ca701e5df5e9ff 100644 --- a/account-decoder/src/validator_info.rs +++ b/account-decoder/src/validator_info.rs @@ -1,4 +1,4 @@ -use solana_config_program::ConfigState; +use solana_config_program_api::ConfigState; pub const MAX_SHORT_FIELD_LENGTH: usize = 80; pub const MAX_LONG_FIELD_LENGTH: usize = 300; diff --git a/programs/config-api/Cargo.toml b/programs/config-api/Cargo.toml new file mode 100644 index 00000000000000..c9609063ca5df6 --- /dev/null +++ b/programs/config-api/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "solana-config-program-api" +description = "Solana Config program API" +documentation = "https://docs.rs/solana-config-program-api" +version = "0.0.1" +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } + +[dependencies] +bincode = { workspace = true } +serde = { workspace = true } +serde_derive = { workspace = true } +solana-sdk = { workspace = true } + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] diff --git a/programs/config-api/src/lib.rs b/programs/config-api/src/lib.rs new file mode 100644 index 00000000000000..14c0e2d4083044 --- /dev/null +++ b/programs/config-api/src/lib.rs @@ -0,0 +1,60 @@ +#[allow(deprecated)] +use solana_sdk::stake::config::Config as StakeConfig; +use { + bincode::{deserialize, serialize, serialized_size}, + serde_derive::{Deserialize, Serialize}, + solana_sdk::{ + account::{Account, AccountSharedData}, + pubkey::Pubkey, + short_vec, + }, +}; + +pub trait ConfigState: serde::Serialize + Default { + /// Maximum space that the serialized representation will require + fn max_space() -> u64; +} + +#[allow(deprecated)] +impl ConfigState for StakeConfig { + fn max_space() -> u64 { + serialized_size(&StakeConfig::default()).unwrap() + } +} + +/// A collection of keys to be stored in Config account data. +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct ConfigKeys { + // Each key tuple comprises a unique `Pubkey` identifier, + // and `bool` whether that key is a signer of the data + #[serde(with = "short_vec")] + pub keys: Vec<(Pubkey, bool)>, +} + +impl ConfigKeys { + pub fn serialized_size(keys: Vec<(Pubkey, bool)>) -> u64 { + serialized_size(&ConfigKeys { keys }).unwrap() + } +} + +pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> { + deserialize::(bytes) + .and_then(|keys| serialized_size(&keys)) + .map(|offset| &bytes[offset as usize..]) +} + +// utility for pre-made Accounts +pub fn create_config_account( + keys: Vec<(Pubkey, bool)>, + config_data: &T, + lamports: u64, +) -> AccountSharedData { + let mut data = serialize(&ConfigKeys { keys }).unwrap(); + data.extend_from_slice(&serialize(config_data).unwrap()); + AccountSharedData::from(Account { + lamports, + data, + owner: solana_sdk::config::program::id(), + ..Account::default() + }) +} diff --git a/programs/config/Cargo.toml b/programs/config/Cargo.toml index d81d84e8c4505e..87bc89cf0b5714 100644 --- a/programs/config/Cargo.toml +++ b/programs/config/Cargo.toml @@ -14,6 +14,7 @@ bincode = { workspace = true } chrono = { workspace = true, features = ["default", "serde"] } serde = { workspace = true } serde_derive = { workspace = true } +solana-config-program-api = { workspace = true } solana-program-runtime = { workspace = true } solana-sdk = { workspace = true } diff --git a/programs/config/src/lib.rs b/programs/config/src/lib.rs index c165b14477b00c..a7d98b260f0743 100644 --- a/programs/config/src/lib.rs +++ b/programs/config/src/lib.rs @@ -3,65 +3,7 @@ pub mod config_instruction; pub mod config_processor; pub mod date_instruction; -pub use solana_sdk::config::program::id; -#[allow(deprecated)] -use solana_sdk::stake::config::Config as StakeConfig; -use { - bincode::{deserialize, serialize, serialized_size}, - serde_derive::{Deserialize, Serialize}, - solana_sdk::{ - account::{Account, AccountSharedData}, - pubkey::Pubkey, - short_vec, - }, +pub use { + solana_config_program_api::{create_config_account, get_config_data, ConfigKeys, ConfigState}, + solana_sdk::config::program::id, }; - -pub trait ConfigState: serde::Serialize + Default { - /// Maximum space that the serialized representation will require - fn max_space() -> u64; -} - -// TODO move ConfigState into `solana_program` to implement trait locally -#[allow(deprecated)] -impl ConfigState for StakeConfig { - fn max_space() -> u64 { - serialized_size(&StakeConfig::default()).unwrap() - } -} - -/// A collection of keys to be stored in Config account data. -#[derive(Debug, Default, Deserialize, Serialize)] -pub struct ConfigKeys { - // Each key tuple comprises a unique `Pubkey` identifier, - // and `bool` whether that key is a signer of the data - #[serde(with = "short_vec")] - pub keys: Vec<(Pubkey, bool)>, -} - -impl ConfigKeys { - pub fn serialized_size(keys: Vec<(Pubkey, bool)>) -> u64 { - serialized_size(&ConfigKeys { keys }).unwrap() - } -} - -pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> { - deserialize::(bytes) - .and_then(|keys| serialized_size(&keys)) - .map(|offset| &bytes[offset as usize..]) -} - -// utility for pre-made Accounts -pub fn create_config_account( - keys: Vec<(Pubkey, bool)>, - config_data: &T, - lamports: u64, -) -> AccountSharedData { - let mut data = serialize(&ConfigKeys { keys }).unwrap(); - data.extend_from_slice(&serialize(config_data).unwrap()); - AccountSharedData::from(Account { - lamports, - data, - owner: id(), - ..Account::default() - }) -} diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 3204776825622b..e408b8bcc7a610 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4616,7 +4616,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-config-program", + "solana-config-program-api", "solana-sdk", "spl-token", "spl-token-2022", @@ -4908,10 +4908,21 @@ dependencies = [ "chrono", "serde", "serde_derive", + "solana-config-program-api", "solana-program-runtime", "solana-sdk", ] +[[package]] +name = "solana-config-program-api" +version = "0.0.1" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-sdk", +] + [[package]] name = "solana-connection-cache" version = "2.0.0"