Add helper fn and runtime test (#7516)
This commit is contained in:
parent
b22dc38ba1
commit
f03ed9f5bf
|
@ -221,6 +221,31 @@ pub fn create_account_and_delegate_stake(
|
||||||
instructions
|
instructions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_account_with_seed_and_delegate_stake(
|
||||||
|
from_pubkey: &Pubkey,
|
||||||
|
stake_pubkey: &Pubkey,
|
||||||
|
seed: &str,
|
||||||
|
vote_pubkey: &Pubkey,
|
||||||
|
authorized: &Authorized,
|
||||||
|
lockup: &Lockup,
|
||||||
|
lamports: u64,
|
||||||
|
) -> Vec<Instruction> {
|
||||||
|
let mut instructions = create_account_with_seed(
|
||||||
|
from_pubkey,
|
||||||
|
stake_pubkey,
|
||||||
|
seed,
|
||||||
|
authorized,
|
||||||
|
lockup,
|
||||||
|
lamports,
|
||||||
|
);
|
||||||
|
instructions.push(delegate_stake(
|
||||||
|
stake_pubkey,
|
||||||
|
&authorized.staker,
|
||||||
|
vote_pubkey,
|
||||||
|
));
|
||||||
|
instructions
|
||||||
|
}
|
||||||
|
|
||||||
pub fn authorize(
|
pub fn authorize(
|
||||||
stake_pubkey: &Pubkey,
|
stake_pubkey: &Pubkey,
|
||||||
authorized_pubkey: &Pubkey,
|
authorized_pubkey: &Pubkey,
|
||||||
|
|
|
@ -10,6 +10,7 @@ use solana_sdk::{
|
||||||
message::Message,
|
message::Message,
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
signature::{Keypair, KeypairUtil},
|
signature::{Keypair, KeypairUtil},
|
||||||
|
system_instruction::create_address_with_seed,
|
||||||
sysvar::{self, rewards::Rewards, stake_history::StakeHistory, Sysvar},
|
sysvar::{self, rewards::Rewards, stake_history::StakeHistory, Sysvar},
|
||||||
};
|
};
|
||||||
use solana_stake_program::{
|
use solana_stake_program::{
|
||||||
|
@ -337,3 +338,69 @@ fn test_stake_account_lifetime() {
|
||||||
assert_eq!(bank.get_balance(&split_stake_pubkey), 0);
|
assert_eq!(bank.get_balance(&split_stake_pubkey), 0);
|
||||||
assert_eq!(bank.get_balance(&stake_pubkey), lamports - lamports / 2);
|
assert_eq!(bank.get_balance(&stake_pubkey), lamports - lamports / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_create_stake_account_from_seed() {
|
||||||
|
let vote_keypair = Keypair::new();
|
||||||
|
let vote_pubkey = vote_keypair.pubkey();
|
||||||
|
let node_pubkey = Pubkey::new_rand();
|
||||||
|
|
||||||
|
let GenesisConfigInfo {
|
||||||
|
mut genesis_config,
|
||||||
|
mint_keypair,
|
||||||
|
..
|
||||||
|
} = create_genesis_config_with_leader(100_000_000_000, &Pubkey::new_rand(), 1_000_000);
|
||||||
|
genesis_config
|
||||||
|
.native_instruction_processors
|
||||||
|
.push(solana_stake_program::solana_stake_program!());
|
||||||
|
let bank = Bank::new(&genesis_config);
|
||||||
|
let mint_pubkey = mint_keypair.pubkey();
|
||||||
|
let bank = Arc::new(bank);
|
||||||
|
let bank_client = BankClient::new_shared(&bank);
|
||||||
|
|
||||||
|
let seed = "test-string";
|
||||||
|
let stake_pubkey =
|
||||||
|
create_address_with_seed(&mint_pubkey, seed, &solana_stake_program::id()).unwrap();
|
||||||
|
|
||||||
|
// Create Vote Account
|
||||||
|
let message = Message::new(vote_instruction::create_account(
|
||||||
|
&mint_pubkey,
|
||||||
|
&vote_pubkey,
|
||||||
|
&VoteInit {
|
||||||
|
node_pubkey,
|
||||||
|
authorized_voter: vote_pubkey,
|
||||||
|
authorized_withdrawer: vote_pubkey,
|
||||||
|
commission: 50,
|
||||||
|
},
|
||||||
|
10,
|
||||||
|
));
|
||||||
|
bank_client
|
||||||
|
.send_message(&[&mint_keypair, &vote_keypair], message)
|
||||||
|
.expect("failed to create vote account");
|
||||||
|
|
||||||
|
let authorized = stake_state::Authorized::auto(&mint_pubkey);
|
||||||
|
// Create stake account and delegate to vote account
|
||||||
|
let message = Message::new(
|
||||||
|
stake_instruction::create_account_with_seed_and_delegate_stake(
|
||||||
|
&mint_pubkey,
|
||||||
|
&stake_pubkey,
|
||||||
|
seed,
|
||||||
|
&vote_pubkey,
|
||||||
|
&authorized,
|
||||||
|
&stake_state::Lockup::default(),
|
||||||
|
1_000_000,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
bank_client
|
||||||
|
.send_message(&[&mint_keypair], message)
|
||||||
|
.expect("failed to create and delegate stake account");
|
||||||
|
|
||||||
|
// Test that correct lamports are staked
|
||||||
|
let account = bank.get_account(&stake_pubkey).expect("account not found");
|
||||||
|
let stake_state = account.state().expect("couldn't unpack account data");
|
||||||
|
if let StakeState::Stake(_meta, stake) = stake_state {
|
||||||
|
assert_eq!(stake.delegation.stake, 1_000_000);
|
||||||
|
} else {
|
||||||
|
assert!(false, "wrong account type found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue