Skip to content

Commit eef4552

Browse files
Merge pull request #168 from cavemanloverboy/main
add optional fee payer to all commands
2 parents bb8b0d0 + 69a696a commit eef4552

10 files changed

+154
-90
lines changed

cli/src/command/config_transaction_create.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ pub struct ConfigTransactionCreate {
4141
#[arg(long)]
4242
keypair: String,
4343

44+
/// Path to the Fee Payer Keypair
45+
#[arg(long)]
46+
fee_payer_keypair: Option<String>,
47+
4448
/// The multisig where the transaction has been proposed
4549
#[arg(long)]
4650
multisig_pubkey: String,
@@ -63,6 +67,7 @@ impl ConfigTransactionCreate {
6367
rpc_url,
6468
program_id,
6569
keypair,
70+
fee_payer_keypair,
6671
multisig_pubkey,
6772
action,
6873
memo,
@@ -75,8 +80,9 @@ impl ConfigTransactionCreate {
7580
let program_id = Pubkey::from_str(&program_id).expect("Invalid program ID");
7681

7782
let transaction_creator_keypair = create_signer_from_path(keypair).unwrap();
78-
7983
let transaction_creator = transaction_creator_keypair.pubkey();
84+
let fee_payer_keypair = fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap());
85+
let fee_payer = fee_payer_keypair.as_ref().map(|kp| kp.pubkey());
8086

8187
let rpc_url = rpc_url.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".to_string());
8288
let rpc_url_clone = rpc_url.clone();
@@ -128,8 +134,9 @@ impl ConfigTransactionCreate {
128134
.await
129135
.expect("Failed to get blockhash");
130136

137+
let payer = fee_payer.unwrap_or(transaction_creator);
131138
let message = Message::try_compile(
132-
&transaction_creator,
139+
&payer,
133140
&[
134141
ComputeBudgetInstruction::set_compute_unit_price(
135142
priority_fee_lamports.unwrap_or(5000),
@@ -138,7 +145,7 @@ impl ConfigTransactionCreate {
138145
accounts: ConfigTransactionCreateAccounts {
139146
creator: transaction_creator,
140147
multisig,
141-
rent_payer: transaction_creator,
148+
rent_payer: fee_payer.unwrap_or(transaction_creator),
142149
transaction: transaction_pda.0,
143150
system_program: solana_sdk::system_program::id(),
144151
}
@@ -156,7 +163,7 @@ impl ConfigTransactionCreate {
156163
accounts: ProposalCreateAccounts {
157164
creator: transaction_creator,
158165
multisig,
159-
rent_payer: transaction_creator,
166+
rent_payer: fee_payer.unwrap_or(transaction_creator),
160167
proposal: proposal_pda.0,
161168
system_program: solana_sdk::system_program::id(),
162169
}
@@ -176,11 +183,13 @@ impl ConfigTransactionCreate {
176183
)
177184
.unwrap();
178185

179-
let transaction = VersionedTransaction::try_new(
180-
VersionedMessage::V0(message),
181-
&[&*transaction_creator_keypair],
182-
)
183-
.expect("Failed to create transaction");
186+
let mut signers = vec![&*transaction_creator_keypair];
187+
if let Some(ref fee_payer_kp) = fee_payer_keypair {
188+
signers.push(&**fee_payer_kp);
189+
}
190+
191+
let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers)
192+
.expect("Failed to create transaction");
184193

185194
let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?;
186195

cli/src/command/config_transaction_execute.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ pub struct ConfigTransactionExecute {
3434
#[arg(long)]
3535
keypair: String,
3636

37+
/// Path to the Fee Payer Keypair
38+
#[arg(long)]
39+
fee_payer_keypair: Option<String>,
40+
3741
/// The multisig where the transaction has been proposed
3842
#[arg(long)]
3943
multisig_pubkey: String,
@@ -52,6 +56,7 @@ impl ConfigTransactionExecute {
5256
rpc_url,
5357
program_id,
5458
keypair,
59+
fee_payer_keypair,
5560
multisig_pubkey,
5661
transaction_index,
5762
priority_fee_lamports,
@@ -63,8 +68,9 @@ impl ConfigTransactionExecute {
6368
let program_id = Pubkey::from_str(&program_id).expect("Invalid program ID");
6469

6570
let transaction_creator_keypair = create_signer_from_path(keypair).unwrap();
66-
6771
let transaction_creator = transaction_creator_keypair.pubkey();
72+
let fee_payer_keypair = fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap());
73+
let fee_payer = fee_payer_keypair.as_ref().map(|kp| kp.pubkey());
6874

6975
let rpc_url = rpc_url.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".to_string());
7076
let rpc_url_clone = rpc_url.clone();
@@ -109,8 +115,9 @@ impl ConfigTransactionExecute {
109115
.await
110116
.expect("Failed to get blockhash");
111117

118+
let payer = fee_payer.unwrap_or(transaction_creator);
112119
let message = Message::try_compile(
113-
&transaction_creator,
120+
&payer,
114121
&[
115122
ComputeBudgetInstruction::set_compute_unit_price(
116123
priority_fee_lamports.unwrap_or(5000),
@@ -119,7 +126,7 @@ impl ConfigTransactionExecute {
119126
accounts: ConfigTransactionExecuteAccounts {
120127
member: transaction_creator,
121128
transaction: transaction_pda.0,
122-
rent_payer: Some(transaction_creator),
129+
rent_payer: Some(fee_payer.unwrap_or(transaction_creator)),
123130
multisig,
124131
proposal: proposal_pda.0,
125132
system_program: Some(solana_sdk::system_program::id()),
@@ -134,11 +141,13 @@ impl ConfigTransactionExecute {
134141
)
135142
.unwrap();
136143

137-
let transaction = VersionedTransaction::try_new(
138-
VersionedMessage::V0(message),
139-
&[&*transaction_creator_keypair],
140-
)
141-
.expect("Failed to create transaction");
144+
let mut signers = vec![&*transaction_creator_keypair];
145+
if let Some(ref fee_payer_kp) = fee_payer_keypair {
146+
signers.push(&**fee_payer_kp);
147+
}
148+
149+
let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers)
150+
.expect("Failed to create transaction");
142151

143152
let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?;
144153

cli/src/command/initiate_program_upgrade.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ pub struct InitiateProgramUpgrade {
4545
#[arg(long)]
4646
keypair: String,
4747

48+
/// Path to the Fee Payer Keypair
49+
#[arg(long)]
50+
fee_payer_keypair: Option<String>,
51+
4852
/// The multisig where the transaction has been proposed
4953
#[arg(long)]
5054
multisig_pubkey: String,
@@ -74,6 +78,7 @@ impl InitiateProgramUpgrade {
7478
rpc_url,
7579
squads_program_id,
7680
keypair,
81+
fee_payer_keypair,
7782
multisig_pubkey,
7883
memo,
7984
vault_index,
@@ -89,8 +94,9 @@ impl InitiateProgramUpgrade {
8994
let program_id = Pubkey::from_str(&program_id).expect("Invalid program ID");
9095

9196
let transaction_creator_keypair = create_signer_from_path(keypair).unwrap();
92-
9397
let transaction_creator = transaction_creator_keypair.pubkey();
98+
let fee_payer_keypair = fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap());
99+
let fee_payer = fee_payer_keypair.as_ref().map(|kp| kp.pubkey());
94100

95101
let program_to_upgrade =
96102
Pubkey::from_str(&program_to_upgrade_id).expect("Invalid to upgrade program ID");
@@ -158,16 +164,17 @@ impl InitiateProgramUpgrade {
158164
let upgrade_program_message =
159165
Message::try_compile(&vault_pda.0, &[instruction], &[], blockhash).unwrap();
160166

167+
let payer = fee_payer.unwrap_or(transaction_creator);
161168
let message = Message::try_compile(
162-
&transaction_creator,
169+
&payer,
163170
&[
164171
ComputeBudgetInstruction::set_compute_unit_price(
165172
priority_fee_lamports.unwrap_or(200_000),
166173
),
167174
Instruction {
168175
accounts: VaultTransactionCreateAccounts {
169176
creator: transaction_creator,
170-
rent_payer: transaction_creator,
177+
rent_payer: fee_payer.unwrap_or(transaction_creator),
171178
transaction: transaction_pda.0,
172179
multisig,
173180
system_program: solana_sdk::system_program::id(),
@@ -187,7 +194,7 @@ impl InitiateProgramUpgrade {
187194
Instruction {
188195
accounts: ProposalCreateAccounts {
189196
creator: transaction_creator,
190-
rent_payer: transaction_creator,
197+
rent_payer: fee_payer.unwrap_or(transaction_creator),
191198
proposal: proposal_pda.0,
192199
multisig,
193200
system_program: solana_sdk::system_program::id(),
@@ -208,11 +215,13 @@ impl InitiateProgramUpgrade {
208215
)
209216
.unwrap();
210217

211-
let transaction = VersionedTransaction::try_new(
212-
VersionedMessage::V0(message),
213-
&[&*transaction_creator_keypair],
214-
)
215-
.expect("Failed to create transaction");
218+
let mut signers = vec![&*transaction_creator_keypair];
219+
if let Some(ref fee_payer_kp) = fee_payer_keypair {
220+
signers.push(&**fee_payer_kp);
221+
}
222+
223+
let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers)
224+
.expect("Failed to create transaction");
216225

217226
let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?;
218227

cli/src/command/initiate_transfer.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ pub struct InitiateTransfer {
5959
#[arg(long)]
6060
keypair: String,
6161

62+
/// Path to the Fee Payer Keypair
63+
#[arg(long)]
64+
fee_payer_keypair: Option<String>,
65+
6266
/// The multisig where the transaction has been proposed
6367
#[arg(long)]
6468
multisig_pubkey: String,
@@ -81,6 +85,7 @@ impl InitiateTransfer {
8185
program_id,
8286
token_program_id,
8387
keypair,
88+
fee_payer_keypair,
8489
multisig_pubkey,
8590
memo,
8691
vault_index,
@@ -100,8 +105,9 @@ impl InitiateTransfer {
100105
let token_program_id = Pubkey::from_str(&token_program_id).expect("Invalid program ID");
101106

102107
let transaction_creator_keypair = create_signer_from_path(keypair).unwrap();
103-
104108
let transaction_creator = transaction_creator_keypair.pubkey();
109+
let fee_payer_keypair = fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap());
110+
let fee_payer = fee_payer_keypair.as_ref().map(|kp| kp.pubkey());
105111

106112
let rpc_url = rpc_url.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".to_string());
107113
let rpc_url_clone = rpc_url.clone();
@@ -182,16 +188,17 @@ impl InitiateTransfer {
182188
)
183189
.unwrap();
184190

191+
let payer = fee_payer.unwrap_or(transaction_creator);
185192
let message = Message::try_compile(
186-
&transaction_creator,
193+
&payer,
187194
&[
188195
ComputeBudgetInstruction::set_compute_unit_price(
189196
priority_fee_lamports.unwrap_or(200_000),
190197
),
191198
Instruction {
192199
accounts: VaultTransactionCreateAccounts {
193200
creator: transaction_creator,
194-
rent_payer: transaction_creator,
201+
rent_payer: fee_payer.unwrap_or(transaction_creator),
195202
transaction: transaction_pda.0,
196203
multisig,
197204
system_program: solana_sdk::system_program::id(),
@@ -211,7 +218,7 @@ impl InitiateTransfer {
211218
Instruction {
212219
accounts: ProposalCreateAccounts {
213220
creator: transaction_creator,
214-
rent_payer: transaction_creator,
221+
rent_payer: fee_payer.unwrap_or(transaction_creator),
215222
proposal: proposal_pda.0,
216223
multisig,
217224
system_program: solana_sdk::system_program::id(),
@@ -232,11 +239,13 @@ impl InitiateTransfer {
232239
)
233240
.unwrap();
234241

235-
let transaction = VersionedTransaction::try_new(
236-
VersionedMessage::V0(message),
237-
&[&*transaction_creator_keypair],
238-
)
239-
.expect("Failed to create transaction");
242+
let mut signers = vec![&*transaction_creator_keypair];
243+
if let Some(ref fee_payer_kp) = fee_payer_keypair {
244+
signers.push(&**fee_payer_kp);
245+
}
246+
247+
let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers)
248+
.expect("Failed to create transaction");
240249

241250
let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?;
242251

cli/src/command/multisig_create.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ pub struct MultisigCreate {
4040
#[arg(long)]
4141
keypair: String,
4242

43+
/// Path to the Fee Payer Keypair
44+
#[arg(long)]
45+
fee_payer_keypair: Option<String>,
46+
4347
/// Address of the Program Config Authority that will be set to control the Program Config
4448
#[arg(long)]
4549
config_authority: Option<String>,
@@ -67,6 +71,7 @@ impl MultisigCreate {
6771
rpc_url,
6872
program_id,
6973
keypair,
74+
fee_payer_keypair,
7075
config_authority,
7176
members,
7277
threshold,
@@ -81,8 +86,9 @@ impl MultisigCreate {
8186
let program_id = Pubkey::from_str(&program_id).expect("Invalid program ID");
8287

8388
let transaction_creator_keypair = create_signer_from_path(keypair).unwrap();
84-
8589
let transaction_creator = transaction_creator_keypair.pubkey();
90+
let fee_payer_keypair = fee_payer_keypair.map(|path| create_signer_from_path(path).unwrap());
91+
let fee_payer = fee_payer_keypair.as_ref().map(|kp| kp.pubkey());
8692

8793
let rpc_url = rpc_url.unwrap_or_else(|| "https://api.mainnet-beta.solana.com".to_string());
8894

@@ -160,8 +166,9 @@ impl MultisigCreate {
160166
.unwrap()
161167
.treasury;
162168

169+
let payer = fee_payer.unwrap_or(transaction_creator);
163170
let message = Message::try_compile(
164-
&transaction_creator,
171+
&payer,
165172
&[
166173
ComputeBudgetInstruction::set_compute_unit_price(
167174
priority_fee_lamports.unwrap_or(5000),
@@ -195,14 +202,16 @@ impl MultisigCreate {
195202
)
196203
.unwrap();
197204

198-
let transaction = VersionedTransaction::try_new(
199-
VersionedMessage::V0(message),
200-
&[
201-
&*transaction_creator_keypair,
202-
&seed_keypair as &dyn Signer,
203-
],
204-
)
205-
.expect("Failed to create transaction");
205+
let mut signers: Vec<&dyn Signer> = vec![
206+
&*transaction_creator_keypair,
207+
&seed_keypair as &dyn Signer,
208+
];
209+
if let Some(ref fee_payer_kp) = fee_payer_keypair {
210+
signers.push(&**fee_payer_kp);
211+
}
212+
213+
let transaction = VersionedTransaction::try_new(VersionedMessage::V0(message), &signers)
214+
.expect("Failed to create transaction");
206215

207216
let signature = send_and_confirm_transaction(&transaction, &rpc_client).await?;
208217

0 commit comments

Comments
 (0)