diff --git a/cli/Cargo.lock b/cli/Cargo.lock index 893d6e2e..0a606bb9 100644 --- a/cli/Cargo.lock +++ b/cli/Cargo.lock @@ -4470,7 +4470,7 @@ dependencies = [ [[package]] name = "squads-multisig-cli" -version = "0.1.4" +version = "0.1.6" dependencies = [ "clap 3.2.25", "clap 4.4.13", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a10f99af..5f6ca53b 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "squads-multisig-cli" -version = "0.1.4" +version = "0.1.6" edition = "2021" authors = ["Valentin Madrid", "Vova Guguiev"] license = "MIT OR Apache-2.0" diff --git a/cli/src/command/proposal_vote.rs b/cli/src/command/proposal_vote.rs index 6960551c..be8d0b11 100644 --- a/cli/src/command/proposal_vote.rs +++ b/cli/src/command/proposal_vote.rs @@ -56,6 +56,9 @@ pub struct ProposalVote { #[arg(long)] priority_fee_lamports: Option, + + #[arg(long)] + fee_payer_keypair: Option, } impl ProposalVote { @@ -69,6 +72,7 @@ impl ProposalVote { action, memo, priority_fee_lamports, + fee_payer_keypair, } = self; let program_id = @@ -86,6 +90,9 @@ impl ProposalVote { let rpc_url = rpc_url.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".to_string()); + let transaction_fee_payer_keypair = + fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap()); + println!(); println!( "{}", @@ -141,8 +148,13 @@ impl ProposalVote { } }; + let fee_payer = transaction_fee_payer_keypair + .as_ref() + .map(|kp| kp.pubkey()) + .unwrap_or(transaction_creator); + let message = Message::try_compile( - &transaction_creator, + &fee_payer, &[ ComputeBudgetInstruction::set_compute_unit_price( priority_fee_lamports.unwrap_or(5000), @@ -163,11 +175,15 @@ impl ProposalVote { ) .unwrap(); - let transaction = VersionedTransaction::try_new( - VersionedMessage::V0(message), - &[&*transaction_creator_keypair], - ) - .expect("Failed to create transaction"); + let mut signers = vec![&*transaction_creator_keypair]; + if let Some(ref fee_payer_kp) = transaction_fee_payer_keypair { + if fee_payer_kp.pubkey() != transaction_creator { + signers.push(&**fee_payer_kp); + } + } + + let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers) + .expect("Failed to create transaction"); let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?; diff --git a/cli/src/command/vault_transaction_execute.rs b/cli/src/command/vault_transaction_execute.rs index 705675a7..c710b471 100644 --- a/cli/src/command/vault_transaction_execute.rs +++ b/cli/src/command/vault_transaction_execute.rs @@ -55,6 +55,9 @@ pub struct VaultTransactionExecute { #[arg(long)] extra_keypair: Option, + + #[arg(long)] + fee_payer_keypair: Option, } impl VaultTransactionExecute { @@ -68,6 +71,7 @@ impl VaultTransactionExecute { priority_fee_lamports, compute_unit_limit, extra_keypair, + fee_payer_keypair, } = self; let program_id = @@ -90,6 +94,9 @@ impl VaultTransactionExecute { let transaction_extra_signer_keypair = extra_keypair.map(|path| create_signer_from_path(path).unwrap()); + let transaction_fee_payer_keypair = + fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap()); + println!(); println!( "{}", @@ -161,8 +168,13 @@ impl VaultTransactionExecute { .await .expect("Failed to get blockhash"); + let fee_payer = transaction_fee_payer_keypair + .as_ref() + .map(|kp| kp.pubkey()) + .unwrap_or(transaction_creator); + let message = Message::try_compile( - &transaction_creator, + &fee_payer, &[ ComputeBudgetInstruction::set_compute_unit_limit( compute_unit_limit.unwrap_or(200_000), @@ -182,6 +194,11 @@ impl VaultTransactionExecute { .unwrap(); let mut signers = vec![&*transaction_creator_keypair]; + if let Some(ref fee_payer_kp) = transaction_fee_payer_keypair { + if fee_payer_kp.pubkey() != transaction_creator { + signers.push(&**fee_payer_kp); + } + } if let Some(ref extra_signer) = transaction_extra_signer_keypair { signers.push(&**extra_signer); }