From 6892970c1907808b0f2ef15c2054c9d28d656a35 Mon Sep 17 00:00:00 2001 From: Tao Zhu <82401714+taozhu-chicago@users.noreply.github.com> Date: Tue, 2 Aug 2022 22:23:05 -0500 Subject: [PATCH] Cli support compute_unit_price (#26464) * add compute-unit-price trait to insert compute_budget instruction to set priorization fee * add clap arg for compute-unit-price * add compute-unit-price arg to commands that send transactions * add and update tests --- clap-utils/src/compute_unit_price.rs | 15 +++ clap-utils/src/lib.rs | 1 + cli/src/cli.rs | 87 +++++++++++++++- cli/src/cluster_query.rs | 25 ++--- cli/src/compute_unit_price.rs | 16 +++ cli/src/lib.rs | 1 + cli/src/nonce.rs | 88 ++++++++++++++-- cli/src/stake.rs | 148 +++++++++++++++++++++++++-- cli/src/vote.rs | 104 +++++++++++++++++-- cli/src/wallet.rs | 13 ++- cli/tests/nonce.rs | 10 ++ cli/tests/stake.rs | 64 ++++++++++++ cli/tests/transfer.rs | 15 +++ cli/tests/vote.rs | 18 ++++ 14 files changed, 559 insertions(+), 46 deletions(-) create mode 100644 clap-utils/src/compute_unit_price.rs create mode 100644 cli/src/compute_unit_price.rs diff --git a/clap-utils/src/compute_unit_price.rs b/clap-utils/src/compute_unit_price.rs new file mode 100644 index 0000000000..f8fd279d98 --- /dev/null +++ b/clap-utils/src/compute_unit_price.rs @@ -0,0 +1,15 @@ +use {crate::ArgConstant, clap::Arg}; + +pub const COMPUTE_UNIT_PRICE_ARG: ArgConstant<'static> = ArgConstant { + name: "compute_unit_price", + long: "--with-compute-unit-price", + help: "Set compute unit price for transaction, in increments of 0.000001 lamports per compute unit.", +}; + +pub fn compute_unit_price_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name(COMPUTE_UNIT_PRICE_ARG.name) + .long(COMPUTE_UNIT_PRICE_ARG.long) + .takes_value(true) + .value_name("COMPUTE-UNIT-PRICE") + .help(COMPUTE_UNIT_PRICE_ARG.help) +} diff --git a/clap-utils/src/lib.rs b/clap-utils/src/lib.rs index c6f7e8e2d9..397dc7cbcf 100644 --- a/clap-utils/src/lib.rs +++ b/clap-utils/src/lib.rs @@ -23,6 +23,7 @@ impl std::fmt::Debug for DisplayError { } } +pub mod compute_unit_price; pub mod fee_payer; pub mod input_parsers; pub mod input_validators; diff --git a/cli/src/cli.rs b/cli/src/cli.rs index d37d2ef87c..2a2397efd3 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -133,6 +133,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, new_authority: Pubkey, + compute_unit_price: Option, }, CreateNonceAccount { nonce_account: SignerIndex, @@ -140,12 +141,14 @@ pub enum CliCommand { nonce_authority: Option, memo: Option, amount: SpendAmount, + compute_unit_price: Option, }, GetNonce(Pubkey), NewNonce { nonce_account: Pubkey, nonce_authority: SignerIndex, memo: Option, + compute_unit_price: Option, }, ShowNonceAccount { nonce_account_pubkey: Pubkey, @@ -157,10 +160,12 @@ pub enum CliCommand { memo: Option, destination_account_pubkey: Pubkey, lamports: u64, + compute_unit_price: Option, }, UpgradeNonceAccount { nonce_account: Pubkey, memo: Option, + compute_unit_price: Option, }, // Program Deployment Deploy { @@ -188,6 +193,7 @@ pub enum CliCommand { memo: Option, fee_payer: SignerIndex, from: SignerIndex, + compute_unit_price: Option, }, DeactivateStake { stake_account_pubkey: Pubkey, @@ -201,6 +207,7 @@ pub enum CliCommand { memo: Option, seed: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, DelegateStake { stake_account_pubkey: Pubkey, @@ -215,6 +222,7 @@ pub enum CliCommand { memo: Option, fee_payer: SignerIndex, redelegation_stake_account_pubkey: Option, + compute_unit_price: Option, }, SplitStake { stake_account_pubkey: Pubkey, @@ -229,6 +237,7 @@ pub enum CliCommand { seed: Option, lamports: u64, fee_payer: SignerIndex, + compute_unit_price: Option, }, MergeStake { stake_account_pubkey: Pubkey, @@ -241,6 +250,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, ShowStakeHistory { use_lamports_unit: bool, @@ -263,6 +273,7 @@ pub enum CliCommand { fee_payer: SignerIndex, custodian: Option, no_wait: bool, + compute_unit_price: Option, }, StakeSetLockup { stake_account_pubkey: Pubkey, @@ -276,6 +287,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, WithdrawStake { stake_account_pubkey: Pubkey, @@ -291,6 +303,7 @@ pub enum CliCommand { memo: Option, seed: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, // Validator Info Commands GetValidatorInfo(Option), @@ -314,6 +327,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, ShowVoteAccount { pubkey: Pubkey, @@ -332,6 +346,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, CloseVoteAccount { vote_account_pubkey: Pubkey, @@ -339,6 +354,7 @@ pub enum CliCommand { withdraw_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, VoteAuthorize { vote_account_pubkey: Pubkey, @@ -353,6 +369,7 @@ pub enum CliCommand { fee_payer: SignerIndex, authorized: SignerIndex, new_authorized: Option, + compute_unit_price: Option, }, VoteUpdateValidator { vote_account_pubkey: Pubkey, @@ -365,6 +382,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, VoteUpdateCommission { vote_account_pubkey: Pubkey, @@ -377,6 +395,7 @@ pub enum CliCommand { nonce_authority: SignerIndex, memo: Option, fee_payer: SignerIndex, + compute_unit_price: Option, }, // Wallet Commands Address, @@ -416,6 +435,7 @@ pub enum CliCommand { fee_payer: SignerIndex, derived_address_seed: Option, derived_address_program_id: Option, + compute_unit_price: Option, }, StakeMinimumDelegation { use_lamports_unit: bool, @@ -900,7 +920,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { timeout, blockhash, *print_timestamp, - compute_unit_price, + compute_unit_price.as_ref(), ), CliCommand::Rent { data_length, @@ -969,6 +989,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, new_authority, + compute_unit_price, } => process_authorize_nonce_account( &rpc_client, config, @@ -976,6 +997,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), new_authority, + compute_unit_price.as_ref(), ), // Create nonce account CliCommand::CreateNonceAccount { @@ -984,6 +1006,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, amount, + compute_unit_price, } => process_create_nonce_account( &rpc_client, config, @@ -992,6 +1015,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *amount, + compute_unit_price.as_ref(), ), // Get the current nonce CliCommand::GetNonce(nonce_account_pubkey) => { @@ -1002,12 +1026,14 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_account, nonce_authority, memo, + compute_unit_price, } => process_new_nonce( &rpc_client, config, nonce_account, *nonce_authority, memo.as_ref(), + compute_unit_price.as_ref(), ), // Show the contents of a nonce account CliCommand::ShowNonceAccount { @@ -1026,6 +1052,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, destination_account_pubkey, lamports, + compute_unit_price, } => process_withdraw_from_nonce_account( &rpc_client, config, @@ -1034,12 +1061,20 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), destination_account_pubkey, *lamports, + compute_unit_price.as_ref(), ), // Upgrade nonce account out of blockhash domain. CliCommand::UpgradeNonceAccount { nonce_account, memo, - } => process_upgrade_nonce_account(&rpc_client, config, *nonce_account, memo.as_ref()), + compute_unit_price, + } => process_upgrade_nonce_account( + &rpc_client, + config, + *nonce_account, + memo.as_ref(), + compute_unit_price.as_ref(), + ), // Program Deployment @@ -1082,6 +1117,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, fee_payer, from, + compute_unit_price, } => process_create_stake_account( &rpc_client, config, @@ -1100,6 +1136,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), *fee_payer, *from, + compute_unit_price.as_ref(), ), CliCommand::DeactivateStake { stake_account_pubkey, @@ -1113,6 +1150,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, seed, fee_payer, + compute_unit_price, } => process_deactivate_stake_account( &rpc_client, config, @@ -1127,6 +1165,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), seed.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::DelegateStake { stake_account_pubkey, @@ -1141,6 +1180,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, fee_payer, redelegation_stake_account_pubkey, + compute_unit_price, } => process_delegate_stake( &rpc_client, config, @@ -1156,6 +1196,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), *fee_payer, redelegation_stake_account_pubkey.as_ref(), + compute_unit_price.as_ref(), ), CliCommand::SplitStake { stake_account_pubkey, @@ -1170,6 +1211,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { seed, lamports, fee_payer, + compute_unit_price, } => process_split_stake( &rpc_client, config, @@ -1185,6 +1227,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { seed, *lamports, *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::MergeStake { stake_account_pubkey, @@ -1197,6 +1240,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_merge_stake( &rpc_client, config, @@ -1210,6 +1254,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::ShowStakeAccount { pubkey: stake_account_pubkey, @@ -1238,6 +1283,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { fee_payer, custodian, no_wait, + compute_unit_price, } => process_stake_authorize( &rpc_client, config, @@ -1252,6 +1298,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), *fee_payer, *no_wait, + compute_unit_price.as_ref(), ), CliCommand::StakeSetLockup { stake_account_pubkey, @@ -1265,6 +1312,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_stake_set_lockup( &rpc_client, config, @@ -1279,6 +1327,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::WithdrawStake { stake_account_pubkey, @@ -1294,6 +1343,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo, seed, fee_payer, + compute_unit_price, } => process_withdraw_stake( &rpc_client, config, @@ -1310,6 +1360,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { memo.as_ref(), seed.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::StakeMinimumDelegation { use_lamports_unit } => { process_stake_minimum_delegation(&rpc_client, config, *use_lamports_unit) @@ -1351,6 +1402,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_create_vote_account( &rpc_client, config, @@ -1367,6 +1419,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::ShowVoteAccount { pubkey: vote_account_pubkey, @@ -1391,6 +1444,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_withdraw_from_vote_account( &rpc_client, config, @@ -1405,6 +1459,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::CloseVoteAccount { vote_account_pubkey, @@ -1412,6 +1467,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { destination_account_pubkey, memo, fee_payer, + compute_unit_price, } => process_close_vote_account( &rpc_client, config, @@ -1420,6 +1476,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { destination_account_pubkey, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::VoteAuthorize { vote_account_pubkey, @@ -1434,6 +1491,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { fee_payer, authorized, new_authorized, + compute_unit_price, } => process_vote_authorize( &rpc_client, config, @@ -1449,6 +1507,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::VoteUpdateValidator { vote_account_pubkey, @@ -1461,6 +1520,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_vote_update_validator( &rpc_client, config, @@ -1474,6 +1534,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), CliCommand::VoteUpdateCommission { vote_account_pubkey, @@ -1486,6 +1547,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { nonce_authority, memo, fee_payer, + compute_unit_price, } => process_vote_update_commission( &rpc_client, config, @@ -1499,6 +1561,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *nonce_authority, memo.as_ref(), *fee_payer, + compute_unit_price.as_ref(), ), // Wallet Commands @@ -1544,6 +1607,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { fee_payer, derived_address_seed, ref derived_address_program_id, + compute_unit_price, } => process_transfer( &rpc_client, config, @@ -1561,6 +1625,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *fee_payer, derived_address_seed.clone(), derived_address_program_id.as_ref(), + compute_unit_price.as_ref(), ), } } @@ -2006,6 +2071,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; config.signers = vec![&keypair, &bob_keypair, &identity_keypair]; let result = process_command(&config); @@ -2048,6 +2114,7 @@ mod tests { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }; let result = process_command(&vote_config); assert!(result.is_ok()); @@ -2065,6 +2132,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; let result = process_command(&config); assert!(result.is_ok()); @@ -2092,6 +2160,7 @@ mod tests { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; config.signers = vec![&keypair, &bob_keypair]; let result = process_command(&config); @@ -2113,6 +2182,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; config.signers = vec![&keypair]; let result = process_command(&config); @@ -2131,6 +2201,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; let result = process_command(&config); assert!(result.is_ok()); @@ -2150,6 +2221,7 @@ mod tests { seed: None, lamports: 30, fee_payer: 0, + compute_unit_price: None, }; config.signers = vec![&keypair, &split_stake_account]; let result = process_command(&config); @@ -2169,6 +2241,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; config.signers = vec![&keypair, &merge_stake_account]; let result = process_command(&config); @@ -2248,6 +2321,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; config.signers = vec![&keypair, &bob_keypair, &identity_keypair]; assert!(process_command(&config).is_err()); @@ -2265,6 +2339,7 @@ mod tests { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }; assert!(process_command(&config).is_err()); @@ -2279,6 +2354,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; assert!(process_command(&config).is_err()); @@ -2383,6 +2459,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2410,6 +2487,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2442,6 +2520,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2477,6 +2556,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2520,6 +2600,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![Presigner::new(&from_pubkey, &from_sig).into()], } @@ -2564,6 +2645,7 @@ mod tests { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2603,6 +2685,7 @@ mod tests { fee_payer: 0, derived_address_seed: Some(derived_address_seed), derived_address_program_id: Some(stake::program::id()), + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], } diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 5bf175bbe3..c6b08e3a28 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -1,6 +1,7 @@ use { crate::{ cli::{CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult}, + compute_unit_price::WithComputeUnitPrice, spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount}, }, clap::{value_t, value_t_or_exit, App, AppSettings, Arg, ArgMatches, SubCommand}, @@ -8,6 +9,7 @@ use { crossbeam_channel::unbounded, serde::{Deserialize, Serialize}, solana_clap_utils::{ + compute_unit_price::{compute_unit_price_arg, COMPUTE_UNIT_PRICE_ARG}, input_parsers::*, input_validators::*, keypair::DefaultSigner, @@ -40,7 +42,6 @@ use { account_utils::StateMut, clock::{self, Clock, Slot}, commitment_config::CommitmentConfig, - compute_budget::ComputeBudgetInstruction, epoch_schedule::Epoch, hash::Hash, message::Message, @@ -271,13 +272,7 @@ impl ClusterQuerySubCommands for App<'_, '_> { .default_value("15") .help("Wait up to timeout seconds for transaction confirmation"), ) - .arg( - Arg::with_name("compute_unit_price") - .long("compute-unit-price") - .value_name("MICRO-LAMPORTS") - .takes_value(true) - .help("Set the price in micro-lamports of each transaction compute unit"), - ) + .arg(compute_unit_price_arg()) .arg(blockhash_arg()), ) .subcommand( @@ -529,7 +524,7 @@ pub fn parse_cluster_ping( let timeout = Duration::from_secs(value_t_or_exit!(matches, "timeout", u64)); let blockhash = value_of(matches, BLOCKHASH_ARG.name); let print_timestamp = matches.is_present("print_timestamp"); - let compute_unit_price = value_of(matches, "compute_unit_price"); + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::Ping { interval, @@ -1396,7 +1391,7 @@ pub fn process_ping( timeout: &Duration, fixed_blockhash: &Option, print_timestamp: bool, - compute_unit_price: &Option, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let (signal_sender, signal_receiver) = unbounded(); ctrlc::set_handler(move || { @@ -1436,16 +1431,12 @@ pub fn process_ping( lamports += 1; let build_message = |lamports| { - let mut ixs = vec![system_instruction::transfer( + let ixs = vec![system_instruction::transfer( &config.signers[0].pubkey(), &to, lamports, - )]; - if let Some(compute_unit_price) = compute_unit_price { - ixs.push(ComputeBudgetInstruction::set_compute_unit_price( - *compute_unit_price, - )); - } + )] + .with_compute_unit_price(compute_unit_price); Message::new(&ixs, Some(&config.signers[0].pubkey())) }; let (message, _) = resolve_spend_tx_and_check_account_balance( diff --git a/cli/src/compute_unit_price.rs b/cli/src/compute_unit_price.rs new file mode 100644 index 0000000000..c22cb4b0a4 --- /dev/null +++ b/cli/src/compute_unit_price.rs @@ -0,0 +1,16 @@ +use solana_sdk::{compute_budget::ComputeBudgetInstruction, instruction::Instruction}; + +pub trait WithComputeUnitPrice { + fn with_compute_unit_price(self, compute_unit_price: Option<&u64>) -> Self; +} + +impl WithComputeUnitPrice for Vec { + fn with_compute_unit_price(mut self, compute_unit_price: Option<&u64>) -> Self { + if let Some(compute_unit_price) = compute_unit_price { + self.push(ComputeBudgetInstruction::set_compute_unit_price( + *compute_unit_price, + )); + } + self + } +} diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 9fd8c7b98e..85d90869ff 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -27,6 +27,7 @@ pub mod checks; pub mod clap_app; pub mod cli; pub mod cluster_query; +pub mod compute_unit_price; pub mod feature; pub mod inflation; pub mod memo; diff --git a/cli/src/nonce.rs b/cli/src/nonce.rs index 3047afa378..1d7324bf30 100644 --- a/cli/src/nonce.rs +++ b/cli/src/nonce.rs @@ -5,12 +5,14 @@ use { log_instruction_custom_error, log_instruction_custom_error_ex, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult, }, + compute_unit_price::WithComputeUnitPrice, feature::get_feature_is_active, memo::WithMemo, spend_utils::{resolve_spend_tx_and_check_account_balance, SpendAmount}, }, clap::{App, Arg, ArgMatches, SubCommand}, solana_clap_utils::{ + compute_unit_price::{compute_unit_price_arg, COMPUTE_UNIT_PRICE_ARG}, input_parsers::*, input_validators::*, keypair::{CliSigners, DefaultSigner, SignerIndex}, @@ -63,7 +65,8 @@ impl NonceSubCommands for App<'_, '_> { "Account to be granted authority of the nonce account. "), ) .arg(nonce_authority_arg()) - .arg(memo_arg()), + .arg(memo_arg()) + .arg(compute_unit_price_arg()), ) .subcommand( SubCommand::with_name("create-nonce-account") @@ -99,7 +102,8 @@ impl NonceSubCommands for App<'_, '_> { .takes_value(true) .help("Seed for address generation; if specified, the resulting account will be at a derived address of the NONCE_ACCOUNT pubkey") ) - .arg(memo_arg()), + .arg(memo_arg()) + .arg(compute_unit_price_arg()), ) .subcommand( SubCommand::with_name("nonce") @@ -124,7 +128,8 @@ impl NonceSubCommands for App<'_, '_> { "Address of the nonce account. "), ) .arg(nonce_authority_arg()) - .arg(memo_arg()), + .arg(memo_arg()) + .arg(compute_unit_price_arg()), ) .subcommand( SubCommand::with_name("nonce-account") @@ -171,7 +176,8 @@ impl NonceSubCommands for App<'_, '_> { .help("The amount to withdraw from the nonce account, in SOL"), ) .arg(nonce_authority_arg()) - .arg(memo_arg()), + .arg(memo_arg()) + .arg(compute_unit_price_arg()), ) .subcommand( SubCommand::with_name("upgrade-nonce-account") @@ -184,7 +190,8 @@ impl NonceSubCommands for App<'_, '_> { .required(true), "Nonce account to upgrade. "), ) - .arg(memo_arg()), + .arg(memo_arg()) + .arg(compute_unit_price_arg()), ) } } @@ -206,6 +213,7 @@ pub fn parse_authorize_nonce_account( matches, wallet_manager, )?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::AuthorizeNonceAccount { @@ -213,6 +221,7 @@ pub fn parse_authorize_nonce_account( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, new_authority, + compute_unit_price, }, signers: signer_info.signers, }) @@ -236,6 +245,7 @@ pub fn parse_nonce_create_account( matches, wallet_manager, )?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::CreateNonceAccount { @@ -244,6 +254,7 @@ pub fn parse_nonce_create_account( nonce_authority, memo, amount, + compute_unit_price, }, signers: signer_info.signers, }) @@ -278,12 +289,14 @@ pub fn parse_new_nonce( matches, wallet_manager, )?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::NewNonce { nonce_account, nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, + compute_unit_price, }, signers: signer_info.signers, }) @@ -325,6 +338,7 @@ pub fn parse_withdraw_from_nonce_account( matches, wallet_manager, )?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::WithdrawFromNonceAccount { @@ -333,6 +347,7 @@ pub fn parse_withdraw_from_nonce_account( memo, destination_account_pubkey, lamports, + compute_unit_price, }, signers: signer_info.signers, }) @@ -343,10 +358,12 @@ pub(crate) fn parse_upgrade_nonce_account( ) -> Result { let nonce_account = pubkey_of(matches, "nonce_account_pubkey").unwrap(); let memo = matches.value_of(MEMO_ARG.name).map(String::from); + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::UpgradeNonceAccount { nonce_account, memo, + compute_unit_price, }, signers: CliSigners::default(), }) @@ -387,6 +404,7 @@ pub fn process_authorize_nonce_account( nonce_authority: SignerIndex, memo: Option<&String>, new_authority: &Pubkey, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let latest_blockhash = rpc_client.get_latest_blockhash()?; @@ -396,7 +414,8 @@ pub fn process_authorize_nonce_account( &nonce_authority.pubkey(), new_authority, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let message = Message::new(&ixs, Some(&config.signers[0].pubkey())); let mut tx = Transaction::new_unsigned(message); tx.try_sign(&config.signers, latest_blockhash)?; @@ -432,6 +451,7 @@ pub fn process_create_nonce_account( nonce_authority: Option, memo: Option<&String>, amount: SpendAmount, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let nonce_account_pubkey = config.signers[nonce_account].pubkey(); let nonce_account_address = if let Some(ref seed) = seed { @@ -458,6 +478,7 @@ pub fn process_create_nonce_account( lamports, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) } else { create_nonce_account( &config.signers[0].pubkey(), @@ -466,6 +487,7 @@ pub fn process_create_nonce_account( lamports, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) }; Message::new(&ixs, Some(&config.signers[0].pubkey())) }; @@ -561,6 +583,7 @@ pub fn process_new_nonce( nonce_account: &Pubkey, nonce_authority: SignerIndex, memo: Option<&String>, + compute_unit_price: Option<&u64>, ) -> ProcessResult { check_unique_pubkeys( (&config.signers[0].pubkey(), "cli keypair".to_string()), @@ -580,7 +603,8 @@ pub fn process_new_nonce( nonce_account, &nonce_authority.pubkey(), )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let latest_blockhash = rpc_client.get_latest_blockhash()?; let message = Message::new(&ixs, Some(&config.signers[0].pubkey())); let mut tx = Transaction::new_unsigned(message); @@ -646,6 +670,7 @@ pub fn process_withdraw_from_nonce_account( memo: Option<&String>, destination_account_pubkey: &Pubkey, lamports: u64, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let latest_blockhash = rpc_client.get_latest_blockhash()?; @@ -656,7 +681,8 @@ pub fn process_withdraw_from_nonce_account( destination_account_pubkey, lamports, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let message = Message::new(&ixs, Some(&config.signers[0].pubkey())); let mut tx = Transaction::new_unsigned(message); tx.try_sign(&config.signers, latest_blockhash)?; @@ -688,9 +714,12 @@ pub(crate) fn process_upgrade_nonce_account( config: &CliConfig, nonce_account: Pubkey, memo: Option<&String>, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let latest_blockhash = rpc_client.get_latest_blockhash()?; - let ixs = vec![upgrade_nonce_account(nonce_account)].with_memo(memo); + let ixs = vec![upgrade_nonce_account(nonce_account)] + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let message = Message::new(&ixs, Some(&config.signers[0].pubkey())); let mut tx = Transaction::new_unsigned(message); tx.try_sign(&config.signers, latest_blockhash)?; @@ -774,6 +803,7 @@ mod tests { nonce_authority: 0, memo: None, new_authority: Pubkey::default(), + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -796,6 +826,7 @@ mod tests { nonce_authority: 1, memo: None, new_authority: Pubkey::default(), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -820,6 +851,7 @@ mod tests { nonce_authority: None, memo: None, amount: SpendAmount::Some(50_000_000_000), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -846,6 +878,7 @@ mod tests { nonce_authority: Some(nonce_authority_keypair.pubkey()), memo: None, amount: SpendAmount::Some(50_000_000_000), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -881,6 +914,7 @@ mod tests { nonce_account: nonce_account.pubkey(), nonce_authority: 0, memo: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -902,6 +936,7 @@ mod tests { nonce_account: nonce_account.pubkey(), nonce_authority: 1, memo: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -948,7 +983,8 @@ mod tests { nonce_authority: 0, memo: None, destination_account_pubkey: nonce_account_pubkey, - lamports: 42_000_000_000 + lamports: 42_000_000_000, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -977,7 +1013,8 @@ mod tests { nonce_authority: 1, memo: None, destination_account_pubkey: nonce_account_pubkey, - lamports: 42_000_000_000 + lamports: 42_000_000_000, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -998,10 +1035,39 @@ mod tests { command: CliCommand::UpgradeNonceAccount { nonce_account: nonce_account_pubkey, memo: None, + compute_unit_price: None, }, signers: CliSigners::default(), } ); + + // Test ComputeUnitPrice Subcommand with authority + let test_authorize_nonce_account = test_commands.clone().get_matches_from(vec![ + "test", + "authorize-nonce-account", + &keypair_file, + &Pubkey::default().to_string(), + "--nonce-authority", + &authority_keypair_file, + "--with-compute-unit-price", + "99", + ]); + assert_eq!( + parse_command(&test_authorize_nonce_account, &default_signer, &mut None).unwrap(), + CliCommandInfo { + command: CliCommand::AuthorizeNonceAccount { + nonce_account: read_keypair_file(&keypair_file).unwrap().pubkey(), + nonce_authority: 1, + memo: None, + new_authority: Pubkey::default(), + compute_unit_price: Some(99), + }, + signers: vec![ + read_keypair_file(&default_keypair_file).unwrap().into(), + read_keypair_file(&authority_keypair_file).unwrap().into() + ], + } + ); } #[test] diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 2ab885d35b..03425f474c 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -5,12 +5,14 @@ use { log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult, }, + compute_unit_price::WithComputeUnitPrice, memo::WithMemo, nonce::check_nonce_account, spend_utils::{resolve_spend_tx_and_check_account_balances, SpendAmount}, }, clap::{value_t, App, Arg, ArgGroup, ArgMatches, SubCommand}, solana_clap_utils::{ + compute_unit_price::{compute_unit_price_arg, COMPUTE_UNIT_PRICE_ARG}, fee_payer::{fee_payer_arg, FEE_PAYER_ARG}, input_parsers::*, input_validators::*, @@ -196,6 +198,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("create-stake-account-checked") @@ -254,6 +257,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("delegate-stake") @@ -284,6 +288,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("redelegate-stake") @@ -367,6 +372,7 @@ impl StakeSubCommands for App<'_, '_> { .help("Return signature immediately after submitting the transaction, instead of waiting for confirmations"), ) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("stake-authorize-checked") @@ -407,6 +413,7 @@ impl StakeSubCommands for App<'_, '_> { .help("Return signature immediately after submitting the transaction, instead of waiting for confirmations"), ) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("deactivate-stake") @@ -438,6 +445,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("split-stake") @@ -480,6 +488,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("merge-stake") @@ -504,6 +513,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("withdraw-stake") @@ -545,6 +555,7 @@ impl StakeSubCommands for App<'_, '_> { .arg(fee_payer_arg()) .arg(custodian_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("stake-set-lockup") @@ -593,6 +604,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("stake-set-lockup-checked") @@ -643,6 +655,7 @@ impl StakeSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("stake-account") @@ -758,6 +771,7 @@ pub fn parse_create_stake_account( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::CreateStakeAccount { @@ -784,6 +798,7 @@ pub fn parse_create_stake_account( memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), from: signer_info.index_of(from_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -818,6 +833,7 @@ pub fn parse_stake_delegate_stake( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::DelegateStake { @@ -833,6 +849,7 @@ pub fn parse_stake_delegate_stake( memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), redelegation_stake_account_pubkey, + compute_unit_price, }, signers: signer_info.signers, }) @@ -923,6 +940,7 @@ pub fn parse_stake_authorize( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let new_authorizations = new_authorizations .into_iter() @@ -955,6 +973,7 @@ pub fn parse_stake_authorize( fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), custodian: custodian_pubkey.and_then(|_| signer_info.index_of(custodian_pubkey)), no_wait, + compute_unit_price, }, signers: signer_info.signers, }) @@ -989,6 +1008,7 @@ pub fn parse_split_stake( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::SplitStake { @@ -1004,6 +1024,7 @@ pub fn parse_split_stake( seed, lamports, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -1036,6 +1057,7 @@ pub fn parse_merge_stake( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::MergeStake { @@ -1049,6 +1071,7 @@ pub fn parse_merge_stake( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -1081,6 +1104,7 @@ pub fn parse_stake_deactivate_stake( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::DeactivateStake { @@ -1095,6 +1119,7 @@ pub fn parse_stake_deactivate_stake( memo, seed, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -1132,6 +1157,7 @@ pub fn parse_stake_withdraw_stake( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::WithdrawStake { @@ -1148,6 +1174,7 @@ pub fn parse_stake_withdraw_stake( seed, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), custodian: custodian_pubkey.and_then(|_| signer_info.index_of(custodian_pubkey)), + compute_unit_price, }, signers: signer_info.signers, }) @@ -1193,6 +1220,7 @@ pub fn parse_stake_set_lockup( } let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::StakeSetLockup { @@ -1215,6 +1243,7 @@ pub fn parse_stake_set_lockup( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -1283,6 +1312,7 @@ pub fn process_create_stake_account( memo: Option<&String>, fee_payer: SignerIndex, from: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let stake_account = config.signers[stake_account]; let stake_account_address = if let Some(seed) = seed { @@ -1339,7 +1369,8 @@ pub fn process_create_stake_account( lamports, ), } - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); if let Some(nonce_account) = &nonce_account { Message::new_with_nonce( ixs, @@ -1431,6 +1462,7 @@ pub fn process_stake_authorize( memo: Option<&String>, fee_payer: SignerIndex, no_wait: bool, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let mut ixs = Vec::new(); let custodian = custodian.map(|index| config.signers[index]); @@ -1497,7 +1529,9 @@ pub fn process_stake_authorize( )); } } - ixs = ixs.with_memo(memo); + ixs = ixs + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; @@ -1565,6 +1599,7 @@ pub fn process_deactivate_stake_account( memo: Option<&String>, seed: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; @@ -1643,7 +1678,8 @@ pub fn process_deactivate_stake_account( let stake_authority = config.signers[stake_authority]; stake_instruction::deactivate_stake(&stake_account_address, &stake_authority.pubkey()) }] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; let fee_payer = config.signers[fee_payer]; @@ -1707,6 +1743,7 @@ pub fn process_withdraw_stake( memo: Option<&String>, seed: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let withdraw_authority = config.signers[withdraw_authority]; let custodian = custodian.map(|index| config.signers[index]); @@ -1730,7 +1767,8 @@ pub fn process_withdraw_stake( lamports, custodian.map(|signer| signer.pubkey()).as_ref(), )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); if let Some(nonce_account) = &nonce_account { Message::new_with_nonce( @@ -1803,6 +1841,7 @@ pub fn process_split_stake( split_stake_account_seed: &Option, lamports: u64, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let split_stake_account = config.signers[split_stake_account]; let fee_payer = config.signers[fee_payer]; @@ -1876,6 +1915,7 @@ pub fn process_split_stake( seed, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) } else { stake_instruction::split( stake_account_pubkey, @@ -1884,6 +1924,7 @@ pub fn process_split_stake( &split_stake_account_address, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) }; let nonce_authority = config.signers[nonce_authority]; @@ -1944,6 +1985,7 @@ pub fn process_merge_stake( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let fee_payer = config.signers[fee_payer]; @@ -1989,7 +2031,8 @@ pub fn process_merge_stake( source_stake_account_pubkey, &stake_authority.pubkey(), ) - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; @@ -2054,6 +2097,7 @@ pub fn process_stake_set_lockup( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; let custodian = config.signers[custodian]; @@ -2063,7 +2107,8 @@ pub fn process_stake_set_lockup( } else { stake_instruction::set_lockup(stake_account_pubkey, lockup, &custodian.pubkey()) }] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; let fee_payer = config.signers[fee_payer]; @@ -2463,6 +2508,7 @@ pub fn process_delegate_stake( memo: Option<&String>, fee_payer: SignerIndex, redelegation_stake_account_pubkey: Option<&Pubkey>, + compute_unit_price: Option<&u64>, ) -> ProcessResult { check_unique_pubkeys( (&config.signers[0].pubkey(), "cli keypair".to_string()), @@ -2550,7 +2596,8 @@ pub fn process_delegate_stake( vote_account_pubkey, )] } - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; let fee_payer = config.signers[fee_payer]; @@ -2701,6 +2748,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2749,6 +2797,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2801,6 +2850,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2837,6 +2887,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2870,6 +2921,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2909,6 +2961,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2945,6 +2998,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], }, @@ -2978,6 +3032,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3017,6 +3072,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: true, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -3063,6 +3119,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3114,6 +3171,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3167,6 +3225,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3204,6 +3263,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3240,6 +3300,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3280,6 +3341,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3317,6 +3379,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3353,6 +3416,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3393,6 +3457,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: true, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3434,6 +3499,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -3479,6 +3545,7 @@ mod tests { fee_payer: 1, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3534,6 +3601,7 @@ mod tests { fee_payer: 1, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3575,6 +3643,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -3621,6 +3690,7 @@ mod tests { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3663,6 +3733,7 @@ mod tests { fee_payer: 1, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3709,6 +3780,7 @@ mod tests { fee_payer: 1, custodian: None, no_wait: false, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3759,6 +3831,7 @@ mod tests { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3799,6 +3872,7 @@ mod tests { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3838,6 +3912,7 @@ mod tests { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -3910,6 +3985,7 @@ mod tests { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }, signers: vec![ Presigner::new(&offline_pubkey, &offline_sig).into(), @@ -3943,6 +4019,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -3975,6 +4052,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4009,6 +4087,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4044,6 +4123,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4074,6 +4154,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4114,6 +4195,7 @@ mod tests { memo: None, fee_payer: 1, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4163,6 +4245,7 @@ mod tests { memo: None, fee_payer: 1, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4200,6 +4283,7 @@ mod tests { memo: None, fee_payer: 1, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4243,6 +4327,7 @@ mod tests { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: Some(redelegation_stake_account_pubkey), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4279,6 +4364,41 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, + }, + signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], + } + ); + + // Test WithdrawStake Subcommand w/ ComputeUnitPrice + let test_withdraw_stake = test_commands.clone().get_matches_from(vec![ + "test", + "withdraw-stake", + &stake_account_string, + &stake_account_string, + "42", + "--with-compute-unit-price", + "99", + ]); + + assert_eq!( + parse_command(&test_withdraw_stake, &default_signer, &mut None).unwrap(), + CliCommandInfo { + command: CliCommand::WithdrawStake { + stake_account_pubkey, + destination_account_pubkey: stake_account_pubkey, + amount: SpendAmount::Some(42_000_000_000), + withdraw_authority: 0, + custodian: None, + sign_only: false, + dump_transaction_message: false, + blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster), + nonce_account: None, + nonce_authority: 0, + memo: None, + seed: None, + fee_payer: 0, + compute_unit_price: Some(99), }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4312,6 +4432,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4350,6 +4471,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4399,6 +4521,7 @@ mod tests { memo: None, seed: None, fee_payer: 1, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&stake_authority_keypair_file) @@ -4430,6 +4553,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4457,6 +4581,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4485,6 +4610,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4523,6 +4649,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4551,6 +4678,7 @@ mod tests { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -4589,6 +4717,7 @@ mod tests { memo: None, seed: None, fee_payer: 1, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4636,6 +4765,7 @@ mod tests { memo: None, seed: None, fee_payer: 1, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4668,6 +4798,7 @@ mod tests { memo: None, seed: None, fee_payer: 1, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4707,6 +4838,7 @@ mod tests { seed: None, lamports: 50_000_000_000, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -4773,6 +4905,7 @@ mod tests { seed: None, lamports: 50_000_000_000, fee_payer: 1, + compute_unit_price: None, }, signers: vec![ Presigner::new(&stake_auth_pubkey, &stake_sig).into(), @@ -4810,6 +4943,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into(),], } diff --git a/cli/src/vote.rs b/cli/src/vote.rs index d5629fe686..59603cd3ee 100644 --- a/cli/src/vote.rs +++ b/cli/src/vote.rs @@ -5,6 +5,7 @@ use { log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult, }, + compute_unit_price::WithComputeUnitPrice, memo::WithMemo, nonce::check_nonce_account, spend_utils::{resolve_spend_tx_and_check_account_balances, SpendAmount}, @@ -12,6 +13,7 @@ use { }, clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}, solana_clap_utils::{ + compute_unit_price::{compute_unit_price_arg, COMPUTE_UNIT_PRICE_ARG}, fee_payer::{fee_payer_arg, FEE_PAYER_ARG}, input_parsers::*, input_validators::*, @@ -111,6 +113,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-authorize-voter") @@ -141,6 +144,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-authorize-withdrawer") @@ -171,6 +175,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-authorize-voter-checked") @@ -203,6 +208,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-authorize-withdrawer-checked") @@ -235,6 +241,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-update-validator") @@ -268,6 +275,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-update-commission") @@ -301,6 +309,7 @@ impl VoteSubCommands for App<'_, '_> { .nonce_args(false) .arg(fee_payer_arg()) .arg(memo_arg()) + .arg(compute_unit_price_arg()) ) .subcommand( SubCommand::with_name("vote-account") @@ -373,7 +382,8 @@ impl VoteSubCommands for App<'_, '_> { .offline_args() .nonce_args(false) .arg(fee_payer_arg()) - .arg(memo_arg() + .arg(memo_arg()) + .arg(compute_unit_price_arg() ) ) .subcommand( @@ -402,7 +412,8 @@ impl VoteSubCommands for App<'_, '_> { .help("Authorized withdrawer [default: cli config keypair]"), ) .arg(fee_payer_arg()) - .arg(memo_arg() + .arg(memo_arg()) + .arg(compute_unit_price_arg() ) ) } @@ -430,6 +441,7 @@ pub fn parse_create_vote_account( let (nonce_authority, nonce_authority_pubkey) = signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); if !allow_unsafe { if authorized_withdrawer == vote_account_pubkey.unwrap() { @@ -470,6 +482,7 @@ pub fn parse_create_vote_account( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -494,6 +507,7 @@ pub fn parse_vote_authorize( let (nonce_authority, nonce_authority_pubkey) = signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let mut bulk_signers = vec![fee_payer, authorized]; @@ -529,6 +543,7 @@ pub fn parse_vote_authorize( } else { None }, + compute_unit_price, }, signers: signer_info.signers, }) @@ -554,6 +569,7 @@ pub fn parse_vote_update_validator( let (nonce_authority, nonce_authority_pubkey) = signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let mut bulk_signers = vec![fee_payer, authorized_withdrawer, new_identity_account]; if nonce_account.is_some() { @@ -574,6 +590,7 @@ pub fn parse_vote_update_validator( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -598,6 +615,7 @@ pub fn parse_vote_update_commission( let (nonce_authority, nonce_authority_pubkey) = signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let mut bulk_signers = vec![fee_payer, authorized_withdrawer]; if nonce_account.is_some() { @@ -618,6 +636,7 @@ pub fn parse_vote_update_commission( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -673,6 +692,7 @@ pub fn parse_withdraw_from_vote_account( let (nonce_authority, nonce_authority_pubkey) = signer_of(matches, NONCE_AUTHORITY_ARG.name, wallet_manager)?; let (fee_payer, fee_payer_pubkey) = signer_of(matches, FEE_PAYER_ARG.name, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let mut bulk_signers = vec![fee_payer, withdraw_authority]; if nonce_account.is_some() { @@ -694,6 +714,7 @@ pub fn parse_withdraw_from_vote_account( nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -719,6 +740,7 @@ pub fn parse_close_vote_account( wallet_manager, )?; let memo = matches.value_of(MEMO_ARG.name).map(String::from); + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); Ok(CliCommandInfo { command: CliCommand::CloseVoteAccount { @@ -727,6 +749,7 @@ pub fn parse_close_vote_account( withdraw_authority: signer_info.index_of(withdraw_authority_pubkey).unwrap(), memo, fee_payer: signer_info.index_of(fee_payer_pubkey).unwrap(), + compute_unit_price, }, signers: signer_info.signers, }) @@ -749,6 +772,7 @@ pub fn process_create_vote_account( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let vote_account = config.signers[vote_account]; let vote_account_pubkey = vote_account.pubkey(); @@ -795,6 +819,7 @@ pub fn process_create_vote_account( lamports, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) } else { vote_instruction::create_account( &config.signers[0].pubkey(), @@ -803,6 +828,7 @@ pub fn process_create_vote_account( lamports, ) .with_memo(memo) + .with_compute_unit_price(compute_unit_price) }; if let Some(nonce_account) = &nonce_account { Message::new_with_nonce( @@ -889,6 +915,7 @@ pub fn process_vote_authorize( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let authorized = config.signers[authorized]; let new_authorized_signer = new_authorized.map(|index| config.signers[index]); @@ -950,7 +977,9 @@ pub fn process_vote_authorize( vote_authorize, // vote or withdraw ) }; - let ixs = vec![vote_ix].with_memo(memo); + let ixs = vec![vote_ix] + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; @@ -1013,6 +1042,7 @@ pub fn process_vote_update_validator( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let authorized_withdrawer = config.signers[withdraw_authority]; let new_identity_account = config.signers[new_identity_account]; @@ -1027,7 +1057,8 @@ pub fn process_vote_update_validator( &authorized_withdrawer.pubkey(), &new_identity_pubkey, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; let fee_payer = config.signers[fee_payer]; @@ -1087,6 +1118,7 @@ pub fn process_vote_update_commission( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let authorized_withdrawer = config.signers[withdraw_authority]; let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; @@ -1095,7 +1127,8 @@ pub fn process_vote_update_commission( &authorized_withdrawer.pubkey(), commission, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let nonce_authority = config.signers[nonce_authority]; let fee_payer = config.signers[fee_payer]; @@ -1243,6 +1276,7 @@ pub fn process_withdraw_from_vote_account( nonce_authority: SignerIndex, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let withdraw_authority = config.signers[withdraw_authority]; let recent_blockhash = blockhash_query.get_blockhash(rpc_client, config.commitment)?; @@ -1257,7 +1291,8 @@ pub fn process_withdraw_from_vote_account( lamports, destination_account_pubkey, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); if let Some(nonce_account) = &nonce_account { Message::new_with_nonce( @@ -1337,6 +1372,7 @@ pub fn process_close_vote_account( destination_account_pubkey: &Pubkey, memo: Option<&String>, fee_payer: SignerIndex, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let vote_account_status = rpc_client.get_vote_accounts_with_config(RpcGetVoteAccountsConfig { @@ -1371,7 +1407,8 @@ pub fn process_close_vote_account( current_balance, destination_account_pubkey, )] - .with_memo(memo); + .with_memo(memo) + .with_compute_unit_price(compute_unit_price); let message = Message::new(&ixs, Some(&fee_payer.pubkey())); let mut tx = Transaction::new_unsigned(message); @@ -1450,6 +1487,7 @@ mod tests { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -1482,6 +1520,7 @@ mod tests { fee_payer: 0, authorized: 1, new_authorized: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1516,6 +1555,7 @@ mod tests { fee_payer: 0, authorized: 1, new_authorized: None, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1564,6 +1604,7 @@ mod tests { fee_payer: 0, authorized: 1, new_authorized: None, + compute_unit_price: None, }, signers: vec![ Presigner::new(&pubkey2, &sig2).into(), @@ -1600,6 +1641,7 @@ mod tests { fee_payer: 0, authorized: 0, new_authorized: Some(1), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1631,6 +1673,7 @@ mod tests { fee_payer: 0, authorized: 1, new_authorized: Some(2), + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1684,6 +1727,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1717,6 +1761,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1757,6 +1802,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1809,6 +1855,7 @@ mod tests { nonce_authority: 3, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1851,6 +1898,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1889,6 +1937,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1919,6 +1968,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1949,6 +1999,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -1980,6 +2031,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2008,6 +2060,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2041,6 +2094,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), @@ -2079,6 +2133,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&withdraw_authority_file).unwrap().into()], } @@ -2119,6 +2174,7 @@ mod tests { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![Presigner::new(&withdraw_authority.pubkey(), &authorized_sig).into(),], } @@ -2140,6 +2196,7 @@ mod tests { withdraw_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }, signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()], } @@ -2166,6 +2223,39 @@ mod tests { withdraw_authority: 1, memo: None, fee_payer: 0, + compute_unit_price: None, + }, + signers: vec![ + read_keypair_file(&default_keypair_file).unwrap().into(), + read_keypair_file(&withdraw_authority_file).unwrap().into() + ], + } + ); + + // Test CloseVoteAccount subcommand with authority w/ ComputeUnitPrice + let withdraw_authority = Keypair::new(); + let (withdraw_authority_file, mut tmp_file) = make_tmp_file(); + write_keypair(&withdraw_authority, tmp_file.as_file_mut()).unwrap(); + let test_close_vote_account = test_commands.clone().get_matches_from(vec![ + "test", + "close-vote-account", + &keypair_file, + &pubkey_string, + "--authorized-withdrawer", + &withdraw_authority_file, + "--with-compute-unit-price", + "99", + ]); + assert_eq!( + parse_command(&test_close_vote_account, &default_signer, &mut None).unwrap(), + CliCommandInfo { + command: CliCommand::CloseVoteAccount { + vote_account_pubkey: read_keypair_file(&keypair_file).unwrap().pubkey(), + destination_account_pubkey: pubkey, + withdraw_authority: 1, + memo: None, + fee_payer: 0, + compute_unit_price: Some(99), }, signers: vec![ read_keypair_file(&default_keypair_file).unwrap().into(), diff --git a/cli/src/wallet.rs b/cli/src/wallet.rs index f83c07563c..b7c0e17dc7 100644 --- a/cli/src/wallet.rs +++ b/cli/src/wallet.rs @@ -4,6 +4,7 @@ use { log_instruction_custom_error, request_and_confirm_airdrop, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult, }, + compute_unit_price::WithComputeUnitPrice, memo::WithMemo, nonce::check_nonce_account, spend_utils::{resolve_spend_tx_and_check_account_balances, SpendAmount}, @@ -11,6 +12,7 @@ use { clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}, solana_account_decoder::{UiAccount, UiAccountEncoding}, solana_clap_utils::{ + compute_unit_price::{compute_unit_price_arg, COMPUTE_UNIT_PRICE_ARG}, fee_payer::*, input_parsers::*, input_validators::*, @@ -270,7 +272,8 @@ impl WalletSubCommands for App<'_, '_> { .offline_args() .nonce_args(false) .arg(memo_arg()) - .arg(fee_payer_arg()), + .arg(fee_payer_arg()) + .arg(compute_unit_price_arg()), ) } } @@ -415,6 +418,7 @@ pub fn parse_transfer( let signer_info = default_signer.generate_unique_signers(bulk_signers, matches, wallet_manager)?; + let compute_unit_price = value_of(matches, COMPUTE_UNIT_PRICE_ARG.name); let derived_address_seed = matches .value_of("derived_address_seed") @@ -438,6 +442,7 @@ pub fn parse_transfer( from: signer_info.index_of(from_pubkey).unwrap(), derived_address_seed, derived_address_program_id, + compute_unit_price, }, signers: signer_info.signers, }) @@ -671,6 +676,7 @@ pub fn process_transfer( fee_payer: SignerIndex, derived_address_seed: Option, derived_address_program_id: Option<&Pubkey>, + compute_unit_price: Option<&u64>, ) -> ProcessResult { let from = config.signers[from]; let mut from_pubkey = from.pubkey(); @@ -715,8 +721,11 @@ pub fn process_transfer( lamports, )] .with_memo(memo) + .with_compute_unit_price(compute_unit_price) } else { - vec![system_instruction::transfer(&from_pubkey, to, lamports)].with_memo(memo) + vec![system_instruction::transfer(&from_pubkey, to, lamports)] + .with_memo(memo) + .with_compute_unit_price(compute_unit_price) }; if let Some(nonce_account) = &nonce_account { diff --git a/cli/tests/nonce.rs b/cli/tests/nonce.rs index 8db3610a51..a5c36197fa 100644 --- a/cli/tests/nonce.rs +++ b/cli/tests/nonce.rs @@ -116,6 +116,7 @@ fn full_battery_tests( nonce_authority: optional_authority, memo: None, amount: SpendAmount::Some(sol_to_lamports(1000.0)), + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -153,6 +154,7 @@ fn full_battery_tests( nonce_account, nonce_authority: index, memo: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -173,6 +175,7 @@ fn full_battery_tests( memo: None, destination_account_pubkey: payee_pubkey, lamports: sol_to_lamports(100.0), + compute_unit_price: None, }; process_command(&config_payer).unwrap(); check_balance!( @@ -197,6 +200,7 @@ fn full_battery_tests( nonce_authority: index, memo: None, new_authority: new_authority.pubkey(), + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -205,6 +209,7 @@ fn full_battery_tests( nonce_account, nonce_authority: index, memo: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap_err(); @@ -214,6 +219,7 @@ fn full_battery_tests( nonce_account, nonce_authority: 1, memo: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -224,6 +230,7 @@ fn full_battery_tests( memo: None, destination_account_pubkey: payee_pubkey, lamports: sol_to_lamports(100.0), + compute_unit_price: None, }; process_command(&config_payer).unwrap(); check_balance!( @@ -302,6 +309,7 @@ fn test_create_account_with_seed() { nonce_authority: Some(authority_pubkey), memo: None, amount: SpendAmount::Some(sol_to_lamports(241.0)), + compute_unit_price: None, }; process_command(&creator_config).unwrap(); check_balance!(sol_to_lamports(241.0), &rpc_client, &nonce_address); @@ -349,6 +357,7 @@ fn test_create_account_with_seed() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; authority_config.output_format = OutputFormat::JsonCompact; let sign_only_reply = process_command(&authority_config).unwrap(); @@ -378,6 +387,7 @@ fn test_create_account_with_seed() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&submit_config).unwrap(); check_balance!(sol_to_lamports(241.0), &rpc_client, &nonce_address); diff --git a/cli/tests/stake.rs b/cli/tests/stake.rs index e3e6bde9cc..cb7db3666f 100644 --- a/cli/tests/stake.rs +++ b/cli/tests/stake.rs @@ -93,6 +93,7 @@ fn test_stake_redelegation() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -113,6 +114,7 @@ fn test_stake_redelegation() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -135,6 +137,7 @@ fn test_stake_redelegation() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -153,6 +156,7 @@ fn test_stake_redelegation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -216,6 +220,7 @@ fn test_stake_redelegation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: Some(stake2_keypair.pubkey()), + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -328,6 +333,7 @@ fn test_stake_delegation_force() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -350,6 +356,7 @@ fn test_stake_delegation_force() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -368,6 +375,7 @@ fn test_stake_delegation_force() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config).unwrap_err(); @@ -385,6 +393,7 @@ fn test_stake_delegation_force() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config).unwrap(); } @@ -445,6 +454,7 @@ fn test_seed_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); @@ -462,6 +472,7 @@ fn test_seed_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); @@ -478,6 +489,7 @@ fn test_seed_stake_delegation_and_deactivation() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); } @@ -533,6 +545,7 @@ fn test_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); @@ -551,6 +564,7 @@ fn test_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); @@ -567,6 +581,7 @@ fn test_stake_delegation_and_deactivation() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); } @@ -646,6 +661,7 @@ fn test_offline_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config_validator).unwrap(); @@ -664,6 +680,7 @@ fn test_offline_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -686,6 +703,7 @@ fn test_offline_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -703,6 +721,7 @@ fn test_offline_stake_delegation_and_deactivation() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; let sig_response = process_command(&config_offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sig_response); @@ -723,6 +742,7 @@ fn test_offline_stake_delegation_and_deactivation() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); } @@ -776,6 +796,7 @@ fn test_nonced_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -788,6 +809,7 @@ fn test_nonced_stake_delegation_and_deactivation() { nonce_authority: Some(config.signers[0].pubkey()), memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -819,6 +841,7 @@ fn test_nonced_stake_delegation_and_deactivation() { memo: None, fee_payer: 0, redelegation_stake_account_pubkey: None, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -848,6 +871,7 @@ fn test_nonced_stake_delegation_and_deactivation() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); } @@ -915,6 +939,7 @@ fn test_stake_authorize() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -939,6 +964,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -980,6 +1006,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1011,6 +1038,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1042,6 +1070,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sign_reply = process_command(&config_offline).unwrap(); @@ -1066,6 +1095,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1088,6 +1118,7 @@ fn test_stake_authorize() { nonce_authority: Some(offline_authority_pubkey), memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -1122,6 +1153,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; let sign_reply = process_command(&config_offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sign_reply); @@ -1150,6 +1182,7 @@ fn test_stake_authorize() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1249,6 +1282,7 @@ fn test_stake_authorize_with_fee_payer() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -1276,6 +1310,7 @@ fn test_stake_authorize_with_fee_payer() { fee_payer: 1, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); // `config` balance has not changed, despite submitting the TX @@ -1307,6 +1342,7 @@ fn test_stake_authorize_with_fee_payer() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sign_reply = process_command(&config_offline).unwrap(); @@ -1331,6 +1367,7 @@ fn test_stake_authorize_with_fee_payer() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); // `config`'s balance again has not changed @@ -1421,6 +1458,7 @@ fn test_stake_split() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(10 * stake_balance, &rpc_client, &stake_account_pubkey,); @@ -1437,6 +1475,7 @@ fn test_stake_split() { nonce_authority: Some(offline_pubkey), memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(minimum_nonce_balance, &rpc_client, &nonce_account.pubkey()); @@ -1468,6 +1507,7 @@ fn test_stake_split() { seed: None, lamports: 2 * stake_balance, fee_payer: 0, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -1491,6 +1531,7 @@ fn test_stake_split() { seed: None, lamports: 2 * stake_balance, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(8 * stake_balance, &rpc_client, &stake_account_pubkey,); @@ -1577,6 +1618,7 @@ fn test_stake_set_lockup() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(10 * stake_balance, &rpc_client, &stake_account_pubkey,); @@ -1601,6 +1643,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1637,6 +1680,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -1658,6 +1702,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1691,6 +1736,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -1707,6 +1753,7 @@ fn test_stake_set_lockup() { nonce_authority: Some(offline_pubkey), memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(minimum_nonce_balance, &rpc_client, &nonce_account_pubkey); @@ -1739,6 +1786,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -1761,6 +1809,7 @@ fn test_stake_set_lockup() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -1834,6 +1883,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { nonce_authority: Some(offline_pubkey), memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -1867,6 +1917,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -1894,6 +1945,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(50_000_000_000, &rpc_client, &stake_pubkey); @@ -1926,6 +1978,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; let sig_response = process_command(&config_offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sig_response); @@ -1948,6 +2001,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, seed: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(50_000_000_000, &rpc_client, &recipient_pubkey); @@ -1981,6 +2035,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; let sig_response = process_command(&config_offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sig_response); @@ -2006,6 +2061,7 @@ fn test_offline_nonced_create_stake_account_and_withdraw() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let seed_address = @@ -2061,6 +2117,7 @@ fn test_stake_checked_instructions() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap_err(); // unsigned authority should fail @@ -2081,6 +2138,7 @@ fn test_stake_checked_instructions() { memo: None, fee_payer: 0, from: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -2105,6 +2163,7 @@ fn test_stake_checked_instructions() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap_err(); // unsigned authority should fail @@ -2126,6 +2185,7 @@ fn test_stake_checked_instructions() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -2156,6 +2216,7 @@ fn test_stake_checked_instructions() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap_err(); // unsigned authority should fail @@ -2181,6 +2242,7 @@ fn test_stake_checked_instructions() { fee_payer: 0, custodian: None, no_wait: false, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); @@ -2212,6 +2274,7 @@ fn test_stake_checked_instructions() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap_err(); // unsigned new custodian should fail @@ -2228,6 +2291,7 @@ fn test_stake_checked_instructions() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let stake_account = rpc_client.get_account(&stake_account_pubkey).unwrap(); diff --git a/cli/tests/transfer.rs b/cli/tests/transfer.rs index 5abc886cc6..33abc5d4e3 100644 --- a/cli/tests/transfer.rs +++ b/cli/tests/transfer.rs @@ -78,6 +78,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -103,6 +104,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; assert!(process_command(&config).is_err()); check_balance!( @@ -141,6 +143,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; offline.output_format = OutputFormat::JsonCompact; let sign_only_reply = process_command(&offline).unwrap(); @@ -163,6 +166,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -184,6 +188,7 @@ fn test_transfer() { nonce_authority: None, memo: None, amount: SpendAmount::Some(minimum_nonce_balance), + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -222,6 +227,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -247,6 +253,7 @@ fn test_transfer() { nonce_authority: 0, memo: None, new_authority: offline_pubkey, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -282,6 +289,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; let sign_only_reply = process_command(&offline).unwrap(); let sign_only = parse_sign_only_reply_string(&sign_only_reply); @@ -306,6 +314,7 @@ fn test_transfer() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!( @@ -390,6 +399,7 @@ fn test_transfer_multisession_signing() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; fee_payer_config.output_format = OutputFormat::JsonCompact; let sign_only_reply = process_command(&fee_payer_config).unwrap(); @@ -421,6 +431,7 @@ fn test_transfer_multisession_signing() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; from_config.output_format = OutputFormat::JsonCompact; let sign_only_reply = process_command(&from_config).unwrap(); @@ -449,6 +460,7 @@ fn test_transfer_multisession_signing() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -513,6 +525,7 @@ fn test_transfer_all() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(0, &rpc_client, &sender_pubkey); @@ -566,6 +579,7 @@ fn test_transfer_unfunded_recipient() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; // Expect failure due to unfunded recipient and the lack of the `allow_unfunded_recipient` flag @@ -632,6 +646,7 @@ fn test_transfer_with_seed() { fee_payer: 0, derived_address_seed: Some(derived_address_seed), derived_address_program_id: Some(derived_address_program_id), + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(sol_to_lamports(1.0) - fee, &rpc_client, &sender_pubkey); diff --git a/cli/tests/vote.rs b/cli/tests/vote.rs index 41dc52b761..1ec3d99fa4 100644 --- a/cli/tests/vote.rs +++ b/cli/tests/vote.rs @@ -58,6 +58,7 @@ fn test_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let vote_account = rpc_client @@ -89,6 +90,7 @@ fn test_vote_authorize_and_withdraw() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config).unwrap(); let expected_balance = expected_balance + 10_000; @@ -110,6 +112,7 @@ fn test_vote_authorize_and_withdraw() { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }; process_command(&config).unwrap(); let vote_account = rpc_client @@ -135,6 +138,7 @@ fn test_vote_authorize_and_withdraw() { fee_payer: 0, authorized: 1, new_authorized: Some(1), + compute_unit_price: None, }; process_command(&config).unwrap_err(); // unsigned by new authority should fail config.signers = vec![ @@ -155,6 +159,7 @@ fn test_vote_authorize_and_withdraw() { fee_payer: 0, authorized: 1, new_authorized: Some(2), + compute_unit_price: None, }; process_command(&config).unwrap(); let vote_account = rpc_client @@ -179,6 +184,7 @@ fn test_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); let expected_balance = expected_balance - 1_000; @@ -199,6 +205,7 @@ fn test_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); @@ -211,6 +218,7 @@ fn test_vote_authorize_and_withdraw() { destination_account_pubkey: destination_account, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config).unwrap(); check_balance!(0, &rpc_client, &vote_account_pubkey); @@ -277,6 +285,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); let vote_account = rpc_client @@ -308,6 +317,7 @@ fn test_offline_vote_authorize_and_withdraw() { fee_payer: 0, derived_address_seed: None, derived_address_program_id: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); let expected_balance = expected_balance + 10_000; @@ -329,6 +339,7 @@ fn test_offline_vote_authorize_and_withdraw() { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -351,6 +362,7 @@ fn test_offline_vote_authorize_and_withdraw() { fee_payer: 0, authorized: 0, new_authorized: None, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); let vote_account = rpc_client @@ -377,6 +389,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; config_offline.output_format = OutputFormat::JsonCompact; let sig_response = process_command(&config_offline).unwrap(); @@ -397,6 +410,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); let expected_balance = expected_balance - 1_000; @@ -423,6 +437,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_offline).unwrap(); config_offline.output_format = OutputFormat::JsonCompact; @@ -443,6 +458,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); @@ -462,6 +478,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_offline).unwrap(); config_offline.output_format = OutputFormat::JsonCompact; @@ -483,6 +500,7 @@ fn test_offline_vote_authorize_and_withdraw() { nonce_authority: 0, memo: None, fee_payer: 0, + compute_unit_price: None, }; process_command(&config_payer).unwrap(); check_balance!(0, &rpc_client, &vote_account_pubkey);