| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  | use solana_cli::{
 | 
					
						
							|  |  |  |     cli::{process_command, request_and_confirm_airdrop, CliCommand, CliConfig},
 | 
					
						
							|  |  |  |     spend_utils::SpendAmount,
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     test_utils::check_recent_balance,
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  | };
 | 
					
						
							| 
									
										
										
										
											2020-09-22 16:06:14 -06:00
										 |  |  | use solana_client::{
 | 
					
						
							|  |  |  |     blockhash_query::{self, BlockhashQuery},
 | 
					
						
							|  |  |  |     rpc_client::RpcClient,
 | 
					
						
							|  |  |  | };
 | 
					
						
							| 
									
										
										
										
											2020-09-18 22:21:44 -07:00
										 |  |  | use solana_core::test_validator::TestValidator;
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | use solana_faucet::faucet::run_local_faucet;
 | 
					
						
							|  |  |  | use solana_sdk::{
 | 
					
						
							|  |  |  |     account_utils::StateMut,
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     commitment_config::CommitmentConfig,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     signature::{Keypair, Signer},
 | 
					
						
							|  |  |  | };
 | 
					
						
							|  |  |  | use solana_vote_program::vote_state::{VoteAuthorize, VoteState, VoteStateVersions};
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[test]
 | 
					
						
							|  |  |  | fn test_vote_authorize_and_withdraw() {
 | 
					
						
							| 
									
										
										
										
											2020-12-08 23:18:27 -08:00
										 |  |  |     let mint_keypair = Keypair::new();
 | 
					
						
							| 
									
										
										
										
											2021-04-15 00:25:23 -06:00
										 |  |  |     let mint_pubkey = mint_keypair.pubkey();
 | 
					
						
							| 
									
										
										
										
											2021-01-28 12:11:53 -08:00
										 |  |  |     let faucet_addr = run_local_faucet(mint_keypair, None);
 | 
					
						
							| 
									
										
										
										
											2021-04-15 00:25:23 -06:00
										 |  |  |     let test_validator = TestValidator::with_no_fees(mint_pubkey, Some(faucet_addr));
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-19 15:33:03 -07:00
										 |  |  |     let rpc_client =
 | 
					
						
							| 
									
										
										
										
											2021-01-26 12:23:07 -07:00
										 |  |  |         RpcClient::new_with_commitment(test_validator.rpc_url(), CommitmentConfig::processed());
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     let default_signer = Keypair::new();
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     let mut config = CliConfig::recent_for_tests();
 | 
					
						
							| 
									
										
										
										
											2020-11-25 17:00:47 -08:00
										 |  |  |     config.json_rpc_url = test_validator.rpc_url();
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     config.signers = vec![&default_signer];
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-15 00:25:23 -06:00
										 |  |  |     request_and_confirm_airdrop(&rpc_client, &config, &config.signers[0].pubkey(), 100_000)
 | 
					
						
							|  |  |  |         .unwrap();
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Create vote account
 | 
					
						
							|  |  |  |     let vote_account_keypair = Keypair::new();
 | 
					
						
							|  |  |  |     let vote_account_pubkey = vote_account_keypair.pubkey();
 | 
					
						
							|  |  |  |     config.signers = vec![&default_signer, &vote_account_keypair];
 | 
					
						
							|  |  |  |     config.command = CliCommand::CreateVoteAccount {
 | 
					
						
							| 
									
										
										
										
											2020-07-13 21:27:41 -06:00
										 |  |  |         vote_account: 1,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |         seed: None,
 | 
					
						
							| 
									
										
										
										
											2020-03-19 01:58:52 -07:00
										 |  |  |         identity_account: 0,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |         authorized_voter: None,
 | 
					
						
							|  |  |  |         authorized_withdrawer: Some(config.signers[0].pubkey()),
 | 
					
						
							|  |  |  |         commission: 0,
 | 
					
						
							| 
									
										
										
										
											2021-04-05 13:53:50 -07:00
										 |  |  |         memo: None,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     };
 | 
					
						
							|  |  |  |     process_command(&config).unwrap();
 | 
					
						
							|  |  |  |     let vote_account = rpc_client
 | 
					
						
							| 
									
										
										
										
											2021-01-19 15:33:03 -07:00
										 |  |  |         .get_account(&vote_account_keypair.pubkey())
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |         .unwrap();
 | 
					
						
							|  |  |  |     let vote_state: VoteStateVersions = vote_account.state().unwrap();
 | 
					
						
							|  |  |  |     let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
 | 
					
						
							|  |  |  |     assert_eq!(authorized_withdrawer, config.signers[0].pubkey());
 | 
					
						
							|  |  |  |     let expected_balance = rpc_client
 | 
					
						
							|  |  |  |         .get_minimum_balance_for_rent_exemption(VoteState::size_of())
 | 
					
						
							|  |  |  |         .unwrap()
 | 
					
						
							|  |  |  |         .max(1);
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     check_recent_balance(expected_balance, &rpc_client, &vote_account_pubkey);
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  |     // Transfer in some more SOL
 | 
					
						
							|  |  |  |     config.signers = vec![&default_signer];
 | 
					
						
							|  |  |  |     config.command = CliCommand::Transfer {
 | 
					
						
							|  |  |  |         amount: SpendAmount::Some(1_000),
 | 
					
						
							|  |  |  |         to: vote_account_pubkey,
 | 
					
						
							|  |  |  |         from: 0,
 | 
					
						
							|  |  |  |         sign_only: false,
 | 
					
						
							| 
									
										
										
										
											2021-03-12 19:37:39 -07:00
										 |  |  |         dump_transaction_message: false,
 | 
					
						
							| 
									
										
										
										
											2021-03-22 11:10:44 -07:00
										 |  |  |         allow_unfunded_recipient: true,
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  |         no_wait: false,
 | 
					
						
							|  |  |  |         blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
 | 
					
						
							|  |  |  |         nonce_account: None,
 | 
					
						
							|  |  |  |         nonce_authority: 0,
 | 
					
						
							| 
									
										
										
										
											2021-04-05 13:53:50 -07:00
										 |  |  |         memo: None,
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  |         fee_payer: 0,
 | 
					
						
							| 
									
										
										
										
											2021-02-18 00:08:12 -07:00
										 |  |  |         derived_address_seed: None,
 | 
					
						
							|  |  |  |         derived_address_program_id: None,
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  |     };
 | 
					
						
							|  |  |  |     process_command(&config).unwrap();
 | 
					
						
							|  |  |  |     let expected_balance = expected_balance + 1_000;
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     check_recent_balance(expected_balance, &rpc_client, &vote_account_pubkey);
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     // Authorize vote account withdrawal to another signer
 | 
					
						
							|  |  |  |     let withdraw_authority = Keypair::new();
 | 
					
						
							|  |  |  |     config.signers = vec![&default_signer];
 | 
					
						
							|  |  |  |     config.command = CliCommand::VoteAuthorize {
 | 
					
						
							|  |  |  |         vote_account_pubkey,
 | 
					
						
							|  |  |  |         new_authorized_pubkey: withdraw_authority.pubkey(),
 | 
					
						
							|  |  |  |         vote_authorize: VoteAuthorize::Withdrawer,
 | 
					
						
							| 
									
										
										
										
											2021-04-05 13:53:50 -07:00
										 |  |  |         memo: None,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     };
 | 
					
						
							|  |  |  |     process_command(&config).unwrap();
 | 
					
						
							|  |  |  |     let vote_account = rpc_client
 | 
					
						
							| 
									
										
										
										
											2021-01-19 15:33:03 -07:00
										 |  |  |         .get_account(&vote_account_keypair.pubkey())
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |         .unwrap();
 | 
					
						
							|  |  |  |     let vote_state: VoteStateVersions = vote_account.state().unwrap();
 | 
					
						
							|  |  |  |     let authorized_withdrawer = vote_state.convert_to_current().authorized_withdrawer;
 | 
					
						
							|  |  |  |     assert_eq!(authorized_withdrawer, withdraw_authority.pubkey());
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Withdraw from vote account
 | 
					
						
							| 
									
										
										
										
											2020-10-19 12:12:08 -07:00
										 |  |  |     let destination_account = solana_sdk::pubkey::new_rand(); // Send withdrawal to new account to make balance check easy
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     config.signers = vec![&default_signer, &withdraw_authority];
 | 
					
						
							|  |  |  |     config.command = CliCommand::WithdrawFromVoteAccount {
 | 
					
						
							|  |  |  |         vote_account_pubkey,
 | 
					
						
							|  |  |  |         withdraw_authority: 1,
 | 
					
						
							| 
									
										
										
										
											2020-06-15 14:36:47 -07:00
										 |  |  |         withdraw_amount: SpendAmount::Some(100),
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |         destination_account_pubkey: destination_account,
 | 
					
						
							| 
									
										
										
										
											2021-04-05 13:53:50 -07:00
										 |  |  |         memo: None,
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  |     };
 | 
					
						
							|  |  |  |     process_command(&config).unwrap();
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:18:48 -06:00
										 |  |  |     check_recent_balance(expected_balance - 100, &rpc_client, &vote_account_pubkey);
 | 
					
						
							|  |  |  |     check_recent_balance(100, &rpc_client, &destination_account);
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 01:58:52 -07:00
										 |  |  |     // Re-assign validator identity
 | 
					
						
							|  |  |  |     let new_identity_keypair = Keypair::new();
 | 
					
						
							|  |  |  |     config.signers.push(&new_identity_keypair);
 | 
					
						
							|  |  |  |     config.command = CliCommand::VoteUpdateValidator {
 | 
					
						
							|  |  |  |         vote_account_pubkey,
 | 
					
						
							|  |  |  |         new_identity_account: 2,
 | 
					
						
							| 
									
										
										
										
											2020-07-13 21:49:59 -06:00
										 |  |  |         withdraw_authority: 1,
 | 
					
						
							| 
									
										
										
										
											2021-04-05 13:53:50 -07:00
										 |  |  |         memo: None,
 | 
					
						
							| 
									
										
										
										
											2020-03-19 01:58:52 -07:00
										 |  |  |     };
 | 
					
						
							|  |  |  |     process_command(&config).unwrap();
 | 
					
						
							| 
									
										
										
										
											2020-03-13 16:30:04 -04:00
										 |  |  | }
 |