Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,329 changes: 1,637 additions & 1,692 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ resolver = "2"
members = ["clients/cli", "program"]

[workspace.metadata.cli]
solana = "3.1.11"
solana = "4.1.0"

[workspace.metadata.spellcheck]
config = "scripts/spellcheck.toml"
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
RUST_TOOLCHAIN_NIGHTLY = nightly-2026-01-22
SOLANA_CLI_VERSION = 3.1.11
RUST_TOOLCHAIN_NIGHTLY = nightly-2026-07-16
SOLANA_CLI_VERSION = 4.1.0

nightly = +${RUST_TOOLCHAIN_NIGHTLY}

Expand Down
24 changes: 12 additions & 12 deletions clients/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ serde = "1.0.228"
serde_derive = "1.0.228"
serde_json = "1.0.150"
serde_with = "3.21.0"
solana-account = "3.4"
solana-account-decoder = "3.1.3"
solana-account = "4.0"
solana-account-decoder = "4.3.0"
solana-borsh = "3.0"
solana-clap-v3-utils = { version = "3.1.3", features = ["agave-unstable-api"] }
solana-cli-config = "3.1.3"
solana-cli-output = { version = "3.1.3", features = ["agave-unstable-api"] }
solana-client = "3.1.3"
solana-clap-v3-utils = { version = "4.3.0", features = ["agave-unstable-api"] }
solana-cli-config = "4.3.0"
solana-cli-output = { version = "4.3.0", features = ["agave-unstable-api"] }
solana-client = "4.3.0"
solana-clock = "4.0"
solana-commitment-config = "3.1"
solana-epoch-schedule = "3.0"
Expand All @@ -32,17 +32,17 @@ solana-logger = "3.0"
solana-native-token = "3.0"
solana-program-pack = "3.0"
solana-pubkey = "4.2"
solana-remote-wallet = "3.1.3"
solana-rent = "3.0"
solana-remote-wallet = "4.3.0"
solana-rent = "4.0"
solana-sdk-ids = "3.1"
solana-signature = "3.1"
solana-signer = "3.0"
solana-system-interface = "3.0"
solana-sysvar = "3.1"
solana-stake-interface = "2.0.1"
solana-transaction = "3.0"
solana-transaction-status = "3.1.3"
solana-vote-interface = { version = "5.0.0", features = ["bincode"] }
solana-stake-interface = "4.3.1"
solana-transaction = "4.0"
solana-transaction-status = "4.3.0"
solana-vote-interface = { version = "6.1.0", features = ["bincode"] }
spl-associated-token-account-interface = "2.0.0"
spl-token-interface = "3.0.0"
spl-single-pool = { version = "6.0.0", path = "../../program", features = [
Expand Down
5 changes: 3 additions & 2 deletions clients/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ async fn command_display(config: &Config, command_config: DisplayCli) -> Command
#[allow(deprecated)]
let pools = config
.rpc_client
.get_program_accounts_with_config(
.get_program_ui_accounts_with_config(
&spl_single_pool::id(),
RpcProgramAccountsConfig {
filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes(
Expand All @@ -694,7 +694,8 @@ async fn command_display(config: &Config, command_config: DisplayCli) -> Command
let mut pool_and_vote_addresses = vec![];
for pool in pools.into_iter() {
let vote_account_address =
try_from_slice_unchecked::<SinglePool>(&pool.1.data)?.vote_account_address;
try_from_slice_unchecked::<SinglePool>(&pool.1.data.decode().unwrap())?
.vote_account_address;
pool_and_vote_addresses.push((pool.0, vote_account_address));
}

Expand Down
17 changes: 10 additions & 7 deletions program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,19 @@ solana-account-info = "3.1"
solana-borsh = "3.0"
solana-clock = "4.0"
solana-cpi = "3.1"
solana-get-sysvar = "1.0"
solana-instruction = "4.0"
solana-msg = "3.1"
solana-native-token = "3.0"
solana-program-entrypoint = "3.1"
solana-program-error = "3.0"
solana-program-pack = "3.1"
solana-pubkey = { version = "4.2", features = ["borsh", "curve25519"] }
solana-rent = "3.0"
solana-stake-interface = { version = "2.0.1", features = ["bincode", "borsh", "sysvar"] }
solana-rent = { version = "4.0", features = ["sysvar"] }
solana-stake-interface = { version = "4.3.1", features = ["bincode", "borsh", "sysvar"] }
solana-system-interface = { version = "3.0.0", features = ["bincode"] }
solana-sysvar = "3.1"
solana-vote-interface = { version = "5.0.0", features = ["bincode"] }
solana-sysvar = { version = "4.0", features = ["bincode"] }
solana-vote-interface = { version = "6.1.0", features = ["bincode"] }
solana-security-txt = "1.1.3"
spl-token-interface = "3.0.0"
thiserror = "2.0"
Expand All @@ -42,14 +43,16 @@ thiserror = "2.0"
approx = "0.5.1"
bincode = "1.3.3"
rand = "0.10.1"
solana-account = "3.4"
solana-account = "4.0"
solana-hash = "4.4"
solana-keypair = "3.0"
solana-instruction-error = "2.3"
solana-program-test = { version = "3.1.3", features = ["agave-unstable-api"] }
solana-program-test = { version = "4.1.0", features = ["agave-unstable-api"] }
solana-signer = "3.0"
solana-transaction = "3.0"
solana-sysvar-id = "3.1"
solana-transaction = "4.0"
solana-transaction-error = "3.2"
solana-vote-program = "4.1.0"
spl-associated-token-account-interface = "2.0.0"
strum = "0.28.0"
strum_macros = "0.28.0"
Expand Down
22 changes: 15 additions & 7 deletions program/src/processor.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! program state processor

#[allow(deprecated)]
use solana_sysvar::SysvarSerialize;
Comment on lines +3 to +4

@2501babe 2501babe Sep 26, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this and the allow deprecated on sysvar deserializing is because i didnt want to change the program any in this, we can remove sysvars and use Sysvar::get() now that the stake program doesnt need them, in a separate pr

use {
crate::{
error::SinglePoolError,
Expand All @@ -22,6 +24,7 @@ use {
solana_borsh::v1::try_from_slice_unchecked,
solana_clock::Clock,
solana_cpi::{invoke, invoke_signed},
solana_get_sysvar::GetSysvar,
solana_msg::msg,
solana_native_token::LAMPORTS_PER_SOL,
solana_program_entrypoint::ProgramResult,
Expand All @@ -35,7 +38,6 @@ use {
sysvar::stake_history::StakeHistorySysvar,
},
solana_system_interface::{instruction as system_instruction, program as system_program},
solana_sysvar::{Sysvar, SysvarSerialize},
solana_vote_interface::program as vote_program,
spl_token_interface::{self as spl_token, state::Mint},
};
Expand Down Expand Up @@ -613,6 +615,7 @@ impl Processor {
let pool_stake_authority_info = next_account_info(account_info_iter)?;
let pool_mint_authority_info = next_account_info(account_info_iter)?;
let rent_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let rent = &Rent::from_account_info(rent_info)?;
let clock_info = next_account_info(account_info_iter)?;
let stake_history_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -791,6 +794,7 @@ impl Processor {
let pool_onramp_info = next_account_info(account_info_iter)?;
let pool_stake_authority_info = next_account_info(account_info_iter)?;
let clock_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let clock = &Clock::from_account_info(clock_info)?;
let stake_history_info = next_account_info(account_info_iter)?;
let stake_config_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -823,7 +827,7 @@ impl Processor {
let (_, pool_stake_state) = get_stake_state(pool_stake_info)?;
let pool_stake_status = pool_stake_state
.delegation
.stake_activating_and_deactivating(
.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand All @@ -836,7 +840,7 @@ impl Processor {
match deserialize_stake(pool_onramp_info) {
Ok(StakeStateV2::Initialized(_)) => (None, u64::MAX),
Ok(StakeStateV2::Stake(_, stake, _)) => (
Some(stake.delegation.stake_activating_and_deactivating(
Some(stake.delegation.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand Down Expand Up @@ -988,6 +992,7 @@ impl Processor {
let user_token_account_info = next_account_info(account_info_iter)?;
let user_lamport_account_info = next_account_info(account_info_iter)?;
let clock_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let clock = &Clock::from_account_info(clock_info)?;
let stake_history_info = next_account_info(account_info_iter)?;
let token_program_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -1026,7 +1031,7 @@ impl Processor {
let (_, pool_stake_state) = get_stake_state(pool_stake_info)?;
let pool_stake_status = pool_stake_state
.delegation
.stake_activating_and_deactivating(
.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand Down Expand Up @@ -1067,7 +1072,7 @@ impl Processor {
let (user_stake_meta, user_stake_status) = match deserialize_stake(user_stake_info) {
Ok(StakeStateV2::Stake(meta, stake, _)) => (
meta,
stake.delegation.stake_activating_and_deactivating(
stake.delegation.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand Down Expand Up @@ -1177,6 +1182,7 @@ impl Processor {
let user_stake_info = next_account_info(account_info_iter)?;
let user_token_account_info = next_account_info(account_info_iter)?;
let clock_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let clock = &Clock::from_account_info(clock_info)?;
let token_program_info = next_account_info(account_info_iter)?;
let stake_program_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -1224,7 +1230,7 @@ impl Processor {
let (_, pool_stake_state) = get_stake_state(pool_stake_info)?;
let pool_stake_status = pool_stake_state
.delegation
.stake_activating_and_deactivating(
.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand Down Expand Up @@ -1499,6 +1505,7 @@ impl Processor {
let pool_onramp_info = next_account_info(account_info_iter)?;
let pool_stake_authority_info = next_account_info(account_info_iter)?;
let rent_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let rent = &Rent::from_account_info(rent_info)?;
let system_program_info = next_account_info(account_info_iter)?;
let stake_program_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -1581,6 +1588,7 @@ impl Processor {
let user_lamport_account_info = next_account_info(account_info_iter)?;
let user_token_account_info = next_account_info(account_info_iter)?;
let clock_info = next_account_info(account_info_iter)?;
#[allow(deprecated)]
let clock = &Clock::from_account_info(clock_info)?;
let stake_history_info = next_account_info(account_info_iter)?;
let stake_config_info = next_account_info(account_info_iter)?;
Expand Down Expand Up @@ -1631,7 +1639,7 @@ impl Processor {
let (_, pool_stake_state) = get_stake_state(pool_stake_info)?;
let pool_stake_status = pool_stake_state
.delegation
.stake_activating_and_deactivating(
.stake_activating_and_deactivating_v2(
clock.epoch,
stake_history,
PERPETUAL_NEW_WARMUP_COOLDOWN_RATE_EPOCH,
Expand Down
18 changes: 12 additions & 6 deletions program/tests/deposit_stake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod helpers;

use {
helpers::*,
solana_account::ReadableAccount,
solana_clock::Clock,
solana_keypair::Keypair,
solana_program_test::*,
Expand All @@ -14,6 +15,7 @@ use {
state::{Authorized, Lockup, StakeActivationStatus, StakeStateV2},
},
solana_system_interface::instruction as system_instruction,
solana_sysvar_id::SysvarId,
solana_transaction::Transaction,
spl_associated_token_account_interface::address::get_associated_token_address,
spl_single_pool::{error::SinglePoolError, id, instruction},
Expand Down Expand Up @@ -522,18 +524,20 @@ async fn all_activation_states(
let deactive = StakeActivationStatus::default();

let clock = context.banks_client.get_sysvar::<Clock>().await.unwrap();
let stake_history = context
let stake_history_account = context
.banks_client
.get_sysvar::<StakeHistory>()
.get_account(StakeHistory::id())
.await
.unwrap()
.unwrap();
let stake_history: StakeHistory = bincode::deserialize(stake_history_account.data()).unwrap();

let pool_triple = get_stake_account(&mut context.banks_client, &accounts.stake_account)
.await
.1
.unwrap()
.delegation
.stake_activating_and_deactivating(clock.epoch, &stake_history, Some(0));
.stake_activating_and_deactivating_v2(clock.epoch, &stake_history, Some(0));

if activate {
assert_eq!(pool_triple, active);
Expand All @@ -545,9 +549,11 @@ async fn all_activation_states(
.await
.1
.map(|stake| {
stake
.delegation
.stake_activating_and_deactivating(clock.epoch, &stake_history, Some(0))
stake.delegation.stake_activating_and_deactivating_v2(
clock.epoch,
&stake_history,
Some(0),
)
});

match user_stake_state {
Expand Down
19 changes: 13 additions & 6 deletions program/tests/helpers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use {
solana_clock::Clock,
solana_hash::Hash,
solana_keypair::Keypair,
solana_native_token::LAMPORTS_PER_SOL,
solana_program_error::ProgramError,
solana_program_test::*,
solana_pubkey::Pubkey,
Expand All @@ -20,8 +21,9 @@ use {
solana_transaction_error::TransactionError,
solana_vote_interface::{
instruction as vote_instruction,
state::{VoteInit, VoteStateV4},
state::{VoteInitV2, VoteStateV4},
},
solana_vote_program::vote_state::create_bls_pubkey_and_proof_of_possession,
spl_associated_token_account_interface::address::get_associated_token_address,
spl_single_pool::{
find_pool_address, find_pool_mint_address, find_pool_mint_authority_address,
Expand Down Expand Up @@ -401,7 +403,6 @@ pub async fn create_vote(
vote_account: &Keypair,
) {
let rent = banks_client.get_rent().await.unwrap();
let rent_voter = rent.minimum_balance(VoteStateV4::size_of());

let mut instructions = vec![system_instruction::create_account(
&payer.pubkey(),
Expand All @@ -410,16 +411,22 @@ pub async fn create_vote(
0,
&system_program::id(),
)];
instructions.append(&mut vote_instruction::create_account_with_config(

let (bls_pubkey, bls_pop) = create_bls_pubkey_and_proof_of_possession(&vote_account.pubkey());
instructions.append(&mut vote_instruction::create_account_with_config_v2(
&payer.pubkey(),
&vote_account.pubkey(),
&VoteInit {
&VoteInitV2 {
node_pubkey: validator.pubkey(),
authorized_voter: *voter,
authorized_withdrawer: *withdrawer,
..VoteInit::default()
authorized_voter_bls_pubkey: bls_pubkey,
authorized_voter_bls_proof_of_possession: bls_pop,
..VoteInitV2::default()
},
rent_voter,
&vote_account.pubkey(),
&vote_account.pubkey(),
LAMPORTS_PER_SOL * 100,
vote_instruction::CreateVoteAccountConfig {
space: VoteStateV4::size_of() as u64,
..Default::default()
Expand Down
Loading
Loading