Selaa lähdekoodia

remove `solana-stake-program` (#8834)

hana 2 viikkoa sitten
vanhempi
sitoutus
58eb815ef2
47 muutettua tiedostoa jossa 340 lisäystä ja 525 poistoa
  1. 2 32
      Cargo.lock
  2. 0 2
      Cargo.toml
  3. 2 2
      accounts-db/Cargo.toml
  4. 51 3
      accounts-db/src/stake_rewards.rs
  5. 0 1
      builtins-default-costs/Cargo.toml
  6. 0 1
      builtins/Cargo.toml
  7. 0 1
      core/Cargo.toml
  8. 13 8
      core/src/commitment_service.rs
  9. 2 30
      dev-bins/Cargo.lock
  10. 0 1
      dev-bins/Cargo.toml
  11. 0 1
      genesis/Cargo.toml
  12. 3 3
      genesis/src/genesis_accounts.rs
  13. 13 7
      genesis/src/main.rs
  14. 4 7
      genesis/src/stakes.rs
  15. 0 1
      ledger-tool/Cargo.toml
  16. 2 2
      ledger-tool/src/main.rs
  17. 0 1
      ledger/Cargo.toml
  18. 2 2
      ledger/src/leader_schedule_cache.rs
  19. 0 1
      local-cluster/Cargo.toml
  20. 5 3
      local-cluster/src/local_cluster.rs
  21. 0 1
      program-test/Cargo.toml
  22. 2 2
      program-test/tests/warp.rs
  23. 2 27
      programs/sbf/Cargo.lock
  24. 0 40
      programs/stake/Cargo.toml
  25. 0 55
      programs/stake/src/config.rs
  26. 0 21
      programs/stake/src/epoch_rewards.rs
  27. 0 42
      programs/stake/src/lib.rs
  28. 0 45
      programs/stake/src/points.rs
  29. 0 127
      programs/stake/src/stake_state.rs
  30. 0 2
      rpc/Cargo.toml
  31. 3 3
      rpc/src/rpc.rs
  32. 1 1
      runtime/Cargo.toml
  33. 2 1
      runtime/src/bank.rs
  34. 2 2
      runtime/src/bank/partitioned_epoch_rewards/distribution.rs
  35. 2 1
      runtime/src/bank/partitioned_epoch_rewards/mod.rs
  36. 7 6
      runtime/src/bank/tests.rs
  37. 73 6
      runtime/src/genesis_utils.rs
  38. 5 2
      runtime/src/inflation_rewards/mod.rs
  39. 1 0
      runtime/src/lib.rs
  40. 3 2
      runtime/src/non_circulating_supply.rs
  41. 6 3
      runtime/src/stake_account.rs
  42. 65 0
      runtime/src/stake_utils.rs
  43. 36 11
      runtime/src/stakes.rs
  44. 8 5
      runtime/src/stakes/serde_stakes.rs
  45. 0 1
      stake-accounts/Cargo.toml
  46. 1 2
      stake-accounts/src/main.rs
  47. 22 8
      stake-accounts/src/stake_accounts.rs

+ 2 - 32
Cargo.lock

@@ -7256,7 +7256,7 @@ dependencies = [
  "solana-signer",
  "solana-slot-hashes",
  "solana-slot-history",
- "solana-stake-program",
+ "solana-stake-interface",
  "solana-svm",
  "solana-svm-transaction",
  "solana-system-interface",
@@ -7638,7 +7638,6 @@ dependencies = [
  "solana-program-runtime",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
  "solana-zk-elgamal-proof-program",
@@ -7660,7 +7659,6 @@ dependencies = [
  "solana-loader-v4-program",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
  "static_assertions",
@@ -8291,7 +8289,6 @@ dependencies = [
  "solana-signer",
  "solana-slot-hashes",
  "solana-slot-history",
- "solana-stake-program",
  "solana-streamer",
  "solana-svm",
  "solana-svm-timings",
@@ -8770,7 +8767,6 @@ dependencies = [
  "solana-sdk-ids",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-time-utils",
  "solana-version",
  "solana-vote",
@@ -9182,7 +9178,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-storage-proto",
  "solana-streamer",
@@ -9333,7 +9328,6 @@ dependencies = [
  "solana-signer",
  "solana-slot-hashes",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-streamer",
  "solana-system-interface",
  "solana-system-transaction",
@@ -9873,7 +9867,6 @@ dependencies = [
  "solana-signer",
  "solana-stable-layout",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-svm",
  "solana-svm-log-collector",
  "solana-svm-timings",
@@ -10103,7 +10096,6 @@ dependencies = [
  "solana-signer",
  "solana-slot-history",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-streamer",
  "solana-svm",
@@ -10365,6 +10357,7 @@ dependencies = [
  "solana-compute-budget",
  "solana-compute-budget-instruction",
  "solana-compute-budget-interface",
+ "solana-config-interface",
  "solana-cost-model",
  "solana-cpi",
  "solana-ed25519-program",
@@ -10416,7 +10409,6 @@ dependencies = [
  "solana-slot-hashes",
  "solana-slot-history",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-svm",
  "solana-svm-callback",
  "solana-svm-timings",
@@ -10783,7 +10775,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-sysvar",
  "solana-transaction",
  "solana-version",
@@ -10811,27 +10802,6 @@ dependencies = [
  "solana-sysvar-id",
 ]
 
-[[package]]
-name = "solana-stake-program"
-version = "4.0.0-alpha.0"
-dependencies = [
- "agave-feature-set",
- "bincode",
- "log",
- "solana-account",
- "solana-clock",
- "solana-config-interface",
- "solana-genesis-config",
- "solana-native-token",
- "solana-pubkey",
- "solana-rent",
- "solana-sdk-ids",
- "solana-stake-interface",
- "solana-sysvar",
- "solana-transaction-context",
- "solana-vote-interface",
-]
-
 [[package]]
 name = "solana-storage-bigtable"
 version = "4.0.0-alpha.0"

+ 0 - 2
Cargo.toml

@@ -69,7 +69,6 @@ members = [
     "programs/compute-budget-bench",
     "programs/ed25519-tests",
     "programs/loader-v4",
-    "programs/stake",
     "programs/system",
     "programs/vote",
     "programs/zk-elgamal-proof",
@@ -531,7 +530,6 @@ solana-slot-hashes = "3.0.0"
 solana-slot-history = "3.0.0"
 solana-stable-layout = "3.0.0"
 solana-stake-interface = { version = "2.0.1" }
-solana-stake-program = { path = "programs/stake", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-storage-bigtable = { path = "storage-bigtable", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-storage-proto = { path = "storage-proto", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-streamer = { path = "streamer", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }

+ 2 - 2
accounts-db/Cargo.toml

@@ -23,7 +23,7 @@ dev-context-only-utils = [
     "dep:solana-keypair",
     "dep:solana-rent",
     "dep:solana-signer",
-    "dep:solana-stake-program",
+    "dep:solana-stake-interface",
     "dep:solana-vote-program",
     "solana-account/dev-context-only-utils",
     "solana-transaction/dev-context-only-utils",
@@ -89,7 +89,7 @@ solana-reward-info = { workspace = true, features = ["serde"] }
 solana-sha256-hasher = { workspace = true }
 solana-signer = { workspace = true, optional = true }
 solana-slot-hashes = { workspace = true }
-solana-stake-program = { workspace = true, optional = true }
+solana-stake-interface = { workspace = true, optional = true }
 solana-svm-transaction = { workspace = true }
 solana-system-interface = { workspace = true }
 solana-sysvar = { workspace = true }

+ 51 - 3
accounts-db/src/stake_rewards.rs

@@ -65,8 +65,18 @@ impl<'a> StorableAccounts<'a> for (Slot, &'a [StakeReward]) {
 
 #[cfg(feature = "dev-context-only-utils")]
 use {
-    rand::Rng, solana_account::WritableAccount, solana_keypair::Keypair, solana_rent::Rent,
-    solana_signer::Signer, solana_stake_program::stake_state, solana_vote_program::vote_state,
+    rand::Rng,
+    solana_account::{state_traits::StateMut, WritableAccount},
+    solana_clock::Epoch,
+    solana_keypair::Keypair,
+    solana_rent::Rent,
+    solana_signer::Signer,
+    solana_stake_interface::{
+        program as stake_program,
+        stake_flags::StakeFlags,
+        state::{Authorized, Delegation, Meta, Stake, StakeStateV2},
+    },
+    solana_vote_program::vote_state,
 };
 
 // These functions/fields are only usable from a dev context (i.e. tests and benches)
@@ -92,7 +102,7 @@ impl StakeReward {
         );
 
         let reward_lamports: i64 = rng.gen_range(1..200);
-        let validator_stake_account = stake_state::create_account(
+        let validator_stake_account = create_stake_account(
             &validator_staking_keypair.pubkey(),
             &validator_voting_keypair.pubkey(),
             &validator_vote_account,
@@ -119,3 +129,41 @@ impl StakeReward {
         self.stake_account.checked_add_lamports(amount).unwrap();
     }
 }
+
+#[cfg(feature = "dev-context-only-utils")]
+fn create_stake_account(
+    authorized: &Pubkey,
+    voter_pubkey: &Pubkey,
+    vote_account: &AccountSharedData,
+    rent: &Rent,
+    lamports: u64,
+) -> AccountSharedData {
+    let mut stake_account =
+        AccountSharedData::new(lamports, StakeStateV2::size_of(), &stake_program::id());
+
+    let vote_state =
+        vote_state::VoteStateV4::deserialize(vote_account.data(), voter_pubkey).unwrap();
+    let credits_observed = vote_state.credits();
+
+    let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
+    let stake_amount = lamports
+        .checked_sub(rent_exempt_reserve)
+        .expect("lamports >= rent_exempt_reserve");
+
+    let meta = Meta {
+        authorized: Authorized::auto(authorized),
+        rent_exempt_reserve,
+        ..Meta::default()
+    };
+
+    let stake = Stake {
+        delegation: Delegation::new(voter_pubkey, stake_amount, Epoch::MAX),
+        credits_observed,
+    };
+
+    stake_account
+        .set_state(&StakeStateV2::Stake(meta, stake, StakeFlags::empty()))
+        .expect("set_state");
+
+    stake_account
+}

+ 0 - 1
builtins-default-costs/Cargo.toml

@@ -35,7 +35,6 @@ solana-frozen-abi = { workspace = true, optional = true, features = [
 solana-loader-v4-program = { workspace = true, features = ["agave-unstable-api"] }
 solana-pubkey = { workspace = true }
 solana-sdk-ids = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-system-program = { workspace = true }
 solana-vote-program = { workspace = true }
 

+ 0 - 1
builtins/Cargo.toml

@@ -22,7 +22,6 @@ solana-loader-v4-program = { workspace = true }
 solana-program-runtime = { workspace = true }
 solana-pubkey = { workspace = true }
 solana-sdk-ids = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-system-program = { workspace = true }
 solana-vote-program = { workspace = true }
 solana-zk-elgamal-proof-program = { workspace = true }

+ 0 - 1
core/Cargo.toml

@@ -213,7 +213,6 @@ solana-poh = { workspace = true, features = ["dev-context-only-utils"] }
 solana-program-binaries = { workspace = true }
 solana-program-runtime = { workspace = true, features = ["metrics"] }
 solana-rpc = { workspace = true, features = ["dev-context-only-utils"] }
-solana-stake-program = { workspace = true }
 solana-system-program = { workspace = true }
 solana-unified-scheduler-pool = { workspace = true, features = [
     "dev-context-only-utils",

+ 13 - 8
core/src/commitment_service.rs

@@ -274,11 +274,11 @@ mod tests {
         solana_account::{state_traits::StateMut, Account, ReadableAccount},
         solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo},
         solana_pubkey::Pubkey,
-        solana_runtime::genesis_utils::{
-            create_genesis_config_with_vote_accounts, ValidatorVoteKeypairs,
+        solana_runtime::{
+            genesis_utils::{create_genesis_config_with_vote_accounts, ValidatorVoteKeypairs},
+            stake_utils,
         },
         solana_signer::Signer,
-        solana_stake_program::stake_state,
         solana_vote::vote_transaction,
         solana_vote_program::vote_state::{
             self, process_slot_vote_unchecked, TowerSync, VoteStateV4, VoteStateVersions,
@@ -409,8 +409,13 @@ mod tests {
             0,
             100,
         );
-        let stake_account1 =
-            stake_state::create_account(&sk1, &pk1, &vote_account1, &genesis_config.rent, 100);
+        let stake_account1 = stake_utils::create_stake_account(
+            &sk1,
+            &pk1,
+            &vote_account1,
+            &genesis_config.rent,
+            100,
+        );
         let sk2 = solana_pubkey::new_rand();
         let pk2 = solana_pubkey::new_rand();
         let mut vote_account2 = vote_state::create_v4_account_with_authorized(
@@ -422,7 +427,7 @@ mod tests {
             50,
         );
         let stake_account2 =
-            stake_state::create_account(&sk2, &pk2, &vote_account2, &genesis_config.rent, 50);
+            stake_utils::create_stake_account(&sk2, &pk2, &vote_account2, &genesis_config.rent, 50);
         let sk3 = solana_pubkey::new_rand();
         let pk3 = solana_pubkey::new_rand();
         let mut vote_account3 = vote_state::create_v4_account_with_authorized(
@@ -433,7 +438,7 @@ mod tests {
             0,
             1,
         );
-        let stake_account3 = stake_state::create_account(
+        let stake_account3 = stake_utils::create_stake_account(
             &sk3,
             &pk3,
             &vote_account3,
@@ -450,7 +455,7 @@ mod tests {
             0,
             1,
         );
-        let stake_account4 = stake_state::create_account(
+        let stake_account4 = stake_utils::create_stake_account(
             &sk4,
             &pk4,
             &vote_account4,

+ 2 - 30
dev-bins/Cargo.lock

@@ -175,7 +175,6 @@ dependencies = [
  "solana-shred-version",
  "solana-signature",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-streamer",
  "solana-svm-callback",
@@ -6207,7 +6206,7 @@ dependencies = [
  "solana-sha256-hasher",
  "solana-signer",
  "solana-slot-hashes",
- "solana-stake-program",
+ "solana-stake-interface",
  "solana-svm-transaction",
  "solana-system-interface",
  "solana-sysvar",
@@ -6596,7 +6595,6 @@ dependencies = [
  "solana-program-runtime",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
  "solana-zk-elgamal-proof-program",
@@ -6615,7 +6613,6 @@ dependencies = [
  "solana-loader-v4-program",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
 ]
@@ -7393,7 +7390,6 @@ dependencies = [
  "solana-sdk-ids",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-time-utils",
  "solana-version",
  "solana-vote-program",
@@ -7740,7 +7736,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-storage-proto",
  "solana-streamer",
@@ -7878,7 +7873,6 @@ dependencies = [
  "solana-signer",
  "solana-slot-hashes",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-streamer",
  "solana-system-interface",
  "solana-system-transaction",
@@ -8493,7 +8487,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-slot-history",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-streamer",
  "solana-svm",
@@ -8677,6 +8670,7 @@ dependencies = [
  "solana-compute-budget",
  "solana-compute-budget-instruction",
  "solana-compute-budget-interface",
+ "solana-config-interface",
  "solana-cost-model",
  "solana-cpi",
  "solana-ed25519-program",
@@ -8723,7 +8717,6 @@ dependencies = [
  "solana-slot-hashes",
  "solana-slot-history",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-svm",
  "solana-svm-callback",
  "solana-svm-timings",
@@ -9053,27 +9046,6 @@ dependencies = [
  "solana-sysvar-id",
 ]
 
-[[package]]
-name = "solana-stake-program"
-version = "4.0.0-alpha.0"
-dependencies = [
- "agave-feature-set",
- "bincode",
- "log",
- "solana-account",
- "solana-clock",
- "solana-config-interface",
- "solana-genesis-config",
- "solana-native-token",
- "solana-pubkey",
- "solana-rent",
- "solana-sdk-ids",
- "solana-stake-interface",
- "solana-sysvar",
- "solana-transaction-context",
- "solana-vote-interface",
-]
-
 [[package]]
 name = "solana-storage-bigtable"
 version = "4.0.0-alpha.0"

+ 0 - 1
dev-bins/Cargo.toml

@@ -127,7 +127,6 @@ solana-shred-version = "3.0.0"
 solana-signature = { version = "3.1.0", default-features = false }
 solana-signer = "3.0.0"
 solana-stake-interface = { version = "2.0.1" }
-solana-stake-program = { path = "../programs/stake", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-storage-bigtable = { path = "../storage-bigtable", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-streamer = { path = "../streamer", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }
 solana-svm-callback = { path = "../svm-callback", version = "=4.0.0-alpha.0", features = ["agave-unstable-api"] }

+ 0 - 1
genesis/Cargo.toml

@@ -61,7 +61,6 @@ solana-runtime = { workspace = true }
 solana-sdk-ids = "=3.0.0"
 solana-signer = "=3.0.0"
 solana-stake-interface = { version = "=2.0.1", features = ["borsh"] }
-solana-stake-program = { workspace = true }
 solana-time-utils = "3.0.0"
 solana-version = { workspace = true }
 solana-vote-program = { workspace = true }

+ 3 - 3
genesis/src/genesis_accounts.rs

@@ -230,7 +230,7 @@ fn add_stakes(
 }
 
 /// Add accounts that should be present in genesis; skip for development clusters
-pub fn add_genesis_accounts(genesis_config: &mut GenesisConfig, mut issued_lamports: u64) {
+pub fn add_genesis_stake_accounts(genesis_config: &mut GenesisConfig, mut issued_lamports: u64) {
     if genesis_config.cluster_type == ClusterType::Development {
         return;
     }
@@ -275,7 +275,7 @@ mod tests {
     use super::*;
 
     #[test]
-    fn test_add_genesis_accounts() {
+    fn test_add_genesis_stake_accounts() {
         let clusters_and_expected_lamports = [
             (ClusterType::MainnetBeta, 500_000_000 * LAMPORTS_PER_SOL),
             (ClusterType::Testnet, 500_000_000 * LAMPORTS_PER_SOL),
@@ -288,7 +288,7 @@ mod tests {
                 cluster_type: *cluster_type,
                 ..GenesisConfig::default()
             };
-            add_genesis_accounts(&mut genesis_config, 0);
+            add_genesis_stake_accounts(&mut genesis_config, 0);
 
             let lamports = genesis_config
                 .accounts

+ 13 - 7
genesis/src/main.rs

@@ -26,7 +26,7 @@ use {
     solana_feature_gate_interface as feature,
     solana_fee_calculator::FeeRateGovernor,
     solana_genesis::{
-        genesis_accounts::add_genesis_accounts, Base64Account, StakedValidatorAccountInfo,
+        genesis_accounts::add_genesis_stake_accounts, Base64Account, StakedValidatorAccountInfo,
         ValidatorAccountsFile,
     },
     solana_genesis_config::GenesisConfig,
@@ -41,11 +41,16 @@ use {
     solana_rent::Rent,
     solana_rpc_client::rpc_client::RpcClient,
     solana_rpc_client_api::request::MAX_MULTIPLE_ACCOUNTS,
-    solana_runtime::genesis_utils::bls_pubkey_to_compressed_bytes,
+    solana_runtime::{
+        genesis_utils::{
+            add_genesis_epoch_rewards_account, add_genesis_stake_config_account,
+            bls_pubkey_to_compressed_bytes,
+        },
+        stake_utils,
+    },
     solana_sdk_ids::system_program,
     solana_signer::Signer,
     solana_stake_interface::state::StakeStateV2,
-    solana_stake_program::stake_state,
     solana_vote_program::vote_state::{self, VoteStateV4},
     std::{
         collections::HashMap,
@@ -272,7 +277,7 @@ fn add_validator_accounts(
 
         genesis_config.add_account(
             *stake_pubkey,
-            stake_state::create_account(
+            stake_utils::create_stake_account(
                 authorized_pubkey.unwrap_or(identity_pubkey),
                 vote_pubkey,
                 &vote_account,
@@ -793,7 +798,8 @@ fn main() -> Result<(), Box<dyn error::Error>> {
         );
     }
 
-    solana_stake_program::add_genesis_accounts(&mut genesis_config);
+    add_genesis_stake_config_account(&mut genesis_config);
+    add_genesis_epoch_rewards_account(&mut genesis_config);
 
     if is_alpenglow {
         solana_runtime::genesis_utils::activate_all_features_alpenglow(&mut genesis_config);
@@ -829,7 +835,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
         .map(|account| account.lamports)
         .sum::<u64>();
 
-    add_genesis_accounts(&mut genesis_config, issued_lamports - faucet_lamports);
+    add_genesis_stake_accounts(&mut genesis_config, issued_lamports - faucet_lamports);
 
     let parse_address = |address: &str, input_type: &str| {
         address.parse::<Pubkey>().unwrap_or_else(|err| {
@@ -1422,7 +1428,7 @@ mod tests {
                     let stake_account = AccountSharedData::new(
                         b64_account.stake_lamports,
                         StakeStateV2::size_of(),
-                        &solana_stake_program::id(),
+                        &stake::program::id(),
                     );
                     let rent_exempt_reserve =
                         &Rent::default().minimum_balance(stake_account.data().len());

+ 4 - 7
genesis/src/stakes.rs

@@ -8,12 +8,9 @@ use {
     solana_clock::Slot,
     solana_genesis_config::GenesisConfig,
     solana_pubkey::Pubkey,
-    solana_sdk_ids::system_program,
-    solana_stake_interface::{
-        self as stake,
-        state::{Authorized, Lockup, StakeStateV2},
-    },
-    solana_stake_program::stake_state::create_lockup_stake_account,
+    solana_runtime::genesis_utils::create_lockup_stake_account,
+    solana_sdk_ids::{stake as stake_program, system_program},
+    solana_stake_interface::state::{Authorized, Lockup, StakeStateV2},
     solana_time_utils::years_as_slots,
 };
 
@@ -103,7 +100,7 @@ pub fn create_and_add_stakes(
         genesis_config.ticks_per_slot,
     );
 
-    let mut address_generator = AddressGenerator::new(&authorized.staker, &stake::program::id());
+    let mut address_generator = AddressGenerator::new(&authorized.staker, &stake_program::id());
 
     let stake_rent_reserve = genesis_config.rent.minimum_balance(StakeStateV2::size_of());
 

+ 0 - 1
ledger-tool/Cargo.toml

@@ -79,7 +79,6 @@ solana-sdk-ids = { workspace = true }
 solana-shred-version = { workspace = true }
 solana-signature = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-storage-bigtable = { workspace = true }
 solana-streamer = { workspace = true }
 solana-svm-callback = { workspace = true }

+ 2 - 2
ledger-tool/src/main.rs

@@ -70,11 +70,11 @@ use {
         installed_scheduler_pool::BankWithScheduler,
         snapshot_bank_utils,
         snapshot_minimizer::SnapshotMinimizer,
+        stake_utils,
     },
     solana_runtime_transaction::runtime_transaction::RuntimeTransaction,
     solana_shred_version::compute_shred_version,
     solana_stake_interface::{self as stake, state::StakeStateV2},
-    solana_stake_program::stake_state,
     solana_system_interface::program as system_program,
     solana_transaction::sanitized::MessageHash,
     solana_transaction_status::parse_ui_instruction,
@@ -2345,7 +2345,7 @@ fn main() {
 
                             bank.store_account(
                                 stake_pubkey,
-                                &stake_state::create_account(
+                                &stake_utils::create_stake_account(
                                     bootstrap_stake_authorized_pubkey
                                         .as_ref()
                                         .unwrap_or(identity_pubkey),

+ 0 - 1
ledger/Cargo.toml

@@ -98,7 +98,6 @@ solana-shred-version = { workspace = true }
 solana-signature = { workspace = true }
 solana-signer = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-storage-bigtable = { workspace = true }
 solana-storage-proto = { workspace = true }
 solana-streamer = { workspace = true }

+ 2 - 2
ledger/src/leader_schedule_cache.rs

@@ -260,7 +260,7 @@ mod tests {
             EpochSchedule, DEFAULT_LEADER_SCHEDULE_SLOT_OFFSET, MINIMUM_SLOTS_PER_EPOCH,
         },
         solana_keypair::Keypair,
-        solana_runtime::bank::Bank,
+        solana_runtime::stake_utils,
         solana_signer::Signer,
         std::{sync::Arc, thread::Builder},
     };
@@ -517,7 +517,7 @@ mod tests {
             &vote_account,
             &validator_identity,
             bootstrap_validator_stake_lamports()
-                + solana_stake_program::get_minimum_delegation(
+                + stake_utils::get_minimum_delegation(
                     bank.feature_set.is_active(
                         &agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id(),
                     ),

+ 0 - 1
local-cluster/Cargo.toml

@@ -57,7 +57,6 @@ solana-shred-version = { workspace = true }
 solana-signer = { workspace = true }
 solana-slot-hashes = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-streamer = { workspace = true }
 solana-system-interface = { workspace = true }
 solana-system-transaction = { workspace = true }

+ 5 - 3
local-cluster/src/local_cluster.rs

@@ -42,9 +42,8 @@ use {
     solana_signer::{signers::Signers, Signer},
     solana_stake_interface::{
         instruction as stake_instruction,
-        state::{Authorized, Lockup},
+        state::{Authorized, Lockup, StakeStateV2},
     },
-    solana_stake_program::stake_state,
     solana_streamer::{socket::SocketAddrSpace, streamer::StakedNodes},
     solana_system_transaction as system_transaction,
     solana_tpu_client::tpu_client::{
@@ -1106,7 +1105,10 @@ impl LocalCluster {
                 match (stake_account.value, vote_account.value) {
                     (Some(stake_account), Some(vote_account)) => {
                         match (
-                            stake_state::stake_from(&stake_account),
+                            stake_account
+                                .deserialize_data::<StakeStateV2>()
+                                .ok()
+                                .and_then(|state| state.stake()),
                             VoteStateV4::deserialize(vote_account.data(), &vote_account_pubkey)
                                 .ok(),
                         ) {

+ 0 - 1
program-test/Cargo.toml

@@ -74,5 +74,4 @@ tokio = { workspace = true, features = ["full"] }
 solana-cpi = { workspace = true }
 solana-program = { workspace = true }
 solana-program-test = { path = ".", features = ["agave-unstable-api"] }
-solana-stake-program = { workspace = true }
 test-case = { workspace = true }

+ 2 - 2
program-test/tests/warp.rs

@@ -16,6 +16,7 @@ use {
     solana_program_test::{processor, ProgramTest, ProgramTestBanksClientExt, ProgramTestError},
     solana_pubkey::Pubkey,
     solana_rent::Rent,
+    solana_runtime::stake_utils,
     solana_signer::Signer,
     solana_stake_interface::{
         instruction as stake_instruction,
@@ -23,7 +24,6 @@ use {
         state::{StakeActivationStatus, StakeStateV2},
         sysvar::stake_history,
     },
-    solana_stake_program::stake_state,
     solana_sysvar::{clock, SysvarSerialize},
     solana_transaction::Transaction,
     solana_transaction_error::TransactionError,
@@ -235,7 +235,7 @@ async fn stake_rewards_filter_bench_core(num_stake_accounts: u64) {
     let mut to_filter = vec![];
     for i in 0..num_stake_accounts {
         let stake_pubkey = Pubkey::new_unique();
-        let stake_account = Account::from(stake_state::create_account(
+        let stake_account = Account::from(stake_utils::create_stake_account(
             &stake_pubkey,
             &vote_address,
             &vote_account,

+ 2 - 27
programs/sbf/Cargo.lock

@@ -6146,7 +6146,7 @@ dependencies = [
  "solana-sha256-hasher",
  "solana-signer",
  "solana-slot-hashes",
- "solana-stake-program",
+ "solana-stake-interface",
  "solana-svm-transaction",
  "solana-system-interface",
  "solana-sysvar",
@@ -6431,7 +6431,6 @@ dependencies = [
  "solana-program-runtime",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
  "solana-zk-elgamal-proof-program",
@@ -6450,7 +6449,6 @@ dependencies = [
  "solana-loader-v4-program",
  "solana-pubkey",
  "solana-sdk-ids",
- "solana-stake-program",
  "solana-system-program",
  "solana-vote-program",
 ]
@@ -7516,7 +7514,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-storage-proto",
  "solana-streamer",
@@ -8247,7 +8244,6 @@ dependencies = [
  "solana-signature",
  "solana-signer",
  "solana-slot-history",
- "solana-stake-program",
  "solana-storage-bigtable",
  "solana-streamer",
  "solana-svm",
@@ -8431,6 +8427,7 @@ dependencies = [
  "solana-compute-budget",
  "solana-compute-budget-instruction",
  "solana-compute-budget-interface",
+ "solana-config-interface",
  "solana-cost-model",
  "solana-cpi",
  "solana-ed25519-program",
@@ -8477,7 +8474,6 @@ dependencies = [
  "solana-slot-hashes",
  "solana-slot-history",
  "solana-stake-interface",
- "solana-stake-program",
  "solana-svm",
  "solana-svm-callback",
  "solana-svm-timings",
@@ -9566,27 +9562,6 @@ dependencies = [
  "solana-sysvar-id",
 ]
 
-[[package]]
-name = "solana-stake-program"
-version = "4.0.0-alpha.0"
-dependencies = [
- "agave-feature-set",
- "bincode",
- "log",
- "solana-account",
- "solana-clock",
- "solana-config-interface",
- "solana-genesis-config",
- "solana-native-token",
- "solana-pubkey",
- "solana-rent",
- "solana-sdk-ids",
- "solana-stake-interface",
- "solana-sysvar",
- "solana-transaction-context",
- "solana-vote-interface",
-]
-
 [[package]]
 name = "solana-storage-bigtable"
 version = "4.0.0-alpha.0"

+ 0 - 40
programs/stake/Cargo.toml

@@ -1,40 +0,0 @@
-[package]
-name = "solana-stake-program"
-description = "Solana Stake program helpers"
-documentation = "https://docs.rs/solana-stake-program"
-version = { workspace = true }
-authors = { workspace = true }
-repository = { workspace = true }
-homepage = { workspace = true }
-license = { workspace = true }
-edition = { workspace = true }
-
-[package.metadata.docs.rs]
-targets = ["x86_64-unknown-linux-gnu"]
-
-[lib]
-crate-type = ["lib"]
-name = "solana_stake_program"
-
-[features]
-agave-unstable-api = []
-
-[dependencies]
-agave-feature-set = { workspace = true }
-bincode = { workspace = true }
-log = { workspace = true }
-solana-account = { workspace = true }
-solana-clock = { workspace = true }
-solana-config-interface = { workspace = true, features = ["bincode"] }
-solana-genesis-config = { workspace = true }
-solana-native-token = { workspace = true }
-solana-pubkey = { workspace = true }
-solana-rent = { workspace = true }
-solana-sdk-ids = { workspace = true }
-solana-stake-interface = { workspace = true, features = ["bincode"] }
-solana-sysvar = { workspace = true }
-solana-transaction-context = { workspace = true, features = ["bincode"] }
-solana-vote-interface = { workspace = true, features = ["bincode"] }
-
-[lints]
-workspace = true

+ 0 - 55
programs/stake/src/config.rs

@@ -1,55 +0,0 @@
-//! config for staking
-//!  carries variables that the stake program cares about
-#[deprecated(
-    since = "1.8.0",
-    note = "Please use `solana_stake_interface::config` instead"
-)]
-pub use solana_stake_interface::config::*;
-use {
-    bincode::{deserialize, serialize},
-    solana_account::{Account, AccountSharedData, ReadableAccount, WritableAccount},
-    solana_config_interface::state::{get_config_data, ConfigKeys},
-    solana_genesis_config::GenesisConfig,
-    solana_pubkey::Pubkey,
-    solana_transaction_context::BorrowedInstructionAccount,
-};
-
-#[allow(deprecated)]
-fn create_config_account(
-    keys: Vec<(Pubkey, bool)>,
-    config_data: &Config,
-    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_ids::config::id(),
-        ..Account::default()
-    })
-}
-
-#[allow(deprecated)]
-pub fn from(account: &BorrowedInstructionAccount) -> Option<Config> {
-    get_config_data(account.get_data())
-        .ok()
-        .and_then(|data| deserialize(data).ok())
-}
-
-#[allow(deprecated)]
-pub fn create_account(lamports: u64, config: &Config) -> AccountSharedData {
-    create_config_account(vec![], config, lamports)
-}
-
-#[allow(deprecated)]
-pub fn add_genesis_account(genesis_config: &mut GenesisConfig) -> u64 {
-    let mut account = create_config_account(vec![], &Config::default(), 0);
-    let lamports = std::cmp::max(genesis_config.rent.minimum_balance(account.data().len()), 1);
-
-    account.set_lamports(lamports);
-
-    genesis_config.add_account(solana_stake_interface::config::id(), account);
-
-    lamports
-}

+ 0 - 21
programs/stake/src/epoch_rewards.rs

@@ -1,21 +0,0 @@
-//! Creates the initial empty EpochRewards sysvar
-use {
-    solana_account::{AccountSharedData, WritableAccount},
-    solana_genesis_config::GenesisConfig,
-    solana_sdk_ids::sysvar,
-    solana_sysvar::{
-        epoch_rewards::{self, EpochRewards},
-        SysvarSerialize,
-    },
-};
-
-pub fn add_genesis_account(genesis_config: &mut GenesisConfig) -> u64 {
-    let data = vec![0; EpochRewards::size_of()];
-    let lamports = std::cmp::max(genesis_config.rent.minimum_balance(data.len()), 1);
-
-    let account = AccountSharedData::create(lamports, data, sysvar::id(), false, u64::MAX);
-
-    genesis_config.add_account(epoch_rewards::id(), account);
-
-    lamports
-}

+ 0 - 42
programs/stake/src/lib.rs

@@ -1,42 +0,0 @@
-#![cfg_attr(
-    not(feature = "agave-unstable-api"),
-    deprecated(
-        since = "3.1.0",
-        note = "This crate has been marked for formal inclusion in the Agave Unstable API. From \
-                v4.0.0 onward, the `agave-unstable-api` crate feature must be specified to \
-                acknowledge use of an interface that may break without warning."
-    )
-)]
-#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
-#![allow(clippy::arithmetic_side_effects)]
-#[deprecated(
-    since = "1.8.0",
-    note = "Please use `solana_sdk_ids::sysvar::stake::id` instead"
-)]
-pub use solana_sdk_ids::stake::{check_id, id};
-use {solana_genesis_config::GenesisConfig, solana_native_token::LAMPORTS_PER_SOL};
-
-pub mod config;
-pub mod epoch_rewards;
-#[deprecated(since = "2.2.0")]
-pub mod points;
-pub mod stake_state;
-
-pub fn add_genesis_accounts(genesis_config: &mut GenesisConfig) -> u64 {
-    let config_lamports = config::add_genesis_account(genesis_config);
-    let rewards_lamports = epoch_rewards::add_genesis_account(genesis_config);
-    config_lamports.saturating_add(rewards_lamports)
-}
-
-/// The minimum stake amount that can be delegated, in lamports.
-/// NOTE: This is also used to calculate the minimum balance of a delegated stake account,
-/// which is the rent exempt reserve _plus_ the minimum stake delegation.
-#[inline(always)]
-pub fn get_minimum_delegation(is_stake_raise_minimum_delegation_to_1_sol_active: bool) -> u64 {
-    if is_stake_raise_minimum_delegation_to_1_sol_active {
-        const MINIMUM_DELEGATION_SOL: u64 = 1;
-        MINIMUM_DELEGATION_SOL * LAMPORTS_PER_SOL
-    } else {
-        1
-    }
-}

+ 0 - 45
programs/stake/src/points.rs

@@ -1,45 +0,0 @@
-//! Information about points calculation based on stake state.
-//! Used by `solana-runtime`.
-
-use {solana_pubkey::Pubkey, solana_stake_interface::state::Delegation};
-
-/// captures a rewards round as lamports to be awarded
-///  and the total points over which those lamports
-///  are to be distributed
-//  basically read as rewards/points, but in integers instead of as an f64
-#[derive(Clone, Debug, PartialEq, Eq)]
-pub struct PointValue {
-    pub rewards: u64, // lamports to split
-    pub points: u128, // over these points
-}
-
-#[derive(Debug)]
-pub enum InflationPointCalculationEvent {
-    CalculatedPoints(u64, u128, u128, u128),
-    SplitRewards(u64, u64, u64, PointValue),
-    EffectiveStakeAtRewardedEpoch(u64),
-    RentExemptReserve(u64),
-    Delegation(Delegation, Pubkey),
-    Commission(u8),
-    CreditsObserved(u64, Option<u64>),
-    Skipped(SkippedReason),
-}
-
-#[derive(Debug)]
-pub enum SkippedReason {
-    DisabledInflation,
-    JustActivated,
-    TooEarlyUnfairSplit,
-    ZeroPoints,
-    ZeroPointValue,
-    ZeroReward,
-    ZeroCreditsAndReturnZero,
-    ZeroCreditsAndReturnCurrent,
-    ZeroCreditsAndReturnRewinded,
-}
-
-impl From<SkippedReason> for InflationPointCalculationEvent {
-    fn from(reason: SkippedReason) -> Self {
-        InflationPointCalculationEvent::Skipped(reason)
-    }
-}

+ 0 - 127
programs/stake/src/stake_state.rs

@@ -1,127 +0,0 @@
-//! Stake state: helper functions for creating and parsing account data
-
-#[deprecated(
-    since = "1.8.0",
-    note = "Please use `solana_stake_interface::state` instead"
-)]
-pub use solana_stake_interface::state::*;
-use {
-    solana_account::{state_traits::StateMut, AccountSharedData, ReadableAccount},
-    solana_clock::Epoch,
-    solana_pubkey::Pubkey,
-    solana_rent::Rent,
-    solana_sdk_ids::stake::id,
-    solana_stake_interface::stake_flags::StakeFlags,
-    solana_vote_interface::state::VoteStateV4,
-};
-
-// utility function, used by Stakes, tests
-pub fn from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<StakeStateV2> {
-    account.state().ok()
-}
-
-pub fn stake_from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<Stake> {
-    from(account).and_then(|state: StakeStateV2| state.stake())
-}
-
-pub fn delegation_from(account: &AccountSharedData) -> Option<Delegation> {
-    from(account).and_then(|state: StakeStateV2| state.delegation())
-}
-
-pub fn authorized_from(account: &AccountSharedData) -> Option<Authorized> {
-    from(account).and_then(|state: StakeStateV2| state.authorized())
-}
-
-pub fn lockup_from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<Lockup> {
-    from(account).and_then(|state: StakeStateV2| state.lockup())
-}
-
-pub fn meta_from(account: &AccountSharedData) -> Option<Meta> {
-    from(account).and_then(|state: StakeStateV2| state.meta())
-}
-
-fn new_stake(stake: u64, voter_pubkey: &Pubkey, credits: u64, activation_epoch: Epoch) -> Stake {
-    Stake {
-        delegation: Delegation::new(voter_pubkey, stake, activation_epoch),
-        credits_observed: credits,
-    }
-}
-
-// genesis investor accounts
-pub fn create_lockup_stake_account(
-    authorized: &Authorized,
-    lockup: &Lockup,
-    rent: &Rent,
-    lamports: u64,
-) -> AccountSharedData {
-    let mut stake_account = AccountSharedData::new(lamports, StakeStateV2::size_of(), &id());
-
-    let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
-    assert!(
-        lamports >= rent_exempt_reserve,
-        "lamports: {lamports} is less than rent_exempt_reserve {rent_exempt_reserve}"
-    );
-
-    stake_account
-        .set_state(&StakeStateV2::Initialized(Meta {
-            authorized: *authorized,
-            lockup: *lockup,
-            rent_exempt_reserve,
-        }))
-        .expect("set_state");
-
-    stake_account
-}
-
-// utility function, used by Bank, tests, genesis for bootstrap
-pub fn create_account(
-    authorized: &Pubkey,
-    voter_pubkey: &Pubkey,
-    vote_account: &AccountSharedData,
-    rent: &Rent,
-    lamports: u64,
-) -> AccountSharedData {
-    do_create_account(
-        authorized,
-        voter_pubkey,
-        vote_account,
-        rent,
-        lamports,
-        Epoch::MAX,
-    )
-}
-
-fn do_create_account(
-    authorized: &Pubkey,
-    voter_pubkey: &Pubkey,
-    vote_account: &AccountSharedData,
-    rent: &Rent,
-    lamports: u64,
-    activation_epoch: Epoch,
-) -> AccountSharedData {
-    let mut stake_account = AccountSharedData::new(lamports, StakeStateV2::size_of(), &id());
-
-    let vote_state = VoteStateV4::deserialize(vote_account.data(), voter_pubkey).unwrap();
-    let credits = vote_state.credits();
-
-    let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
-
-    stake_account
-        .set_state(&StakeStateV2::Stake(
-            Meta {
-                authorized: Authorized::auto(authorized),
-                rent_exempt_reserve,
-                ..Meta::default()
-            },
-            new_stake(
-                lamports - rent_exempt_reserve, // underflow is an error, is basically: assert!(lamports > rent_exempt_reserve);
-                voter_pubkey,
-                credits,
-                activation_epoch,
-            ),
-            StakeFlags::empty(),
-        ))
-        .expect("set_state");
-
-    stake_account
-}

+ 0 - 2
rpc/Cargo.toml

@@ -79,7 +79,6 @@ solana-send-transaction-service = { workspace = true }
 solana-signature = { workspace = true }
 solana-signer = { workspace = true }
 solana-slot-history = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-storage-bigtable = { workspace = true }
 solana-streamer = { workspace = true }
 solana-svm = { workspace = true }
@@ -128,7 +127,6 @@ solana-sdk-ids = { workspace = true }
 solana-send-transaction-service = { workspace = true, features = ["dev-context-only-utils"] }
 solana-sha256-hasher = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-svm-log-collector = { workspace = true }
 solana-vote-interface = { workspace = true }
 spl-pod = { workspace = true }

+ 3 - 3
rpc/src/rpc.rs

@@ -70,12 +70,12 @@ use {
         commitment::{BlockCommitmentArray, BlockCommitmentCache},
         non_circulating_supply::{calculate_non_circulating_supply, NonCirculatingSupply},
         prioritization_fee_cache::PrioritizationFeeCache,
+        stake_utils,
     },
     solana_runtime_transaction::runtime_transaction::RuntimeTransaction,
     solana_send_transaction_service::send_transaction_service::TransactionInfo,
     solana_signature::Signature,
     solana_signer::Signer,
-    solana_stake_program,
     solana_storage_bigtable::Error as StorageError,
     solana_transaction::{
         sanitized::{MessageHash, SanitizedTransaction, MAX_TX_ACCOUNT_LOCKS},
@@ -2376,7 +2376,7 @@ impl JsonRpcRequestProcessor {
 
     fn get_stake_minimum_delegation(&self, config: RpcContextConfig) -> Result<RpcResponse<u64>> {
         let bank = self.get_bank_with_config(config)?;
-        let stake_minimum_delegation = solana_stake_program::get_minimum_delegation(
+        let stake_minimum_delegation = stake_utils::get_minimum_delegation(
             bank.feature_set
                 .is_active(&agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id()),
         );
@@ -9242,7 +9242,7 @@ pub mod tests {
     fn test_rpc_get_stake_minimum_delegation() {
         let rpc = RpcHandler::start();
         let bank = rpc.working_bank();
-        let expected_stake_minimum_delegation = solana_stake_program::get_minimum_delegation(
+        let expected_stake_minimum_delegation = stake_utils::get_minimum_delegation(
             bank.feature_set
                 .is_active(&agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id()),
         );

+ 1 - 1
runtime/Cargo.toml

@@ -109,6 +109,7 @@ solana-commitment-config = { workspace = true }
 solana-compute-budget = { workspace = true }
 solana-compute-budget-instruction = { workspace = true }
 solana-compute-budget-interface = { workspace = true }
+solana-config-interface = { workspace = true, features = ["bincode"] }
 solana-cost-model = { workspace = true }
 solana-cpi = { workspace = true }
 solana-ed25519-program = { workspace = true }
@@ -161,7 +162,6 @@ solana-signer = { workspace = true }
 solana-slot-hashes = { workspace = true }
 solana-slot-history = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-svm = { workspace = true }
 solana-svm-callback = { workspace = true }
 solana-svm-timings = { workspace = true }

+ 2 - 1
runtime/src/bank.rs

@@ -47,6 +47,7 @@ use {
         rent_collector::RentCollector,
         runtime_config::RuntimeConfig,
         stake_account::StakeAccount,
+        stake_utils,
         stake_weighted_timestamp::{
             calculate_stake_weighted_timestamp, MaxAllowableDrift,
             MAX_ALLOWABLE_DRIFT_PERCENTAGE_FAST, MAX_ALLOWABLE_DRIFT_PERCENTAGE_SLOW_V2,
@@ -2309,7 +2310,7 @@ impl Bank {
             .is_active(&feature_set::stake_minimum_delegation_for_rewards::id())
         {
             let num_stake_delegations = stakes.stake_delegations().len();
-            let min_stake_delegation = solana_stake_program::get_minimum_delegation(
+            let min_stake_delegation = stake_utils::get_minimum_delegation(
                 self.feature_set
                     .is_active(&agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id()),
             )

+ 2 - 2
runtime/src/bank/partitioned_epoch_rewards/distribution.rs

@@ -317,6 +317,7 @@ mod tests {
                 tests::create_genesis_config,
             },
             inflation_rewards::points::PointValue,
+            stake_utils,
         },
         rand::Rng,
         solana_account::from_account,
@@ -330,7 +331,6 @@ mod tests {
             stake_flags::StakeFlags,
             state::{Meta, Stake},
         },
-        solana_stake_program::stake_state,
         solana_sysvar as sysvar,
         solana_vote_program::vote_state,
         std::sync::Arc,
@@ -418,7 +418,7 @@ mod tests {
             // store account in Bank, since distribution now checks for account existence
             let lamports = stake_reward.stake_account.lamports()
                 - stake_reward.stake_reward_info.lamports as u64;
-            let validator_stake_account = stake_state::create_account(
+            let validator_stake_account = stake_utils::create_stake_account(
                 &stake_reward.stake_pubkey,
                 &validator_vote_pubkey,
                 &validator_vote_account,

+ 2 - 1
runtime/src/bank/partitioned_epoch_rewards/mod.rs

@@ -376,6 +376,7 @@ mod tests {
                 create_genesis_config_with_vote_accounts, GenesisConfigInfo, ValidatorVoteKeypairs,
             },
             runtime_config::RuntimeConfig,
+            stake_utils,
         },
         assert_matches::assert_matches,
         solana_account::{state_traits::StateMut, Account},
@@ -972,7 +973,7 @@ mod tests {
 
         let new_stake_signer = Keypair::new();
         let new_stake_address = new_stake_signer.pubkey();
-        let new_stake_account = Account::from(solana_stake_program::stake_state::create_account(
+        let new_stake_account = Account::from(stake_utils::create_stake_account(
             &new_stake_address,
             &vote_key,
             &vote_account.into(),

+ 7 - 6
runtime/src/bank/tests.rs

@@ -11,9 +11,11 @@ use {
         genesis_utils::{
             self, activate_all_features, activate_feature, bootstrap_validator_stake_lamports,
             create_genesis_config_with_leader, create_genesis_config_with_vote_accounts,
-            genesis_sysvar_and_builtin_program_lamports, GenesisConfigInfo, ValidatorVoteKeypairs,
+            create_lockup_stake_account, genesis_sysvar_and_builtin_program_lamports,
+            GenesisConfigInfo, ValidatorVoteKeypairs,
         },
         stake_history::StakeHistory,
+        stake_utils,
         stakes::InvalidCacheEntryReason,
         status_cache::MAX_CACHE_ENTRIES,
     },
@@ -89,10 +91,9 @@ use {
     solana_signature::Signature,
     solana_signer::Signer,
     solana_stake_interface::{
-        instruction as stake_instruction,
+        instruction as stake_instruction, program as stake_program,
         state::{Authorized, Delegation, Lockup, Stake, StakeStateV2},
     },
-    solana_stake_program::stake_state,
     solana_svm::{
         account_loader::{FeesOnlyTransaction, LoadedTransaction},
         rollback_accounts::RollbackAccounts,
@@ -3239,7 +3240,7 @@ fn test_bank_cloned_stake_delegations() {
     genesis_config.rent = Rent::default();
 
     for (pubkey, account) in
-        solana_program_binaries::by_id(&solana_stake_program::id(), &genesis_config.rent)
+        solana_program_binaries::by_id(&stake_program::id(), &genesis_config.rent)
             .unwrap()
             .into_iter()
     {
@@ -3258,7 +3259,7 @@ fn test_bank_cloned_stake_delegations() {
         let rent = &bank.rent_collector().rent;
         let vote_rent_exempt_reserve = rent.minimum_balance(VoteStateV4::size_of());
         let stake_rent_exempt_reserve = rent.minimum_balance(StakeStateV2::size_of());
-        let minimum_delegation = solana_stake_program::get_minimum_delegation(
+        let minimum_delegation = stake_utils::get_minimum_delegation(
             bank.feature_set
                 .is_active(&agave_feature_set::stake_raise_minimum_delegation_to_1_sol::id()),
         );
@@ -3840,7 +3841,7 @@ fn test_banks_leak() {
             let pubkey = solana_pubkey::new_rand();
             genesis_config.add_account(
                 pubkey,
-                stake_state::create_lockup_stake_account(
+                create_lockup_stake_account(
                     &Authorized::auto(&pubkey),
                     &Lockup::default(),
                     &Rent::default(),

+ 73 - 6
runtime/src/genesis_utils.rs

@@ -1,13 +1,20 @@
+#[allow(deprecated)]
+use solana_stake_interface::config::Config as StakeConfig;
 use {
+    crate::stake_utils,
     agave_feature_set::{FeatureSet, FEATURE_NAMES},
     agave_votor_messages::consensus_message::BLS_KEYPAIR_DERIVE_SEED,
+    bincode::serialize,
     log::*,
-    solana_account::{Account, AccountSharedData},
+    solana_account::{
+        state_traits::StateMut, Account, AccountSharedData, ReadableAccount, WritableAccount,
+    },
     solana_bls_signatures::{
         keypair::Keypair as BLSKeypair, pubkey::PubkeyCompressed as BLSPubkeyCompressed,
         Pubkey as BLSPubkey,
     },
     solana_cluster_type::ClusterType,
+    solana_config_interface::state::ConfigKeys,
     solana_feature_gate_interface::{self as feature, Feature},
     solana_fee_calculator::FeeRateGovernor,
     solana_genesis_config::GenesisConfig,
@@ -15,11 +22,15 @@ use {
     solana_native_token::LAMPORTS_PER_SOL,
     solana_pubkey::Pubkey,
     solana_rent::Rent,
+    solana_sdk_ids::{stake as stake_program, sysvar},
     solana_seed_derivable::SeedDerivable,
     solana_signer::Signer,
-    solana_stake_interface::state::StakeStateV2,
-    solana_stake_program::stake_state,
+    solana_stake_interface::state::{Authorized, Lockup, Meta, StakeStateV2},
     solana_system_interface::program as system_program,
+    solana_sysvar::{
+        epoch_rewards::{self, EpochRewards},
+        SysvarSerialize,
+    },
     solana_vote_interface::state::BLS_PUBLIC_KEY_COMPRESSED_SIZE,
     solana_vote_program::vote_state,
     std::borrow::Borrow,
@@ -194,7 +205,7 @@ pub fn create_genesis_config_with_vote_accounts_and_cluster_type(
             0,
             *stake,
         );
-        let stake_account = Account::from(stake_state::create_account(
+        let stake_account = Account::from(stake_utils::create_stake_account(
             &stake_pubkey,
             &vote_pubkey,
             &vote_account,
@@ -348,7 +359,7 @@ pub fn create_genesis_config_with_leader_ex_no_features(
         validator_stake_lamports,
     );
 
-    let validator_stake_account = stake_state::create_account(
+    let validator_stake_account = stake_utils::create_stake_account(
         validator_stake_account_pubkey,
         validator_vote_account_pubkey,
         &validator_vote_account,
@@ -391,7 +402,8 @@ pub fn create_genesis_config_with_leader_ex_no_features(
         ..GenesisConfig::default()
     };
 
-    solana_stake_program::add_genesis_accounts(&mut genesis_config);
+    add_genesis_stake_config_account(&mut genesis_config);
+    add_genesis_epoch_rewards_account(&mut genesis_config);
 
     genesis_config
 }
@@ -432,3 +444,58 @@ pub fn create_genesis_config_with_leader_ex(
 
     genesis_config
 }
+
+#[allow(deprecated)]
+pub fn add_genesis_stake_config_account(genesis_config: &mut GenesisConfig) -> u64 {
+    let mut data = serialize(&ConfigKeys { keys: vec![] }).unwrap();
+    data.extend_from_slice(&serialize(&StakeConfig::default()).unwrap());
+    let lamports = std::cmp::max(genesis_config.rent.minimum_balance(data.len()), 1);
+    let account = AccountSharedData::from(Account {
+        lamports,
+        data,
+        owner: solana_sdk_ids::config::id(),
+        ..Account::default()
+    });
+
+    genesis_config.add_account(solana_stake_interface::config::id(), account);
+
+    lamports
+}
+
+pub fn add_genesis_epoch_rewards_account(genesis_config: &mut GenesisConfig) -> u64 {
+    let data = vec![0; EpochRewards::size_of()];
+    let lamports = std::cmp::max(genesis_config.rent.minimum_balance(data.len()), 1);
+
+    let account = AccountSharedData::create(lamports, data, sysvar::id(), false, u64::MAX);
+
+    genesis_config.add_account(epoch_rewards::id(), account);
+
+    lamports
+}
+
+// genesis investor accounts
+pub fn create_lockup_stake_account(
+    authorized: &Authorized,
+    lockup: &Lockup,
+    rent: &Rent,
+    lamports: u64,
+) -> AccountSharedData {
+    let mut stake_account =
+        AccountSharedData::new(lamports, StakeStateV2::size_of(), &stake_program::id());
+
+    let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
+    assert!(
+        lamports >= rent_exempt_reserve,
+        "lamports: {lamports} is less than rent_exempt_reserve {rent_exempt_reserve}"
+    );
+
+    stake_account
+        .set_state(&StakeStateV2::Initialized(Meta {
+            authorized: *authorized,
+            lockup: *lockup,
+            rent_exempt_reserve,
+        }))
+        .expect("set_state");
+
+    stake_account
+}

+ 5 - 2
runtime/src/inflation_rewards/mod.rs

@@ -7,8 +7,11 @@ use {
     },
     solana_clock::Epoch,
     solana_instruction::error::InstructionError,
-    solana_stake_interface::{error::StakeError, stake_history::StakeHistory},
-    solana_stake_program::stake_state::{Stake, StakeStateV2},
+    solana_stake_interface::{
+        error::StakeError,
+        stake_history::StakeHistory,
+        state::{Stake, StakeStateV2},
+    },
     solana_vote::vote_state_view::VoteStateView,
 };
 

+ 1 - 0
runtime/src/lib.rs

@@ -38,6 +38,7 @@ pub mod snapshot_package;
 pub mod snapshot_utils;
 mod stake_account;
 pub mod stake_history;
+pub mod stake_utils;
 pub mod stake_weighted_timestamp;
 pub mod stakes;
 pub mod static_ids;

+ 3 - 2
runtime/src/non_circulating_supply.rs

@@ -5,7 +5,6 @@ use {
     solana_accounts_db::accounts_index::{AccountIndex, IndexKey, ScanConfig, ScanResult},
     solana_pubkey::Pubkey,
     solana_stake_interface::{self as stake, state::StakeStateV2},
-    solana_stake_program::stake_state,
     std::collections::HashSet,
 };
 
@@ -47,7 +46,9 @@ pub fn calculate_non_circulating_supply(bank: &Bank) -> ScanResult<NonCirculatin
     };
 
     for (pubkey, account) in stake_accounts.iter() {
-        let stake_account = stake_state::from(account).unwrap_or_default();
+        let stake_account = account
+            .deserialize_data::<StakeStateV2>()
+            .unwrap_or_default();
         match stake_account {
             StakeStateV2::Initialized(meta) => {
                 if meta.lockup.is_in_force(&clock, None)

+ 6 - 3
runtime/src/stake_account.rs

@@ -4,7 +4,10 @@ use {
     solana_account::{state_traits::StateMut, AccountSharedData, ReadableAccount},
     solana_instruction::error::InstructionError,
     solana_pubkey::Pubkey,
-    solana_stake_interface::state::{Delegation, Stake, StakeStateV2},
+    solana_stake_interface::{
+        program as stake_program,
+        state::{Delegation, Stake, StakeStateV2},
+    },
     std::marker::PhantomData,
     thiserror::Error,
 };
@@ -62,7 +65,7 @@ impl StakeAccount<Delegation> {
 impl TryFrom<AccountSharedData> for StakeAccount<Delegation> {
     type Error = Error;
     fn try_from(account: AccountSharedData) -> Result<Self, Self::Error> {
-        if account.owner() != &solana_stake_program::id() {
+        if account.owner() != &stake_program::id() {
             return Err(Error::InvalidOwner(*account.owner()));
         }
         let stake_state: StakeStateV2 = account.state()?;
@@ -109,7 +112,7 @@ impl AbiExample for StakeAccount<Delegation> {
             StakeStateV2::Stake(Meta::example(), Stake::example(), StakeFlags::example());
         let mut account = Account::example();
         account.data.resize(200, 0u8);
-        account.owner = solana_stake_program::id();
+        account.owner = stake_program::id();
         account.set_state(&stake_state).unwrap();
         Self::try_from(AccountSharedData::from(account)).unwrap()
     }

+ 65 - 0
runtime/src/stake_utils.rs

@@ -0,0 +1,65 @@
+use {
+    solana_account::{state_traits::StateMut, AccountSharedData, ReadableAccount},
+    solana_clock::Epoch,
+    solana_native_token::LAMPORTS_PER_SOL,
+    solana_pubkey::Pubkey,
+    solana_rent::Rent,
+    solana_stake_interface::{
+        program as stake_program,
+        stake_flags::StakeFlags,
+        state::{Authorized, Delegation, Meta, Stake, StakeStateV2},
+    },
+    solana_vote_interface::state::VoteStateV4,
+};
+
+/// The minimum stake amount that can be delegated, in lamports.
+/// When this feature is added, it will be accompanied by an upgrade to the BPF Stake Program.
+/// NOTE: This is also used to calculate the minimum balance of a delegated stake account,
+/// which is the rent exempt reserve _plus_ the minimum stake delegation.
+#[inline(always)]
+pub fn get_minimum_delegation(is_stake_raise_minimum_delegation_to_1_sol_active: bool) -> u64 {
+    if is_stake_raise_minimum_delegation_to_1_sol_active {
+        const MINIMUM_DELEGATION_SOL: u64 = 1;
+        MINIMUM_DELEGATION_SOL * LAMPORTS_PER_SOL
+    } else {
+        1
+    }
+}
+
+/// Utility function for creating a stake account from basic parameters.
+/// Only used in tests and CLIs.
+pub fn create_stake_account(
+    authorized: &Pubkey,
+    voter_pubkey: &Pubkey,
+    vote_account: &AccountSharedData,
+    rent: &Rent,
+    lamports: u64,
+) -> AccountSharedData {
+    let mut stake_account =
+        AccountSharedData::new(lamports, StakeStateV2::size_of(), &stake_program::id());
+
+    let vote_state = VoteStateV4::deserialize(vote_account.data(), voter_pubkey).unwrap();
+    let credits_observed = vote_state.credits();
+
+    let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
+    let stake_amount = lamports
+        .checked_sub(rent_exempt_reserve)
+        .expect("lamports >= rent_exempt_reserve");
+
+    let meta = Meta {
+        authorized: Authorized::auto(authorized),
+        rent_exempt_reserve,
+        ..Meta::default()
+    };
+
+    let stake = Stake {
+        delegation: Delegation::new(voter_pubkey, stake_amount, Epoch::MAX),
+        credits_observed,
+    };
+
+    stake_account
+        .set_state(&StakeStateV2::Stake(meta, stake, StakeFlags::empty()))
+        .expect("set_state");
+
+    stake_account
+}

+ 36 - 11
runtime/src/stakes.rs

@@ -13,7 +13,10 @@ use {
     solana_accounts_db::utils::create_account_shared_data,
     solana_clock::Epoch,
     solana_pubkey::Pubkey,
-    solana_stake_interface::state::{Delegation, StakeActivationStatus},
+    solana_stake_interface::{
+        program as stake_program,
+        state::{Delegation, StakeActivationStatus},
+    },
     solana_vote::vote_account::{VoteAccount, VoteAccounts},
     solana_vote_interface::state::VoteStateVersions,
     std::{
@@ -85,7 +88,7 @@ impl StakesCache {
                     let mut stakes = self.0.write().unwrap();
                     stakes.remove_vote_account(pubkey)
                 };
-            } else if solana_stake_program::check_id(owner) {
+            } else if stake_program::check_id(owner) {
                 let mut stakes = self.0.write().unwrap();
                 stakes.remove_stake_delegation(pubkey, new_rate_activation_epoch);
             }
@@ -121,7 +124,7 @@ impl StakesCache {
                     stakes.remove_vote_account(pubkey)
                 };
             };
-        } else if solana_stake_program::check_id(owner) {
+        } else if stake_program::check_id(owner) {
             match StakeAccount::try_from(create_account_shared_data(account)) {
                 Ok(stake_account) => {
                     let mut stakes = self.0.write().unwrap();
@@ -514,9 +517,15 @@ fn refresh_vote_accounts(
 #[cfg(test)]
 pub(crate) mod tests {
     use {
-        super::*, rayon::ThreadPoolBuilder, solana_account::WritableAccount, solana_pubkey::Pubkey,
-        solana_rent::Rent, solana_stake_interface as stake, solana_stake_program::stake_state,
-        solana_vote_interface::state::VoteStateV4, solana_vote_program::vote_state,
+        super::*,
+        crate::stake_utils,
+        rayon::ThreadPoolBuilder,
+        solana_account::WritableAccount,
+        solana_pubkey::Pubkey,
+        solana_rent::Rent,
+        solana_stake_interface::{self as stake, state::StakeStateV2},
+        solana_vote_interface::state::VoteStateV4,
+        solana_vote_program::vote_state,
     };
 
     //  set up some dummies for a staked node     ((     vote      )  (     stake     ))
@@ -550,7 +559,7 @@ pub(crate) mod tests {
         stake_pubkey: &Pubkey,
     ) -> AccountSharedData {
         let node_pubkey = solana_pubkey::new_rand();
-        stake_state::create_account(
+        stake_utils::create_stake_account(
             stake_pubkey,
             vote_pubkey,
             &vote_state::create_v4_account_with_authorized(
@@ -579,7 +588,11 @@ pub(crate) mod tests {
 
             stakes_cache.check_and_store(&vote_pubkey, &vote_account, None);
             stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
-            let stake = stake_state::stake_from(&stake_account).unwrap();
+            let stake = stake_account
+                .deserialize_data::<StakeStateV2>()
+                .unwrap()
+                .stake()
+                .unwrap();
             {
                 let stakes = stakes_cache.stakes();
                 let vote_accounts = stakes.vote_accounts();
@@ -606,7 +619,11 @@ pub(crate) mod tests {
             let mut stake_account =
                 create_stake_account(42, &vote_pubkey, &solana_pubkey::new_rand());
             stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
-            let stake = stake_state::stake_from(&stake_account).unwrap();
+            let stake = stake_account
+                .deserialize_data::<StakeStateV2>()
+                .unwrap()
+                .stake()
+                .unwrap();
             {
                 let stakes = stakes_cache.stakes();
                 let vote_accounts = stakes.vote_accounts();
@@ -749,7 +766,11 @@ pub(crate) mod tests {
         // delegates to vote_pubkey
         stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
 
-        let stake = stake_state::stake_from(&stake_account).unwrap();
+        let stake = stake_account
+            .deserialize_data::<StakeStateV2>()
+            .unwrap()
+            .stake()
+            .unwrap();
 
         {
             let stakes = stakes_cache.stakes();
@@ -814,7 +835,11 @@ pub(crate) mod tests {
 
         stakes_cache.check_and_store(&vote_pubkey, &vote_account, None);
         stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
-        let stake = stake_state::stake_from(&stake_account).unwrap();
+        let stake = stake_account
+            .deserialize_data::<StakeStateV2>()
+            .unwrap()
+            .stake()
+            .unwrap();
 
         {
             let stakes = stakes_cache.stakes();

+ 8 - 5
runtime/src/stakes/serde_stakes.rs

@@ -5,7 +5,7 @@ use {
     serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer},
     solana_clock::Epoch,
     solana_pubkey::Pubkey,
-    solana_stake_program::stake_state::Stake,
+    solana_stake_interface::state::Stake,
     solana_vote::vote_account::VoteAccounts,
     std::{collections::HashMap, sync::Arc},
 };
@@ -187,8 +187,11 @@ impl Serialize for SerdeStakeAccountMapToStakeFormat {
 #[cfg(test)]
 mod tests {
     use {
-        super::*, crate::stakes::StakesCache, rand::Rng, solana_rent::Rent,
-        solana_stake_interface::state::Delegation, solana_stake_program::stake_state,
+        super::*,
+        crate::{stake_utils, stakes::StakesCache},
+        rand::Rng,
+        solana_rent::Rent,
+        solana_stake_interface::state::Delegation,
         solana_vote_program::vote_state,
     };
 
@@ -199,7 +202,7 @@ mod tests {
         let node_pubkey = Pubkey::new_unique();
         stake_delegations.insert(
             Pubkey::new_unique(),
-            StakeAccount::try_from(stake_state::create_account(
+            StakeAccount::try_from(stake_utils::create_stake_account(
                 &Pubkey::new_unique(),
                 &vote_pubkey,
                 &vote_state::create_v4_account_with_authorized(
@@ -281,7 +284,7 @@ mod tests {
             for _ in 0..rng.gen_range(10usize..20) {
                 let stake_pubkey = solana_pubkey::new_rand();
                 let rent = Rent::with_slots_per_epoch(rng.gen());
-                let stake_account = stake_state::create_account(
+                let stake_account = stake_utils::create_stake_account(
                     &stake_pubkey, // authorized
                     &vote_pubkey,
                     &vote_account,

+ 0 - 1
stake-accounts/Cargo.toml

@@ -39,7 +39,6 @@ solana-rpc-client-api = { workspace = true }
 solana-signature = { workspace = true }
 solana-signer = { workspace = true }
 solana-stake-interface = { workspace = true }
-solana-stake-program = { workspace = true }
 solana-sysvar = { workspace = true }
 solana-transaction = { workspace = true }
 solana-version = { workspace = true }

+ 1 - 2
stake-accounts/src/main.rs

@@ -20,7 +20,6 @@ use {
     solana_signature::Signature,
     solana_signer::{signers::Signers, unique_signers, Signer},
     solana_stake_interface::{instruction::LockupArgs, state::Lockup},
-    solana_stake_program::stake_state,
     solana_transaction::Transaction,
     std::{env, error::Error, str::FromStr},
 };
@@ -52,7 +51,7 @@ fn get_balances(
 fn get_lockup(client: &RpcClient, address: &Pubkey) -> Result<Lockup, ClientError> {
     client
         .get_account(address)
-        .map(|account| stake_state::lockup_from(&account).unwrap())
+        .map(|account| stake_accounts::lockup_from(&account).unwrap())
 }
 
 fn get_lockups(

+ 22 - 8
stake-accounts/src/stake_accounts.rs

@@ -1,4 +1,5 @@
 use {
+    solana_account::{state_traits::StateMut, ReadableAccount},
     solana_clock::SECONDS_PER_DAY,
     solana_instruction::Instruction,
     solana_message::Message,
@@ -6,7 +7,7 @@ use {
     solana_stake_interface::{
         self as stake,
         instruction::{self as stake_instruction, LockupArgs},
-        state::{Authorized, Lockup, StakeAuthorize},
+        state::{Authorized, Lockup, StakeAuthorize, StakeStateV2},
     },
 };
 const DAYS_PER_YEAR: f64 = 365.25;
@@ -16,6 +17,16 @@ pub(crate) fn derive_stake_account_address(base_pubkey: &Pubkey, i: usize) -> Pu
     Pubkey::create_with_seed(base_pubkey, &i.to_string(), &stake::program::id()).unwrap()
 }
 
+fn from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<StakeStateV2> {
+    account.state().ok()
+}
+
+pub(crate) fn lockup_from<T: ReadableAccount + StateMut<StakeStateV2>>(
+    account: &T,
+) -> Option<Lockup> {
+    from(account).and_then(|state: StakeStateV2| state.lockup())
+}
+
 // Return derived addresses
 pub(crate) fn derive_stake_account_addresses(
     base_pubkey: &Pubkey,
@@ -289,11 +300,14 @@ mod tests {
         solana_runtime::{bank::Bank, bank_client::BankClient, bank_forks::BankForks},
         solana_signer::Signer,
         solana_stake_interface::state::StakeStateV2,
-        solana_stake_program::stake_state,
         solana_sysvar::epoch_rewards::EpochRewards,
         std::sync::{Arc, RwLock},
     };
 
+    fn authorized_from(account: &AccountSharedData) -> Option<Authorized> {
+        from(account).and_then(|state: StakeStateV2| state.authorized())
+    }
+
     fn create_bank(lamports: u64) -> (Arc<Bank>, Arc<RwLock<BankForks>>, Keypair, u64, u64) {
         let (mut genesis_config, mint_keypair) = create_genesis_config(lamports);
         genesis_config.fee_rate_governor = solana_fee_calculator::FeeRateGovernor::new(0, 0);
@@ -366,7 +380,7 @@ mod tests {
                 let address = derive_stake_account_address(base_pubkey, i);
                 let account =
                     AccountSharedData::from(client.get_account(&address).unwrap().unwrap());
-                (address, stake_state::lockup_from(&account).unwrap())
+                (address, lockup_from(&account).unwrap())
             })
             .collect()
     }
@@ -403,7 +417,7 @@ mod tests {
 
         let account = get_account_at(&bank_client, &base_pubkey, 0);
         assert_eq!(account.lamports(), lamports);
-        let authorized = stake_state::authorized_from(&account).unwrap();
+        let authorized = authorized_from(&account).unwrap();
         assert_eq!(authorized.staker, stake_authority_pubkey);
         assert_eq!(authorized.withdrawer, withdraw_authority_pubkey);
     }
@@ -465,7 +479,7 @@ mod tests {
         }
 
         let account = get_account_at(&bank_client, &base_pubkey, 0);
-        let authorized = stake_state::authorized_from(&account).unwrap();
+        let authorized = authorized_from(&account).unwrap();
         assert_eq!(authorized.staker, new_stake_authority_pubkey);
         assert_eq!(authorized.withdrawer, new_withdraw_authority_pubkey);
     }
@@ -525,7 +539,7 @@ mod tests {
         }
 
         let account = get_account_at(&bank_client, &base_pubkey, 0);
-        let lockup = stake_state::lockup_from(&account).unwrap();
+        let lockup = lockup_from(&account).unwrap();
         assert_eq!(lockup.custodian, custodian_pubkey);
         assert_eq!(lockup.unix_timestamp, 1);
         assert_eq!(lockup.epoch, 0);
@@ -619,7 +633,7 @@ mod tests {
 
         // Ensure the new accounts are duplicates of the previous ones.
         let account = get_account_at(&bank_client, &new_base_pubkey, 0);
-        let authorized = stake_state::authorized_from(&account).unwrap();
+        let authorized = authorized_from(&account).unwrap();
         assert_eq!(authorized.staker, stake_authority_pubkey);
         assert_eq!(authorized.withdrawer, withdraw_authority_pubkey);
     }
@@ -688,7 +702,7 @@ mod tests {
 
         // Ensure the new accounts have the new authorities.
         let account = get_account_at(&bank_client, &new_base_pubkey, 0);
-        let authorized = stake_state::authorized_from(&account).unwrap();
+        let authorized = authorized_from(&account).unwrap();
         assert_eq!(authorized.staker, new_stake_authority_pubkey);
         assert_eq!(authorized.withdrawer, new_withdraw_authority_pubkey);
     }