diff --git a/Cargo.lock b/Cargo.lock index be73e990f5266c..5e5c67a6ba9b5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -412,7 +412,6 @@ dependencies = [ "solana-genesis-utils", "solana-geyser-plugin-manager", "solana-gossip", - "solana-inline-spl", "solana-ledger", "solana-logger", "solana-metrics", @@ -436,6 +435,7 @@ dependencies = [ "solana-unified-scheduler-pool", "solana-version", "solana-vote-program", + "spl-generic-token", "spl-token-2022 8.0.0", "symlink", "tempfile", @@ -6429,6 +6429,7 @@ dependencies = [ "solana-stake-interface", "solana-sysvar", "solana-vote-interface", + "spl-generic-token", "spl-pod", "spl-token 8.0.0", "spl-token-2022 8.0.0", @@ -6498,7 +6499,6 @@ dependencies = [ "solana-core", "solana-faucet", "solana-gossip", - "solana-inline-spl", "solana-local-cluster", "solana-logger", "solana-measure", @@ -6511,6 +6511,7 @@ dependencies = [ "solana-test-validator", "solana-transaction-status", "solana-version", + "spl-generic-token", "spl-token 8.0.0", ] @@ -6561,7 +6562,6 @@ dependencies = [ "solana-frozen-abi-macro", "solana-genesis-config", "solana-hash", - "solana-inline-spl", "solana-instruction", "solana-keypair", "solana-lattice-hash", @@ -6589,6 +6589,7 @@ dependencies = [ "solana-transaction-context 2.3.0", "solana-transaction-error", "solana-vote-program", + "spl-generic-token", "static_assertions", "strum", "strum_macros", @@ -8261,14 +8262,6 @@ dependencies = [ "solana-frozen-abi-macro", ] -[[package]] -name = "solana-inline-spl" -version = "2.3.0" -dependencies = [ - "bytemuck", - "solana-pubkey", -] - [[package]] name = "solana-instruction" version = "2.2.1" @@ -9161,7 +9154,6 @@ dependencies = [ "solana-banks-interface", "solana-banks-server", "solana-compute-budget", - "solana-inline-spl", "solana-instruction", "solana-log-collector", "solana-logger", @@ -9175,6 +9167,7 @@ dependencies = [ "solana-timings", "solana-transaction-context 2.3.0", "solana-vote-program", + "spl-generic-token", "test-case", "thiserror 2.0.12", "tokio", @@ -9410,7 +9403,6 @@ dependencies = [ "solana-entry", "solana-faucet", "solana-gossip", - "solana-inline-spl", "solana-ledger", "solana-log-collector", "solana-measure", @@ -9440,6 +9432,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "spl-pod", "spl-token 8.0.0", "spl-token-2022 8.0.0", @@ -9564,11 +9557,11 @@ dependencies = [ "solana-commitment-config", "solana-fee-calculator", "solana-inflation", - "solana-inline-spl", "solana-pubkey", "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", + "spl-generic-token", "thiserror 2.0.12", ] @@ -9671,7 +9664,6 @@ dependencies = [ "solana-fee", "solana-frozen-abi", "solana-frozen-abi-macro", - "solana-inline-spl", "solana-lattice-hash", "solana-loader-v3-interface", "solana-logger", @@ -9702,6 +9694,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "static_assertions", "strum", "strum_macros", @@ -11521,6 +11514,16 @@ dependencies = [ "spl-token-confidential-transfer-proof-extraction 0.3.0", ] +[[package]] +name = "spl-generic-token" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + [[package]] name = "spl-instruction-padding" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 27177776db7b99..14f3d527053608 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,7 +61,6 @@ members = [ "geyser-plugin-interface", "geyser-plugin-manager", "gossip", - "inline-spl", "install", "keygen", "lattice-hash", @@ -450,7 +449,6 @@ solana-gossip = { path = "gossip", version = "=2.3.0" } solana-hard-forks = "2.2.1" solana-hash = "2.2.1" solana-inflation = "2.2.1" -solana-inline-spl = { path = "inline-spl", version = "=2.3.0" } solana-instruction = "2.2.1" solana-instructions-sysvar = "2.2.1" solana-keccak-hasher = "2.2.1" @@ -577,6 +575,7 @@ solana-zk-sdk = { path = "zk-sdk", version = "=2.3.0" } solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=2.3.0" } solana-zk-token-sdk = { path = "zk-token-sdk", version = "=2.3.0" } spl-associated-token-account = "=6.0.0" +spl-generic-token = "1.0.1" spl-instruction-padding = "0.3" spl-memo = "=6.0.0" spl-pod = "=0.5.1" diff --git a/account-decoder/Cargo.toml b/account-decoder/Cargo.toml index a319004f10c36e..dd40fc75900dd5 100644 --- a/account-decoder/Cargo.toml +++ b/account-decoder/Cargo.toml @@ -42,6 +42,7 @@ solana-slot-history = { workspace = true } solana-stake-interface = { workspace = true } solana-sysvar = { workspace = true } solana-vote-interface = { workspace = true, features = ["bincode"] } +spl-generic-token = { workspace = true } spl-token = { workspace = true, features = ["no-entrypoint"] } spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } spl-token-group-interface = { workspace = true } diff --git a/account-decoder/src/parse_token.rs b/account-decoder/src/parse_token.rs index 71d7a3d893d0cd..88354eec97c793 100644 --- a/account-decoder/src/parse_token.rs +++ b/account-decoder/src/parse_token.rs @@ -1,7 +1,3 @@ -pub use solana_account_decoder_client_types::token::{ - real_number_string, real_number_string_trimmed, TokenAccountType, UiAccountState, UiMint, - UiMultisig, UiTokenAccount, UiTokenAmount, -}; use { crate::{ parse_account_data::{ @@ -19,16 +15,13 @@ use { }, std::str::FromStr, }; - -// Returns all known SPL Token program ids -pub fn spl_token_ids() -> Vec { - vec![spl_token::id(), spl_token_2022::id()] -} - -// Check if the provided program id as a known SPL Token program id -pub fn is_known_spl_token_id(program_id: &Pubkey) -> bool { - *program_id == spl_token::id() || *program_id == spl_token_2022::id() -} +pub use { + solana_account_decoder_client_types::token::{ + real_number_string, real_number_string_trimmed, TokenAccountType, UiAccountState, UiMint, + UiMultisig, UiTokenAccount, UiTokenAmount, + }, + spl_generic_token::{is_known_spl_token_id, spl_token_ids}, +}; #[deprecated(since = "2.0.0", note = "Use `parse_token_v3` instead")] #[allow(deprecated)] diff --git a/accounts-cluster-bench/Cargo.toml b/accounts-cluster-bench/Cargo.toml index 5593de62c802f9..3711f93f3722db 100644 --- a/accounts-cluster-bench/Cargo.toml +++ b/accounts-cluster-bench/Cargo.toml @@ -18,7 +18,6 @@ solana-clap-utils = { workspace = true } solana-cli-config = { workspace = true } solana-client = { workspace = true } solana-gossip = { workspace = true } -solana-inline-spl = { workspace = true } solana-logger = { workspace = true } solana-measure = { workspace = true } solana-net-utils = { workspace = true } @@ -29,6 +28,7 @@ solana-sdk = { workspace = true } solana-streamer = { workspace = true } solana-transaction-status = { workspace = true } solana-version = { workspace = true } +spl-generic-token = { workspace = true } spl-token = { workspace = true, features = ["no-entrypoint"] } [dev-dependencies] diff --git a/accounts-cluster-bench/src/main.rs b/accounts-cluster-bench/src/main.rs index 26aa5c32b1483c..707a46171e9087 100644 --- a/accounts-cluster-bench/src/main.rs +++ b/accounts-cluster-bench/src/main.rs @@ -13,7 +13,6 @@ use { rpc_request::MAX_GET_CONFIRMED_BLOCKS_RANGE, transaction_executor::TransactionExecutor, }, solana_gossip::gossip_service::discover, - solana_inline_spl::token, solana_measure::measure::Measure, solana_rpc_client::rpc_client::RpcClient, solana_rpc_client_api::request::TokenAccountsFilter, @@ -31,6 +30,7 @@ use { }, solana_streamer::socket::SocketAddrSpace, solana_transaction_status::UiTransactionEncoding, + spl_generic_token::token, spl_token::state::Account, std::{ cmp::min, diff --git a/accounts-db/Cargo.toml b/accounts-db/Cargo.toml index c722ecf9d2358a..546bdf3e6a009e 100644 --- a/accounts-db/Cargo.toml +++ b/accounts-db/Cargo.toml @@ -52,7 +52,6 @@ solana-frozen-abi-macro = { workspace = true, optional = true, features = [ ] } solana-genesis-config = { workspace = true, features = ["serde"] } solana-hash = { workspace = true, features = ["serde"] } -solana-inline-spl = { workspace = true } solana-keypair = { workspace = true, optional = true } solana-lattice-hash = { workspace = true } solana-measure = { workspace = true } @@ -76,6 +75,7 @@ solana-transaction = { workspace = true } solana-transaction-context = { workspace = true } solana-transaction-error = { workspace = true } solana-vote-program = { workspace = true, optional = true } +spl-generic-token = { workspace = true } static_assertions = { workspace = true } tar = { workspace = true } tempfile = { workspace = true } diff --git a/accounts-db/src/accounts_db/tests.rs b/accounts-db/src/accounts_db/tests.rs index 15430cc8133cf7..1ec9c28b1c6f09 100644 --- a/accounts-db/src/accounts_db/tests.rs +++ b/accounts-db/src/accounts_db/tests.rs @@ -1848,15 +1848,17 @@ fn test_clean_old_with_both_normal_and_zero_lamport_accounts() { let pubkey2 = solana_pubkey::new_rand(); // Set up account to be added to secondary index + const SPL_TOKEN_INITIALIZED_OFFSET: usize = 108; let mint_key = Pubkey::new_unique(); - let mut account_data_with_mint = vec![0; solana_inline_spl::token::Account::get_packed_len()]; + let mut account_data_with_mint = vec![0; spl_generic_token::token::Account::get_packed_len()]; account_data_with_mint[..PUBKEY_BYTES].clone_from_slice(&(mint_key.to_bytes())); + account_data_with_mint[SPL_TOKEN_INITIALIZED_OFFSET] = 1; let mut normal_account = AccountSharedData::new(1, 0, AccountSharedData::default().owner()); - normal_account.set_owner(solana_inline_spl::token::id()); + normal_account.set_owner(spl_generic_token::token::id()); normal_account.set_data(account_data_with_mint.clone()); let mut zero_account = AccountSharedData::new(0, 0, AccountSharedData::default().owner()); - zero_account.set_owner(solana_inline_spl::token::id()); + zero_account.set_owner(spl_generic_token::token::id()); zero_account.set_data(account_data_with_mint); //store an account diff --git a/accounts-db/src/accounts_index.rs b/accounts-db/src/accounts_index.rs index 2767231fa1fe10..20b3766427d38d 100644 --- a/accounts-db/src/accounts_index.rs +++ b/accounts-db/src/accounts_index.rs @@ -1219,7 +1219,7 @@ impl + Into> AccountsIndex { .unwrap_or(0) } - fn update_spl_token_secondary_indexes( + fn update_spl_token_secondary_indexes( &self, token_id: &Pubkey, pubkey: &Pubkey, @@ -1310,15 +1310,15 @@ impl + Into> AccountsIndex { // (as persisted tombstone for snapshots). This will then ultimately be // filtered out by post-scan filters, like in `get_filtered_spl_token_accounts_by_owner()`. - self.update_spl_token_secondary_indexes::( - &solana_inline_spl::token::id(), + self.update_spl_token_secondary_indexes::( + &spl_generic_token::token::id(), pubkey, account_owner, account_data, account_indexes, ); - self.update_spl_token_secondary_indexes::( - &solana_inline_spl::token_2022::id(), + self.update_spl_token_secondary_indexes::( + &spl_generic_token::token_2022::id(), pubkey, account_owner, account_data, @@ -1752,19 +1752,14 @@ pub mod tests { crate::bucket_map_holder::{AtomicAge, BucketMapHolder}, account_map_entry::AccountMapEntryMeta, solana_account::{AccountSharedData, WritableAccount}, - solana_inline_spl::token::SPL_TOKEN_ACCOUNT_OWNER_OFFSET, solana_pubkey::PUBKEY_BYTES, + spl_generic_token::{spl_token_ids, token::SPL_TOKEN_ACCOUNT_OWNER_OFFSET}, std::ops::{ Bound::{Excluded, Included, Unbounded}, RangeInclusive, }, }; - const SPL_TOKENS: &[Pubkey] = &[ - solana_inline_spl::token::id(), - solana_inline_spl::token_2022::id(), - ]; - pub enum SecondaryIndexTypes<'a> { RwLock(&'a SecondaryIndex), DashMap(&'a SecondaryIndex), @@ -3055,7 +3050,10 @@ pub mod tests { } fn make_empty_token_account_data() -> Vec { - vec![0; solana_inline_spl::token::Account::get_packed_len()] + const SPL_TOKEN_INITIALIZED_OFFSET: usize = 108; + let mut data = vec![0; spl_generic_token::token::Account::get_packed_len()]; + data[SPL_TOKEN_INITIALIZED_OFFSET] = 1; + data } fn run_test_purge_exact_secondary_index< @@ -3085,7 +3083,7 @@ pub mod tests { &AccountSharedData::create( 0, account_data.to_vec(), - solana_inline_spl::token::id(), + spl_generic_token::token::id(), false, 0, ), @@ -3347,7 +3345,7 @@ pub mod tests { fn test_spl_token_mint_secondary_index() { let (key_start, key_end, secondary_indexes) = create_spl_token_mint_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); - for token_id in SPL_TOKENS { + for token_id in &spl_token_ids() { run_test_spl_token_secondary_indexes( token_id, &index, @@ -3364,7 +3362,7 @@ pub mod tests { let (key_start, key_end, secondary_indexes) = create_spl_token_owner_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); - for token_id in SPL_TOKENS { + for token_id in &spl_token_ids() { run_test_spl_token_secondary_indexes( token_id, &index, @@ -3469,7 +3467,7 @@ pub mod tests { fn test_spl_token_mint_secondary_index_same_slot_and_forks() { let (key_start, key_end, account_index) = create_spl_token_mint_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); - for token_id in SPL_TOKENS { + for token_id in &spl_token_ids() { run_test_secondary_indexes_same_slot_and_forks( token_id, &index, @@ -3485,7 +3483,7 @@ pub mod tests { fn test_rwlock_secondary_index_same_slot_and_forks() { let (key_start, key_end, account_index) = create_spl_token_owner_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); - for token_id in SPL_TOKENS { + for token_id in &spl_token_ids() { run_test_secondary_indexes_same_slot_and_forks( token_id, &index, diff --git a/inline-spl/Cargo.toml b/inline-spl/Cargo.toml deleted file mode 100644 index 132e10f07ab533..00000000000000 --- a/inline-spl/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "solana-inline-spl" -description = "Limited types and ids from the Solana Program Library" -documentation = "https://docs.rs/solana-inline-spl" -version = { workspace = true } -authors = { workspace = true } -repository = { workspace = true } -homepage = { workspace = true } -license = { workspace = true } -edition = { workspace = true } - -[dependencies] -bytemuck = { workspace = true } -solana-pubkey = { workspace = true, default-features = false, features = [ - "bytemuck", -] } - -[lib] -crate-type = ["lib"] -name = "solana_inline_spl" - -[dev-dependencies] - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] diff --git a/inline-spl/src/associated_token_account.rs b/inline-spl/src/associated_token_account.rs deleted file mode 100644 index 289dc0f8555e47..00000000000000 --- a/inline-spl/src/associated_token_account.rs +++ /dev/null @@ -1,6 +0,0 @@ -// Partial SPL Associated Token Account declarations inlined to avoid an external dependency on the spl-associated-token-account crate -solana_pubkey::declare_id!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); - -pub mod program_v1_1_0 { - solana_pubkey::declare_id!("NatA1Zyo48dJ7yuwR7cGURwhskKA8ywUyxb9GvG7mTC"); -} diff --git a/inline-spl/src/lib.rs b/inline-spl/src/lib.rs deleted file mode 100644 index 4cceddeaf36179..00000000000000 --- a/inline-spl/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod associated_token_account; -pub mod token; -pub mod token_2022; diff --git a/inline-spl/src/token.rs b/inline-spl/src/token.rs deleted file mode 100644 index af456c3b6242a7..00000000000000 --- a/inline-spl/src/token.rs +++ /dev/null @@ -1,91 +0,0 @@ -/// Partial SPL Token declarations inlined to avoid an external dependency on the spl-token crate -use solana_pubkey::{Pubkey, PUBKEY_BYTES}; - -solana_pubkey::declare_id!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); - -pub mod program_v3_4_0 { - solana_pubkey::declare_id!("NToK4t5AQzxPNpUA84DkxgfXaVDbDQQjpHKCqsbY46B"); -} - -/* - spl_token::state::Account { - mint: Pubkey, - owner: Pubkey, - amount: u64, - delegate: COption, - state: AccountState, - is_native: COption, - delegated_amount: u64, - close_authority: COption, - } -*/ -pub const SPL_TOKEN_ACCOUNT_MINT_OFFSET: usize = 0; -pub const SPL_TOKEN_ACCOUNT_OWNER_OFFSET: usize = 32; -const SPL_TOKEN_ACCOUNT_LENGTH: usize = 165; - -pub trait GenericTokenAccount { - fn valid_account_data(account_data: &[u8]) -> bool; - - // Call after account length has already been verified - fn unpack_account_owner_unchecked(account_data: &[u8]) -> &Pubkey { - Self::unpack_pubkey_unchecked(account_data, SPL_TOKEN_ACCOUNT_OWNER_OFFSET) - } - - // Call after account length has already been verified - fn unpack_account_mint_unchecked(account_data: &[u8]) -> &Pubkey { - Self::unpack_pubkey_unchecked(account_data, SPL_TOKEN_ACCOUNT_MINT_OFFSET) - } - - // Call after account length has already been verified - fn unpack_pubkey_unchecked(account_data: &[u8], offset: usize) -> &Pubkey { - bytemuck::from_bytes(&account_data[offset..offset.wrapping_add(PUBKEY_BYTES)]) - } - - fn unpack_account_owner(account_data: &[u8]) -> Option<&Pubkey> { - if Self::valid_account_data(account_data) { - Some(Self::unpack_account_owner_unchecked(account_data)) - } else { - None - } - } - - fn unpack_account_mint(account_data: &[u8]) -> Option<&Pubkey> { - if Self::valid_account_data(account_data) { - Some(Self::unpack_account_mint_unchecked(account_data)) - } else { - None - } - } -} - -pub struct Account; -impl Account { - pub fn get_packed_len() -> usize { - SPL_TOKEN_ACCOUNT_LENGTH - } -} - -impl GenericTokenAccount for Account { - fn valid_account_data(account_data: &[u8]) -> bool { - account_data.len() == SPL_TOKEN_ACCOUNT_LENGTH - } -} - -pub mod native_mint { - solana_pubkey::declare_id!("So11111111111111111111111111111111111111112"); - - /* - Mint { - mint_authority: COption::None, - supply: 0, - decimals: 9, - is_initialized: true, - freeze_authority: COption::None, - } - */ - pub const ACCOUNT_DATA: [u8; 82] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]; -} diff --git a/inline-spl/src/token_2022.rs b/inline-spl/src/token_2022.rs deleted file mode 100644 index fafa2b4cfce68a..00000000000000 --- a/inline-spl/src/token_2022.rs +++ /dev/null @@ -1,18 +0,0 @@ -/// Partial SPL Token declarations inlined to avoid an external dependency on the spl-token-2022 crate -use crate::token::{self, GenericTokenAccount}; - -solana_pubkey::declare_id!("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); - -// `spl_token_program_2022::extension::AccountType::Account` ordinal value -pub const ACCOUNTTYPE_ACCOUNT: u8 = 2; - -pub struct Account; -impl GenericTokenAccount for Account { - fn valid_account_data(account_data: &[u8]) -> bool { - token::Account::valid_account_data(account_data) - || ACCOUNTTYPE_ACCOUNT - == *account_data - .get(token::Account::get_packed_len()) - .unwrap_or(&0) - } -} diff --git a/program-test/Cargo.toml b/program-test/Cargo.toml index 6a7fdebd69cb8b..b3d1d15b95015b 100644 --- a/program-test/Cargo.toml +++ b/program-test/Cargo.toml @@ -23,7 +23,6 @@ solana-banks-client = { workspace = true } solana-banks-interface = { workspace = true } solana-banks-server = { workspace = true } solana-compute-budget = { workspace = true } -solana-inline-spl = { workspace = true } solana-instruction = { workspace = true } solana-log-collector = { workspace = true } solana-logger = { workspace = true } @@ -36,6 +35,7 @@ solana-svm = { workspace = true } solana-timings = { workspace = true } solana-transaction-context = { workspace = true } solana-vote-program = { workspace = true } +spl-generic-token = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } diff --git a/program-test/src/programs.rs b/program-test/src/programs.rs index 5771ab410ca599..f95fb58384e737 100644 --- a/program-test/src/programs.rs +++ b/program-test/src/programs.rs @@ -15,12 +15,12 @@ mod spl_memo_3_0 { static SPL_PROGRAMS: &[(Pubkey, Pubkey, &[u8])] = &[ ( - solana_inline_spl::token::ID, + spl_generic_token::token::ID, solana_sdk_ids::bpf_loader::ID, include_bytes!("programs/spl_token-3.5.0.so"), ), ( - solana_inline_spl::token_2022::ID, + spl_generic_token::token_2022::ID, solana_sdk_ids::bpf_loader_upgradeable::ID, include_bytes!("programs/spl_token_2022-8.0.0.so"), ), @@ -35,7 +35,7 @@ static SPL_PROGRAMS: &[(Pubkey, Pubkey, &[u8])] = &[ include_bytes!("programs/spl_memo-3.0.0.so"), ), ( - solana_inline_spl::associated_token_account::ID, + spl_generic_token::associated_token_account::ID, solana_sdk_ids::bpf_loader::ID, include_bytes!("programs/spl_associated_token_account-1.1.1.so"), ), diff --git a/program-test/tests/compute_units.rs b/program-test/tests/compute_units.rs index 3649e76a14c5d6..175661b0cd0633 100644 --- a/program-test/tests/compute_units.rs +++ b/program-test/tests/compute_units.rs @@ -25,7 +25,7 @@ async fn max_compute_units() { // Invalid compute unit maximums are only triggered by BPF programs, so send // a valid instruction into a BPF program to make sure the issue doesn't // manifest. - let token_2022_id = solana_inline_spl::token_2022::id(); + let token_2022_id = spl_generic_token::token_2022::id(); let mint = Keypair::new(); let rent = context.banks_client.get_rent().await.unwrap(); let space = 82; diff --git a/program-test/tests/realloc.rs b/program-test/tests/realloc.rs index 97b60ae083928f..e430e6347912ae 100644 --- a/program-test/tests/realloc.rs +++ b/program-test/tests/realloc.rs @@ -52,7 +52,7 @@ async fn realloc_smaller_in_cpi() { ); let context = program_test.start_with_context().await; - let token_2022_id = solana_inline_spl::token_2022::id(); + let token_2022_id = spl_generic_token::token_2022::id(); let mint = Keypair::new(); let account = Keypair::new(); let rent = context.banks_client.get_rent().await.unwrap(); diff --git a/program-test/tests/spl.rs b/program-test/tests/spl.rs index d352bbf93bf667..95897692ac426c 100644 --- a/program-test/tests/spl.rs +++ b/program-test/tests/spl.rs @@ -16,7 +16,7 @@ use { async fn programs_present() { let (banks_client, _, _) = ProgramTest::default().start().await; let rent = banks_client.get_rent().await.unwrap(); - let token_2022_id = solana_inline_spl::token_2022::id(); + let token_2022_id = spl_generic_token::token_2022::id(); let (token_2022_programdata_id, _) = Pubkey::find_program_address(&[token_2022_id.as_ref()], &bpf_loader_upgradeable::id()); @@ -34,7 +34,7 @@ async fn programs_present() { async fn token_2022() { let (banks_client, payer, recent_blockhash) = ProgramTest::default().start().await; - let token_2022_id = solana_inline_spl::token_2022::id(); + let token_2022_id = spl_generic_token::token_2022::id(); let mint = Keypair::new(); let rent = banks_client.get_rent().await.unwrap(); let space = 82; diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index bd12515787c1c0..b959f20fcf7e51 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5239,6 +5239,7 @@ dependencies = [ "solana-stake-interface", "solana-sysvar", "solana-vote-interface", + "spl-generic-token", "spl-token 8.0.0", "spl-token-2022 8.0.0", "spl-token-group-interface 0.6.0", @@ -5310,7 +5311,6 @@ dependencies = [ "solana-fee-calculator", "solana-genesis-config", "solana-hash", - "solana-inline-spl", "solana-lattice-hash", "solana-measure", "solana-message", @@ -5329,6 +5329,7 @@ dependencies = [ "solana-transaction", "solana-transaction-context 2.3.0", "solana-transaction-error", + "spl-generic-token", "static_assertions", "tar", "tempfile", @@ -6417,14 +6418,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "solana-inline-spl" -version = "2.3.0" -dependencies = [ - "bytemuck", - "solana-pubkey", -] - [[package]] name = "solana-instruction" version = "2.2.1" @@ -7128,7 +7121,6 @@ dependencies = [ "solana-banks-interface", "solana-banks-server", "solana-compute-budget", - "solana-inline-spl", "solana-instruction", "solana-log-collector", "solana-logger", @@ -7141,6 +7133,7 @@ dependencies = [ "solana-timings", "solana-transaction-context 2.3.0", "solana-vote-program", + "spl-generic-token", "thiserror 2.0.12", "tokio", ] @@ -7357,7 +7350,6 @@ dependencies = [ "solana-entry", "solana-faucet", "solana-gossip", - "solana-inline-spl", "solana-ledger", "solana-measure", "solana-metrics", @@ -7382,6 +7374,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "spl-token 8.0.0", "spl-token-2022 8.0.0", "stream-cancel", @@ -7478,11 +7471,11 @@ dependencies = [ "solana-commitment-config", "solana-fee-calculator", "solana-inflation", - "solana-inline-spl", "solana-pubkey", "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", + "spl-generic-token", "thiserror 2.0.12", ] @@ -7539,7 +7532,6 @@ dependencies = [ "solana-compute-budget-instruction", "solana-cost-model", "solana-fee", - "solana-inline-spl", "solana-lattice-hash", "solana-measure", "solana-metrics", @@ -7566,6 +7558,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "static_assertions", "strum", "strum_macros", @@ -9494,6 +9487,16 @@ dependencies = [ "spl-token-confidential-transfer-proof-extraction 0.3.0", ] +[[package]] +name = "spl-generic-token" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + [[package]] name = "spl-memo" version = "6.0.0" diff --git a/rpc-client-types/Cargo.toml b/rpc-client-types/Cargo.toml index 0ab6bfc19baa15..b50d48c67354a8 100644 --- a/rpc-client-types/Cargo.toml +++ b/rpc-client-types/Cargo.toml @@ -22,11 +22,11 @@ solana-clock = { workspace = true } solana-commitment-config = { workspace = true, features = ["serde"] } solana-fee-calculator = { workspace = true, features = ["serde"] } solana-inflation = { workspace = true } -solana-inline-spl = { workspace = true } solana-pubkey = { workspace = true } solana-transaction-error = { workspace = true } solana-transaction-status-client-types = { workspace = true } solana-version = { workspace = true } +spl-generic-token = { workspace = true } thiserror = { workspace = true } [dev-dependencies] diff --git a/rpc-client-types/src/filter.rs b/rpc-client-types/src/filter.rs index b8a78cb7994040..a3dbdfb72cdf1d 100644 --- a/rpc-client-types/src/filter.rs +++ b/rpc-client-types/src/filter.rs @@ -2,7 +2,7 @@ use { base64::{prelude::BASE64_STANDARD, Engine}, serde::Deserialize, solana_account::{AccountSharedData, ReadableAccount}, - solana_inline_spl::{token::GenericTokenAccount, token_2022::Account}, + spl_generic_token::{token::GenericTokenAccount, token_2022::Account}, std::borrow::Cow, thiserror::Error, }; diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index adadced8c59a20..6f900e87f33712 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -36,7 +36,6 @@ solana-client = { workspace = true } solana-entry = { workspace = true } solana-faucet = { workspace = true } solana-gossip = { workspace = true } -solana-inline-spl = { workspace = true } solana-ledger = { workspace = true } solana-measure = { workspace = true } solana-metrics = { workspace = true } @@ -61,6 +60,7 @@ solana-transaction-status = { workspace = true } solana-version = { workspace = true } solana-vote = { workspace = true } solana-vote-program = { workspace = true } +spl-generic-token = { workspace = true } spl-token = { workspace = true, features = ["no-entrypoint"] } spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } stream-cancel = { workspace = true } diff --git a/rpc/src/filter.rs b/rpc/src/filter.rs index 81cebd2f4702aa..a375901b2ff711 100644 --- a/rpc/src/filter.rs +++ b/rpc/src/filter.rs @@ -1,7 +1,7 @@ use { - solana_inline_spl::{token::GenericTokenAccount, token_2022::Account}, solana_rpc_client_api::filter::RpcFilterType, solana_sdk::account::{AccountSharedData, ReadableAccount}, + spl_generic_token::{token::GenericTokenAccount, token_2022::Account}, }; pub fn filter_allows(filter: &RpcFilterType, account: &AccountSharedData) -> bool { diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index 3de70e7de642a9..ec99db417b5a1f 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -32,10 +32,6 @@ use { solana_entry::entry::Entry, solana_faucet::faucet::request_airdrop_transaction, solana_gossip::cluster_info::ClusterInfo, - solana_inline_spl::{ - token::{SPL_TOKEN_ACCOUNT_MINT_OFFSET, SPL_TOKEN_ACCOUNT_OWNER_OFFSET}, - token_2022::{self, ACCOUNTTYPE_ACCOUNT}, - }, solana_ledger::{ blockstore::{Blockstore, BlockstoreError, SignatureInfosForAddress}, blockstore_meta::{PerfSample, PerfSampleV1, PerfSampleV2}, @@ -97,6 +93,10 @@ use { UiConfirmedBlock, UiTransactionEncoding, }, solana_vote_program::vote_state::MAX_LOCKOUT_HISTORY, + spl_generic_token::{ + token::{SPL_TOKEN_ACCOUNT_MINT_OFFSET, SPL_TOKEN_ACCOUNT_OWNER_OFFSET}, + token_2022::{self, ACCOUNTTYPE_ACCOUNT}, + }, spl_token_2022::{ extension::{ interest_bearing_mint::InterestBearingConfig, scaled_ui_amount::ScaledUiAmountConfig, @@ -7801,7 +7801,7 @@ pub mod tests { let token_account_pubkey = solana_pubkey::new_rand(); let token_with_different_mint_pubkey = solana_pubkey::new_rand(); let new_mint = Pubkey::new_from_array([5; 32]); - if program_id == solana_inline_spl::token_2022::id() { + if program_id == spl_generic_token::token_2022::id() { // Add the token account let account_base = TokenAccount { mint, @@ -8058,7 +8058,7 @@ pub mod tests { .expect("actual response deserialization"); let accounts: Vec = serde_json::from_value(result["result"].clone()).unwrap(); - if program_id == solana_inline_spl::token::id() { + if program_id == spl_generic_token::token::id() { // native mint is included for token-v3 assert_eq!(accounts.len(), 4); } else { @@ -8306,7 +8306,7 @@ pub mod tests { let supply = 500; let decimals = 2; let (program_name, account_size, mint_size, additional_data) = if program_id - == solana_inline_spl::token_2022::id() + == spl_generic_token::token_2022::id() { let account_base = TokenAccount { mint, @@ -8477,7 +8477,7 @@ pub mod tests { } } }); - if program_id == solana_inline_spl::token_2022::id() { + if program_id == spl_generic_token::token_2022::id() { expected_value["parsed"]["info"]["extensions"] = json!([ { "extension": "immutableOwner" @@ -8513,7 +8513,7 @@ pub mod tests { } } }); - if program_id == solana_inline_spl::token_2022::id() { + if program_id == spl_generic_token::token_2022::id() { if interest_bearing_config.is_some() { expected_value["parsed"]["info"]["extensions"] = json!([ { @@ -8601,7 +8601,7 @@ pub mod tests { // Can't filter on account type for token-v3 assert!(get_spl_token_owner_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(32, owner.to_bytes().to_vec())), RpcFilterType::Memcmp(Memcmp::new_raw_bytes(165, vec![ACCOUNTTYPE_ACCOUNT])), @@ -8611,7 +8611,7 @@ pub mod tests { // Filtering on mint instead of owner assert!(get_spl_token_owner_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, owner.to_bytes().to_vec())), RpcFilterType::DataSize(165) @@ -8644,7 +8644,7 @@ pub mod tests { let mint = Pubkey::new_unique(); assert_eq!( get_spl_token_mint_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, mint.to_bytes().to_vec())), RpcFilterType::DataSize(165) @@ -8657,7 +8657,7 @@ pub mod tests { // Filtering on token-2022 account type assert_eq!( get_spl_token_mint_filter( - &solana_inline_spl::token_2022::id(), + &spl_generic_token::token_2022::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, mint.to_bytes().to_vec())), RpcFilterType::Memcmp(Memcmp::new_raw_bytes(165, vec![ACCOUNTTYPE_ACCOUNT])), @@ -8670,7 +8670,7 @@ pub mod tests { // Filtering on token account state assert_eq!( get_spl_token_mint_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, mint.to_bytes().to_vec())), RpcFilterType::TokenAccountState, @@ -8682,7 +8682,7 @@ pub mod tests { // Can't filter on account type for token-v3 assert!(get_spl_token_mint_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, mint.to_bytes().to_vec())), RpcFilterType::Memcmp(Memcmp::new_raw_bytes(165, vec![ACCOUNTTYPE_ACCOUNT])), @@ -8692,7 +8692,7 @@ pub mod tests { // Filtering on owner instead of mint assert!(get_spl_token_mint_filter( - &solana_inline_spl::token::id(), + &spl_generic_token::token::id(), &[ RpcFilterType::Memcmp(Memcmp::new_raw_bytes(32, mint.to_bytes().to_vec())), RpcFilterType::DataSize(165) diff --git a/rpc/src/rpc_subscription_tracker.rs b/rpc/src/rpc_subscription_tracker.rs index d3949da24bf029..2d9c3006947a04 100644 --- a/rpc/src/rpc_subscription_tracker.rs +++ b/rpc/src/rpc_subscription_tracker.rs @@ -717,7 +717,7 @@ mod tests { assert_eq!(*info.last_notified_slot.read().unwrap(), 0); let account_params = SubscriptionParams::Account(AccountSubscriptionParams { - pubkey: solana_inline_spl::token::id(), + pubkey: spl_generic_token::token::id(), commitment: CommitmentConfig::finalized(), encoding: UiAccountEncoding::Base64Zstd, data_slice: None, @@ -757,7 +757,7 @@ mod tests { assert_eq!(counts(&tracker), (0, 0, 0, 0)); let account_params = SubscriptionParams::Account(AccountSubscriptionParams { - pubkey: solana_inline_spl::token::id(), + pubkey: spl_generic_token::token::id(), commitment: CommitmentConfig::finalized(), encoding: UiAccountEncoding::Base64Zstd, data_slice: None, @@ -768,7 +768,7 @@ mod tests { assert_eq!(counts(&tracker), (0, 0, 0, 0)); let account_params2 = SubscriptionParams::Account(AccountSubscriptionParams { - pubkey: solana_inline_spl::token::id(), + pubkey: spl_generic_token::token::id(), commitment: CommitmentConfig::confirmed(), encoding: UiAccountEncoding::Base64Zstd, data_slice: None, diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 84b3ccbb179df5..ba180e7ce49127 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -65,7 +65,6 @@ solana-frozen-abi = { workspace = true, optional = true, features = [ solana-frozen-abi-macro = { workspace = true, optional = true, features = [ "frozen-abi", ] } -solana-inline-spl = { workspace = true } solana-lattice-hash = { workspace = true } solana-measure = { workspace = true } solana-metrics = { workspace = true } @@ -92,6 +91,7 @@ solana-unified-scheduler-logic = { workspace = true } solana-version = { workspace = true } solana-vote = { workspace = true } solana-vote-program = { workspace = true } +spl-generic-token = { workspace = true } static_assertions = { workspace = true } strum = { workspace = true, features = ["derive"] } strum_macros = { workspace = true } diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 0aa966bd167aaf..effe61130b626b 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -42,7 +42,6 @@ use { solana_cost_model::block_cost_limits::{ MAX_BLOCK_UNITS, MAX_BLOCK_UNITS_SIMD_0207, MAX_BLOCK_UNITS_SIMD_0256, }, - solana_inline_spl::token, solana_logger, solana_program_runtime::{ declare_process_instruction, @@ -121,6 +120,7 @@ use { VoteStateVersions, MAX_LOCKOUT_HISTORY, }, }, + spl_generic_token::token, std::{ collections::{HashMap, HashSet}, convert::TryInto, diff --git a/runtime/src/genesis_utils.rs b/runtime/src/genesis_utils.rs index 81f39f41618685..d66558f3cfdfd2 100644 --- a/runtime/src/genesis_utils.rs +++ b/runtime/src/genesis_utils.rs @@ -297,14 +297,14 @@ pub fn create_genesis_config_with_leader_ex_no_features( initial_accounts.push((*validator_stake_account_pubkey, validator_stake_account)); let native_mint_account = solana_sdk::account::AccountSharedData::from(Account { - owner: solana_inline_spl::token::id(), - data: solana_inline_spl::token::native_mint::ACCOUNT_DATA.to_vec(), + owner: spl_generic_token::token::id(), + data: spl_generic_token::token::native_mint::ACCOUNT_DATA.to_vec(), lamports: sol_to_lamports(1.), executable: false, rent_epoch: 1, }); initial_accounts.push(( - solana_inline_spl::token::native_mint::id(), + spl_generic_token::token::native_mint::id(), native_mint_account, )); diff --git a/runtime/src/static_ids.rs b/runtime/src/static_ids.rs index c8670f0b7564d8..a89f8f6b1697e7 100644 --- a/runtime/src/static_ids.rs +++ b/runtime/src/static_ids.rs @@ -1,13 +1,12 @@ use { - solana_inline_spl::{associated_token_account, token, token_2022}, solana_pubkey::Pubkey, + spl_generic_token::{associated_token_account, token, token_2022}, }; lazy_static! { /// Vector of static token & mint IDs pub static ref STATIC_IDS: Vec = vec![ associated_token_account::id(), - associated_token_account::program_v1_1_0::id(), token::id(), token::native_mint::id(), token_2022::id(), diff --git a/svm/examples/Cargo.lock b/svm/examples/Cargo.lock index 26a44a114dd760..cc602290ec67c3 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -5097,6 +5097,7 @@ dependencies = [ "solana-stake-interface", "solana-sysvar", "solana-vote-interface", + "spl-generic-token", "spl-token 8.0.0", "spl-token-2022 8.0.0", "spl-token-group-interface 0.6.0", @@ -5168,7 +5169,6 @@ dependencies = [ "solana-fee-calculator", "solana-genesis-config", "solana-hash", - "solana-inline-spl", "solana-lattice-hash", "solana-measure", "solana-message", @@ -5187,6 +5187,7 @@ dependencies = [ "solana-transaction", "solana-transaction-context 2.3.0", "solana-transaction-error", + "spl-generic-token", "static_assertions", "tar", "tempfile", @@ -6241,14 +6242,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "solana-inline-spl" -version = "2.3.0" -dependencies = [ - "bytemuck", - "solana-pubkey", -] - [[package]] name = "solana-instruction" version = "2.2.1" @@ -6952,7 +6945,6 @@ dependencies = [ "solana-banks-interface", "solana-banks-server", "solana-compute-budget", - "solana-inline-spl", "solana-instruction", "solana-log-collector", "solana-logger", @@ -6965,6 +6957,7 @@ dependencies = [ "solana-timings", "solana-transaction-context 2.3.0", "solana-vote-program", + "spl-generic-token", "thiserror 2.0.12", "tokio", ] @@ -7181,7 +7174,6 @@ dependencies = [ "solana-entry", "solana-faucet", "solana-gossip", - "solana-inline-spl", "solana-ledger", "solana-measure", "solana-metrics", @@ -7206,6 +7198,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "spl-token 8.0.0", "spl-token-2022 8.0.0", "stream-cancel", @@ -7302,11 +7295,11 @@ dependencies = [ "solana-commitment-config", "solana-fee-calculator", "solana-inflation", - "solana-inline-spl", "solana-pubkey", "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", + "spl-generic-token", "thiserror 2.0.12", ] @@ -7363,7 +7356,6 @@ dependencies = [ "solana-compute-budget-instruction", "solana-cost-model", "solana-fee", - "solana-inline-spl", "solana-lattice-hash", "solana-measure", "solana-metrics", @@ -7389,6 +7381,7 @@ dependencies = [ "solana-version", "solana-vote", "solana-vote-program", + "spl-generic-token", "static_assertions", "strum", "strum_macros", @@ -8832,6 +8825,16 @@ dependencies = [ "spl-token-confidential-transfer-proof-extraction 0.3.0", ] +[[package]] +name = "spl-generic-token" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + [[package]] name = "spl-memo" version = "6.0.0" diff --git a/validator/Cargo.toml b/validator/Cargo.toml index 0e95327fc19533..959bbb7a50dedc 100644 --- a/validator/Cargo.toml +++ b/validator/Cargo.toml @@ -73,10 +73,10 @@ tokio = { workspace = true } assert_cmd = { workspace = true } predicates = { workspace = true } solana-account-decoder = { workspace = true } -solana-inline-spl = { workspace = true } solana-program-option = { workspace = true } solana-program-pack = { workspace = true } solana-runtime = { workspace = true, features = ["dev-context-only-utils"] } +spl-generic-token = { workspace = true } spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } tempfile = { workspace = true } diff --git a/validator/src/admin_rpc_service.rs b/validator/src/admin_rpc_service.rs index b70bfcc7c9abcf..2bd77a9fac3d1b 100644 --- a/validator/src/admin_rpc_service.rs +++ b/validator/src/admin_rpc_service.rs @@ -878,7 +878,6 @@ mod tests { validator::{Validator, ValidatorConfig, ValidatorTpuConfig}, }, solana_gossip::cluster_info::{ClusterInfo, Node}, - solana_inline_spl::token, solana_ledger::{ create_new_tmp_ledger, genesis_utils::{ @@ -900,6 +899,7 @@ mod tests { }, solana_streamer::socket::SocketAddrSpace, solana_tpu_client::tpu_client::DEFAULT_TPU_ENABLE_UDP, + spl_generic_token::token, spl_token_2022::state::{Account as TokenAccount, AccountState as TokenAccountState, Mint}, std::{collections::HashSet, fs::remove_dir_all, sync::atomic::AtomicBool}, };