getVoteAccounts RPC API no longer returns "idle" vote accounts, take II
This commit is contained in:
parent
22d6951de5
commit
77cd292828
|
@ -255,6 +255,10 @@ impl JsonRpcRequestProcessor {
|
||||||
last_vote,
|
last_vote,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.filter(|vote_account_info| {
|
||||||
|
// Remove vote accounts with no delegated stake that have never voted
|
||||||
|
vote_account_info.last_vote != 0 || vote_account_info.activated_stake != 0
|
||||||
|
})
|
||||||
.partition(|vote_account_info| {
|
.partition(|vote_account_info| {
|
||||||
if bank.slot() >= MAX_LOCKOUT_HISTORY as u64 {
|
if bank.slot() >= MAX_LOCKOUT_HISTORY as u64 {
|
||||||
vote_account_info.last_vote > bank.slot() - MAX_LOCKOUT_HISTORY as u64
|
vote_account_info.last_vote > bank.slot() - MAX_LOCKOUT_HISTORY as u64
|
||||||
|
@ -1010,13 +1014,14 @@ pub mod tests {
|
||||||
system_transaction,
|
system_transaction,
|
||||||
transaction::TransactionError,
|
transaction::TransactionError,
|
||||||
};
|
};
|
||||||
|
use solana_vote_program::{vote_instruction, vote_state::VoteInit};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
sync::atomic::{AtomicBool, Ordering},
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
thread,
|
thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
const TEST_MINT_LAMPORTS: u64 = 10_000;
|
const TEST_MINT_LAMPORTS: u64 = 1_000_000;
|
||||||
|
|
||||||
struct RpcHandler {
|
struct RpcHandler {
|
||||||
io: MetaIoHandler<Meta>,
|
io: MetaIoHandler<Meta>,
|
||||||
|
@ -1894,4 +1899,57 @@ pub mod tests {
|
||||||
.expect("actual response deserialization");
|
.expect("actual response deserialization");
|
||||||
assert_eq!(expected, result);
|
assert_eq!(expected, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_vote_accounts() {
|
||||||
|
let RpcHandler {
|
||||||
|
io,
|
||||||
|
meta,
|
||||||
|
bank,
|
||||||
|
alice,
|
||||||
|
..
|
||||||
|
} = start_rpc_handler_with_tx(&Pubkey::new_rand());
|
||||||
|
|
||||||
|
assert_eq!(bank.vote_accounts().len(), 1);
|
||||||
|
|
||||||
|
// Create a second vote account that has no stake. It should not be included in the
|
||||||
|
// getVoteAccounts response
|
||||||
|
let vote_keypair = Keypair::new();
|
||||||
|
let instructions = vote_instruction::create_account(
|
||||||
|
&alice.pubkey(),
|
||||||
|
&vote_keypair.pubkey(),
|
||||||
|
&VoteInit {
|
||||||
|
node_pubkey: alice.pubkey(),
|
||||||
|
authorized_voter: vote_keypair.pubkey(),
|
||||||
|
authorized_withdrawer: vote_keypair.pubkey(),
|
||||||
|
commission: 0,
|
||||||
|
},
|
||||||
|
bank.get_minimum_balance_for_rent_exemption(VoteState::size_of()),
|
||||||
|
);
|
||||||
|
|
||||||
|
let transaction = Transaction::new_signed_instructions(
|
||||||
|
&[&alice, &vote_keypair],
|
||||||
|
instructions,
|
||||||
|
bank.last_blockhash(),
|
||||||
|
);
|
||||||
|
bank.process_transaction(&transaction)
|
||||||
|
.expect("process transaction");
|
||||||
|
assert_eq!(bank.vote_accounts().len(), 2);
|
||||||
|
|
||||||
|
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getVoteAccounts"}}"#);
|
||||||
|
let res = io.handle_request_sync(&req, meta.clone());
|
||||||
|
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||||
|
.expect("actual response deserialization");
|
||||||
|
|
||||||
|
let vote_account_status: RpcVoteAccountStatus =
|
||||||
|
serde_json::from_value(result["result"].clone()).unwrap();
|
||||||
|
|
||||||
|
// The bootstrap leader vote account will be delinquent as it has stake but has never
|
||||||
|
// voted. The vote account with no stake should not be present.
|
||||||
|
assert!(vote_account_status.current.is_empty());
|
||||||
|
assert_eq!(vote_account_status.delinquent.len(), 1);
|
||||||
|
for vote_account_info in vote_account_status.delinquent {
|
||||||
|
assert_ne!(vote_account_info.activated_stake, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue