diff --git a/Cargo.lock b/Cargo.lock index 5274291d011084..4ffb63a864b774 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6706,6 +6706,7 @@ dependencies = [ "solana-rayon-threadlimit", "solana-sdk 1.16.0", "solana-stake-program", + "solana-system-program", "solana-vote-program", "solana-zk-token-proof-program", "solana-zk-token-sdk 1.16.0", @@ -7008,6 +7009,20 @@ dependencies = [ "users", ] +[[package]] +name = "solana-system-program" +version = "1.16.0" +dependencies = [ + "assert_matches", + "bincode", + "log", + "serde", + "serde_derive", + "solana-logger 1.16.0", + "solana-program-runtime", + "solana-sdk 1.16.0", +] + [[package]] name = "solana-test-validator" version = "1.16.0" diff --git a/Cargo.toml b/Cargo.toml index 48eaab5e8ca9d7..943bfe2dcfc24f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ members = [ "programs/ed25519-tests", "programs/loader-v3", "programs/stake", + "programs/system", "programs/vote", "programs/zk-token-proof", "programs/zk-token-proof-tests", @@ -348,6 +349,7 @@ solana-storage-bigtable = { path = "storage-bigtable", version = "=1.16.0" } solana-storage-proto = { path = "storage-proto", version = "=1.16.0" } solana-streamer = { path = "streamer", version = "=1.16.0" } solana-sys-tuner = { path = "sys-tuner", version = "=1.16.0" } +solana-system-program = { path = "programs/system", version = "=1.16.0" } solana-test-validator = { path = "test-validator", version = "=1.16.0" } solana-thin-client = { path = "thin-client", version = "=1.16.0" } solana-tpu-client = { path = "tpu-client", version = "=1.16.0", default-features = false } diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index a232f3b07657e2..2552b612d411bd 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5610,6 +5610,7 @@ dependencies = [ "solana-rayon-threadlimit", "solana-sdk 1.16.0", "solana-stake-program", + "solana-system-program", "solana-vote-program", "solana-zk-token-proof-program", "solana-zk-token-sdk 1.16.0", @@ -6256,6 +6257,18 @@ dependencies = [ "users", ] +[[package]] +name = "solana-system-program" +version = "1.16.0" +dependencies = [ + "bincode", + "log", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk 1.16.0", +] + [[package]] name = "solana-test-validator" version = "1.16.0" diff --git a/programs/system/Cargo.toml b/programs/system/Cargo.toml new file mode 100644 index 00000000000000..ae3c762c17e2c7 --- /dev/null +++ b/programs/system/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "solana-system-program" +description = "Solana System program" +documentation = "https://docs.rs/solana-system-program" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } + +[dependencies] +bincode = { workspace = true } +log = { workspace = true } +serde = { workspace = true } +serde_derive = { workspace = true } +solana-program-runtime = { workspace = true } +solana-sdk = { workspace = true } + +[dev-dependencies] +assert_matches = { workspace = true } +solana-logger = { workspace = true } + +[lib] +crate-type = ["lib"] +name = "solana_system_program" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] diff --git a/programs/system/src/lib.rs b/programs/system/src/lib.rs new file mode 100644 index 00000000000000..c1bfc548047a98 --- /dev/null +++ b/programs/system/src/lib.rs @@ -0,0 +1,34 @@ +#![allow(clippy::integer_arithmetic)] +pub mod system_instruction; +pub mod system_processor; + +use solana_sdk::{ + account::{AccountSharedData, ReadableAccount}, + account_utils::StateMut, + nonce, system_program, +}; +pub use system_program::id; + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum SystemAccountKind { + System, + Nonce, +} + +pub fn get_system_account_kind(account: &AccountSharedData) -> Option { + if system_program::check_id(account.owner()) { + if account.data().is_empty() { + Some(SystemAccountKind::System) + } else if account.data().len() == nonce::State::size() { + let nonce_versions: nonce::state::Versions = account.state().ok()?; + match nonce_versions.state() { + nonce::State::Uninitialized => None, + nonce::State::Initialized(_) => Some(SystemAccountKind::Nonce), + } + } else { + None + } + } else { + None + } +} diff --git a/runtime/src/nonce_keyed_account.rs b/programs/system/src/system_instruction.rs similarity index 100% rename from runtime/src/nonce_keyed_account.rs rename to programs/system/src/system_instruction.rs diff --git a/runtime/src/system_instruction_processor.rs b/programs/system/src/system_processor.rs similarity index 89% rename from runtime/src/system_instruction_processor.rs rename to programs/system/src/system_processor.rs index 367238b747d6e2..caa0f3cb7c76c7 100644 --- a/runtime/src/system_instruction_processor.rs +++ b/programs/system/src/system_processor.rs @@ -1,5 +1,5 @@ use { - crate::nonce_keyed_account::{ + crate::system_instruction::{ advance_nonce_account, authorize_nonce_account, initialize_nonce_account, withdraw_nonce_account, }, @@ -9,8 +9,6 @@ use { sysvar_cache::get_sysvar_with_account_check, }, solana_sdk::{ - account::AccountSharedData, - account_utils::StateMut, feature_set, instruction::InstructionError, nonce, @@ -557,63 +555,30 @@ declare_process_instruction!(process_instruction, 150, |invoke_context| { } }); -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum SystemAccountKind { - System, - Nonce, -} - -pub fn get_system_account_kind(account: &AccountSharedData) -> Option { - use solana_sdk::account::ReadableAccount; - if system_program::check_id(account.owner()) { - if account.data().is_empty() { - Some(SystemAccountKind::System) - } else if account.data().len() == nonce::State::size() { - let nonce_versions: nonce::state::Versions = account.state().ok()?; - match nonce_versions.state() { - nonce::State::Uninitialized => None, - nonce::State::Initialized(_) => Some(SystemAccountKind::Nonce), - } - } else { - None - } - } else { - None - } -} - #[cfg(test)] mod tests { #[allow(deprecated)] use solana_sdk::{ account::{self, Account, AccountSharedData, ReadableAccount}, - client::SyncClient, fee_calculator::FeeCalculator, - genesis_config::create_genesis_config, hash::{hash, Hash}, instruction::{AccountMeta, Instruction, InstructionError}, - message::Message, - native_token::sol_to_lamports, nonce::{ self, state::{ Data as NonceData, DurableNonce, State as NonceState, Versions as NonceVersions, }, }, - nonce_account, recent_blockhashes_account, - signature::{Keypair, Signer}, - system_instruction, system_program, + nonce_account, recent_blockhashes_account, system_instruction, system_program, sysvar::{self, recent_blockhashes::IterItem, rent::Rent}, - transaction::TransactionError, }; use { super::*, - crate::{bank::Bank, bank_client::BankClient}, + crate::{get_system_account_kind, SystemAccountKind}, bincode::serialize, solana_program_runtime::{ invoke_context::mock_process_instruction, with_mock_invoke_context, }, - std::sync::Arc, }; impl From for Address { @@ -1507,204 +1472,6 @@ mod tests { ); } - #[test] - fn test_allocate() { - let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0)); - let bank = Bank::new_for_tests(&genesis_config); - let bank_client = BankClient::new(bank); - let data_len = 2; - let amount = genesis_config.rent.minimum_balance(data_len); - - let alice_keypair = Keypair::new(); - let alice_pubkey = alice_keypair.pubkey(); - let seed = "seed"; - let owner = Pubkey::new_unique(); - let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap(); - - bank_client - .transfer_and_confirm(amount, &mint_keypair, &alice_pubkey) - .unwrap(); - - let allocate_with_seed = Message::new( - &[system_instruction::allocate_with_seed( - &alice_with_seed, - &alice_pubkey, - seed, - data_len as u64, - &owner, - )], - Some(&alice_pubkey), - ); - - assert!(bank_client - .send_and_confirm_message(&[&alice_keypair], allocate_with_seed) - .is_ok()); - - let allocate = system_instruction::allocate(&alice_pubkey, data_len as u64); - - assert!(bank_client - .send_and_confirm_instruction(&alice_keypair, allocate) - .is_ok()); - } - - fn with_create_zero_lamport(callback: F) - where - F: Fn(&Bank), - { - solana_logger::setup(); - - let alice_keypair = Keypair::new(); - let bob_keypair = Keypair::new(); - - let alice_pubkey = alice_keypair.pubkey(); - let bob_pubkey = bob_keypair.pubkey(); - - let program = Pubkey::new_unique(); - let collector = Pubkey::new_unique(); - - let mint_lamports = sol_to_lamports(1.0); - let len1 = 123; - let len2 = 456; - - // create initial bank and fund the alice account - let (genesis_config, mint_keypair) = create_genesis_config(mint_lamports); - let bank = Arc::new(Bank::new_for_tests(&genesis_config)); - let bank_client = BankClient::new_shared(&bank); - bank_client - .transfer_and_confirm(mint_lamports, &mint_keypair, &alice_pubkey) - .unwrap(); - - // create zero-lamports account to be cleaned - let account = AccountSharedData::new(0, len1, &program); - let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); - bank.store_account(&bob_pubkey, &account); - - // transfer some to bogus pubkey just to make previous bank (=slot) really cleanable - let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); - let bank_client = BankClient::new_shared(&bank); - bank_client - .transfer_and_confirm( - genesis_config.rent.minimum_balance(0), - &alice_keypair, - &Pubkey::new_unique(), - ) - .unwrap(); - - // super fun time; callback chooses to .clean_accounts(None) or not - let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); - callback(&bank); - - // create a normal account at the same pubkey as the zero-lamports account - let lamports = genesis_config.rent.minimum_balance(len2); - let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); - let bank_client = BankClient::new_shared(&bank); - let ix = system_instruction::create_account( - &alice_pubkey, - &bob_pubkey, - lamports, - len2 as u64, - &program, - ); - let message = Message::new(&[ix], Some(&alice_pubkey)); - let r = bank_client.send_and_confirm_message(&[&alice_keypair, &bob_keypair], message); - assert!(r.is_ok()); - } - - #[test] - fn test_create_zero_lamport_with_clean() { - with_create_zero_lamport(|bank| { - bank.freeze(); - bank.squash(); - bank.force_flush_accounts_cache(); - // do clean and assert that it actually did its job - assert_eq!(4, bank.get_snapshot_storages(None).len()); - bank.clean_accounts(None); - assert_eq!(3, bank.get_snapshot_storages(None).len()); - }); - } - - #[test] - fn test_create_zero_lamport_without_clean() { - with_create_zero_lamport(|_| { - // just do nothing; this should behave identically with test_create_zero_lamport_with_clean - }); - } - - #[test] - fn test_assign_with_seed() { - let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0)); - let bank = Bank::new_for_tests(&genesis_config); - let bank_client = BankClient::new(bank); - - let alice_keypair = Keypair::new(); - let alice_pubkey = alice_keypair.pubkey(); - let seed = "seed"; - let owner = Pubkey::new_unique(); - let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap(); - - bank_client - .transfer_and_confirm( - genesis_config.rent.minimum_balance(0), - &mint_keypair, - &alice_pubkey, - ) - .unwrap(); - - let assign_with_seed = Message::new( - &[system_instruction::assign_with_seed( - &alice_with_seed, - &alice_pubkey, - seed, - &owner, - )], - Some(&alice_pubkey), - ); - - assert!(bank_client - .send_and_confirm_message(&[&alice_keypair], assign_with_seed) - .is_ok()); - } - - #[test] - fn test_system_unsigned_transaction() { - let (genesis_config, alice_keypair) = create_genesis_config(sol_to_lamports(1.0)); - let alice_pubkey = alice_keypair.pubkey(); - let mallory_keypair = Keypair::new(); - let mallory_pubkey = mallory_keypair.pubkey(); - let amount = genesis_config.rent.minimum_balance(0); - - // Fund to account to bypass AccountNotFound error - let bank = Bank::new_for_tests(&genesis_config); - let bank_client = BankClient::new(bank); - bank_client - .transfer_and_confirm(amount, &alice_keypair, &mallory_pubkey) - .unwrap(); - - // Erroneously sign transaction with recipient account key - // No signature case is tested by bank `test_zero_signatures()` - let account_metas = vec![ - AccountMeta::new(alice_pubkey, false), - AccountMeta::new(mallory_pubkey, true), - ]; - let malicious_instruction = Instruction::new_with_bincode( - system_program::id(), - &SystemInstruction::Transfer { lamports: amount }, - account_metas, - ); - assert_eq!( - bank_client - .send_and_confirm_instruction(&mallory_keypair, malicious_instruction) - .unwrap_err() - .unwrap(), - TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature) - ); - assert_eq!( - bank_client.get_balance(&alice_pubkey).unwrap(), - sol_to_lamports(1.0) - amount - ); - assert_eq!(bank_client.get_balance(&mallory_pubkey).unwrap(), amount); - } - fn process_nonce_instruction( instruction: Instruction, expected_result: Result<(), InstructionError>, diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index dd079e5d0096f5..0792abd6272708 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -56,6 +56,7 @@ solana-program-runtime = { workspace = true } solana-rayon-threadlimit = { workspace = true } solana-sdk = { workspace = true } solana-stake-program = { workspace = true } +solana-system-program = { workspace = true } solana-vote-program = { workspace = true } solana-zk-token-proof-program = { workspace = true } solana-zk-token-sdk = { workspace = true } diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index 33bee601e156a4..693cb819d7cc6f 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -18,7 +18,6 @@ use { rent_collector::RentCollector, rent_debits::RentDebits, storable_accounts::StorableAccounts, - system_instruction_processor::{get_system_account_kind, SystemAccountKind}, transaction_error_metrics::TransactionErrorMetrics, }, dashmap::DashMap, @@ -61,6 +60,7 @@ use { transaction::{Result, SanitizedTransaction, TransactionAccountLocks, TransactionError}, transaction_context::{IndexOfAccount, TransactionAccount}, }, + solana_system_program::{get_system_account_kind, SystemAccountKind}, std::{ cmp::Reverse, collections::{hash_map, BinaryHeap, HashMap, HashSet}, diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 1b00b619d48a34..2833c54ad71dd8 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -76,7 +76,6 @@ use { stakes::{InvalidCacheEntryReason, Stakes, StakesCache, StakesEnum}, status_cache::{SlotDelta, StatusCache}, storable_accounts::StorableAccounts, - system_instruction_processor::{get_system_account_kind, SystemAccountKind}, transaction_batch::TransactionBatch, transaction_error_metrics::TransactionErrorMetrics, vote_account::{VoteAccount, VoteAccountsHashMap}, @@ -164,6 +163,7 @@ use { solana_stake_program::stake_state::{ self, InflationPointCalculationEvent, PointValue, StakeState, }, + solana_system_program::{get_system_account_kind, SystemAccountKind}, solana_vote_program::vote_state::{VoteState, VoteStateVersions}, std::{ borrow::Cow, diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 4ba6e0375e9128..e52aa8f0892c5d 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -12971,3 +12971,201 @@ fn test_squash_timing_add_assign() { assert!(t0 == expected); } + +#[test] +fn test_system_instruction_allocate() { + let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0)); + let bank = Bank::new_for_tests(&genesis_config); + let bank_client = BankClient::new(bank); + let data_len = 2; + let amount = genesis_config.rent.minimum_balance(data_len); + + let alice_keypair = Keypair::new(); + let alice_pubkey = alice_keypair.pubkey(); + let seed = "seed"; + let owner = Pubkey::new_unique(); + let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap(); + + bank_client + .transfer_and_confirm(amount, &mint_keypair, &alice_pubkey) + .unwrap(); + + let allocate_with_seed = Message::new( + &[system_instruction::allocate_with_seed( + &alice_with_seed, + &alice_pubkey, + seed, + data_len as u64, + &owner, + )], + Some(&alice_pubkey), + ); + + assert!(bank_client + .send_and_confirm_message(&[&alice_keypair], allocate_with_seed) + .is_ok()); + + let allocate = system_instruction::allocate(&alice_pubkey, data_len as u64); + + assert!(bank_client + .send_and_confirm_instruction(&alice_keypair, allocate) + .is_ok()); +} + +fn with_create_zero_lamport(callback: F) +where + F: Fn(&Bank), +{ + solana_logger::setup(); + + let alice_keypair = Keypair::new(); + let bob_keypair = Keypair::new(); + + let alice_pubkey = alice_keypair.pubkey(); + let bob_pubkey = bob_keypair.pubkey(); + + let program = Pubkey::new_unique(); + let collector = Pubkey::new_unique(); + + let mint_lamports = sol_to_lamports(1.0); + let len1 = 123; + let len2 = 456; + + // create initial bank and fund the alice account + let (genesis_config, mint_keypair) = create_genesis_config(mint_lamports); + let bank = Arc::new(Bank::new_for_tests(&genesis_config)); + let bank_client = BankClient::new_shared(&bank); + bank_client + .transfer_and_confirm(mint_lamports, &mint_keypair, &alice_pubkey) + .unwrap(); + + // create zero-lamports account to be cleaned + let account = AccountSharedData::new(0, len1, &program); + let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); + bank.store_account(&bob_pubkey, &account); + + // transfer some to bogus pubkey just to make previous bank (=slot) really cleanable + let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); + let bank_client = BankClient::new_shared(&bank); + bank_client + .transfer_and_confirm( + genesis_config.rent.minimum_balance(0), + &alice_keypair, + &Pubkey::new_unique(), + ) + .unwrap(); + + // super fun time; callback chooses to .clean_accounts(None) or not + let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); + callback(&bank); + + // create a normal account at the same pubkey as the zero-lamports account + let lamports = genesis_config.rent.minimum_balance(len2); + let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1)); + let bank_client = BankClient::new_shared(&bank); + let ix = system_instruction::create_account( + &alice_pubkey, + &bob_pubkey, + lamports, + len2 as u64, + &program, + ); + let message = Message::new(&[ix], Some(&alice_pubkey)); + let r = bank_client.send_and_confirm_message(&[&alice_keypair, &bob_keypair], message); + assert!(r.is_ok()); +} + +#[test] +fn test_create_zero_lamport_with_clean() { + with_create_zero_lamport(|bank| { + bank.freeze(); + bank.squash(); + bank.force_flush_accounts_cache(); + // do clean and assert that it actually did its job + assert_eq!(4, bank.get_snapshot_storages(None).len()); + bank.clean_accounts(None); + assert_eq!(3, bank.get_snapshot_storages(None).len()); + }); +} + +#[test] +fn test_create_zero_lamport_without_clean() { + with_create_zero_lamport(|_| { + // just do nothing; this should behave identically with test_create_zero_lamport_with_clean + }); +} + +#[test] +fn test_system_instruction_assign_with_seed() { + let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0)); + let bank = Bank::new_for_tests(&genesis_config); + let bank_client = BankClient::new(bank); + + let alice_keypair = Keypair::new(); + let alice_pubkey = alice_keypair.pubkey(); + let seed = "seed"; + let owner = Pubkey::new_unique(); + let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap(); + + bank_client + .transfer_and_confirm( + genesis_config.rent.minimum_balance(0), + &mint_keypair, + &alice_pubkey, + ) + .unwrap(); + + let assign_with_seed = Message::new( + &[system_instruction::assign_with_seed( + &alice_with_seed, + &alice_pubkey, + seed, + &owner, + )], + Some(&alice_pubkey), + ); + + assert!(bank_client + .send_and_confirm_message(&[&alice_keypair], assign_with_seed) + .is_ok()); +} + +#[test] +fn test_system_instruction_unsigned_transaction() { + let (genesis_config, alice_keypair) = create_genesis_config(sol_to_lamports(1.0)); + let alice_pubkey = alice_keypair.pubkey(); + let mallory_keypair = Keypair::new(); + let mallory_pubkey = mallory_keypair.pubkey(); + let amount = genesis_config.rent.minimum_balance(0); + + // Fund to account to bypass AccountNotFound error + let bank = Bank::new_for_tests(&genesis_config); + let bank_client = BankClient::new(bank); + bank_client + .transfer_and_confirm(amount, &alice_keypair, &mallory_pubkey) + .unwrap(); + + // Erroneously sign transaction with recipient account key + // No signature case is tested by bank `test_zero_signatures()` + let account_metas = vec![ + AccountMeta::new(alice_pubkey, false), + AccountMeta::new(mallory_pubkey, true), + ]; + let malicious_instruction = Instruction::new_with_bincode( + system_program::id(), + &system_instruction::SystemInstruction::Transfer { lamports: amount }, + account_metas, + ); + assert_eq!( + bank_client + .send_and_confirm_instruction(&mallory_keypair, malicious_instruction) + .unwrap_err() + .unwrap(), + TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature) + ); + assert_eq!( + bank_client.get_balance(&alice_pubkey).unwrap(), + sol_to_lamports(1.0) - amount + ); + assert_eq!(bank_client.get_balance(&mallory_pubkey).unwrap(), amount); +} diff --git a/runtime/src/builtins.rs b/runtime/src/builtins.rs index 045d4da8409260..c24cbcd71d66da 100644 --- a/runtime/src/builtins.rs +++ b/runtime/src/builtins.rs @@ -1,9 +1,8 @@ #[cfg(RUSTC_WITH_SPECIALIZATION)] use solana_frozen_abi::abi_example::AbiExample; use { - crate::system_instruction_processor, solana_program_runtime::invoke_context::ProcessInstructionWithContext, - solana_sdk::{feature_set, pubkey::Pubkey, stake, system_program}, + solana_sdk::{feature_set, pubkey::Pubkey, stake}, std::fmt, }; @@ -118,8 +117,8 @@ fn genesis_builtins() -> Vec { vec![ Builtin::new( "system_program", - system_program::id(), - system_instruction_processor::process_instruction, + solana_system_program::id(), + solana_system_program::system_processor::process_instruction, ), Builtin::new( "vote_program", diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 29df330267ac27..9c6b1b13c5b2c3 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -48,7 +48,6 @@ pub mod inline_spl_token_2022; pub mod loader_utils; pub mod message_processor; pub mod non_circulating_supply; -mod nonce_keyed_account; pub mod prioritization_fee; pub mod prioritization_fee_cache; mod pubkey_bins; @@ -76,7 +75,6 @@ pub mod stakes; pub mod static_ids; pub mod status_cache; mod storable_accounts; -mod system_instruction_processor; pub mod transaction_batch; pub mod transaction_error_metrics; pub mod transaction_priority_details;