Skip to content

Commit 9c4fa2a

Browse files
authored
Relax double signer constraints on set admin, add to CLI (#158)
1 parent fde8b70 commit 9c4fa2a

File tree

11 files changed

+116
-8
lines changed

11 files changed

+116
-8
lines changed

cli/src/restaking.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use clap::{command, Subcommand};
2+
use solana_program::pubkey::Pubkey;
23

34
/// The CLI handler for the restaking program
45
#[derive(Subcommand)]
@@ -25,6 +26,11 @@ pub enum ConfigActions {
2526
Initialize,
2627
/// Get the config
2728
Get,
29+
/// Set the config admin
30+
SetAdmin {
31+
/// The new admin's pubkey
32+
new_admin: Pubkey,
33+
},
2834
}
2935

3036
#[derive(Subcommand)]

cli/src/restaking_handler.rs

+39-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::str::FromStr;
33
use anyhow::{anyhow, Result};
44
use jito_bytemuck::{AccountDeserialize, Discriminator};
55
use jito_restaking_client::instructions::{
6-
InitializeConfigBuilder, InitializeNcnBuilder, InitializeOperatorBuilder,
6+
InitializeConfigBuilder, InitializeNcnBuilder, InitializeOperatorBuilder, SetConfigAdminBuilder,
77
};
88
use jito_restaking_core::{config::Config, ncn::Ncn, operator::Operator};
99
use log::{debug, info};
@@ -51,6 +51,9 @@ impl RestakingCliHandler {
5151
RestakingCommands::Config {
5252
action: ConfigActions::Get,
5353
} => self.get_config().await,
54+
RestakingCommands::Config {
55+
action: ConfigActions::SetAdmin { new_admin },
56+
} => self.set_config_admin(new_admin).await,
5457
RestakingCommands::Ncn {
5558
action: NcnActions::Initialize,
5659
} => self.initialize_ncn().await,
@@ -288,4 +291,39 @@ impl RestakingCliHandler {
288291
fn get_rpc_client(&self) -> RpcClient {
289292
RpcClient::new_with_commitment(self.cli_config.rpc_url.clone(), self.cli_config.commitment)
290293
}
294+
295+
async fn set_config_admin(&self, new_admin: Pubkey) -> Result<()> {
296+
let keypair = self
297+
.cli_config
298+
.keypair
299+
.as_ref()
300+
.ok_or_else(|| anyhow!("No keypair"))?;
301+
let rpc_client = self.get_rpc_client();
302+
303+
let config_address = Config::find_program_address(&self.restaking_program_id).0;
304+
let mut ix_builder = SetConfigAdminBuilder::new();
305+
ix_builder
306+
.config(config_address)
307+
.old_admin(keypair.pubkey())
308+
.new_admin(new_admin);
309+
310+
let blockhash = rpc_client.get_latest_blockhash().await?;
311+
let tx = Transaction::new_signed_with_payer(
312+
&[ix_builder.instruction()],
313+
Some(&keypair.pubkey()),
314+
&[keypair],
315+
blockhash,
316+
);
317+
info!(
318+
"Setting restaking config admin parameters: {:?}",
319+
ix_builder
320+
);
321+
info!(
322+
"Setting restaking config admin transaction: {:?}",
323+
tx.get_signature()
324+
);
325+
rpc_client.send_and_confirm_transaction(&tx).await?;
326+
info!("Transaction confirmed: {:?}", tx.get_signature());
327+
Ok(())
328+
}
291329
}

cli/src/vault.rs

+5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ pub enum ConfigActions {
2424
},
2525
/// Fetches global config
2626
Get,
27+
/// Set the config admin
28+
SetAdmin {
29+
/// The new admin's pubkey
30+
new_admin: Pubkey,
31+
},
2732
}
2833

2934
/// Vault commands

cli/src/vault_handler.rs

+36-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::{anyhow, Result};
44
use jito_bytemuck::{AccountDeserialize, Discriminator};
55
use jito_vault_client::instructions::{
66
CreateTokenMetadataBuilder, InitializeConfigBuilder, InitializeVaultBuilder,
7-
SetDepositCapacityBuilder,
7+
SetConfigAdminBuilder, SetDepositCapacityBuilder,
88
};
99
use jito_vault_core::{config::Config, vault::Vault};
1010
use jito_vault_sdk::inline_mpl_token_metadata;
@@ -60,6 +60,9 @@ impl VaultCliHandler {
6060
VaultCommands::Config {
6161
action: ConfigActions::Get,
6262
} => self.get_config().await,
63+
VaultCommands::Config {
64+
action: ConfigActions::SetAdmin { new_admin },
65+
} => self.set_config_admin(new_admin).await,
6366
VaultCommands::Vault {
6467
action:
6568
VaultActions::Initialize {
@@ -338,4 +341,36 @@ impl VaultCliHandler {
338341

339342
Ok(())
340343
}
344+
345+
async fn set_config_admin(&self, new_admin: Pubkey) -> Result<()> {
346+
let keypair = self
347+
.cli_config
348+
.keypair
349+
.as_ref()
350+
.ok_or_else(|| anyhow!("Keypair not provided"))?;
351+
let rpc_client = self.get_rpc_client();
352+
353+
let config_address = Config::find_program_address(&self.vault_program_id).0;
354+
let mut ix_builder = SetConfigAdminBuilder::new();
355+
ix_builder
356+
.config(config_address)
357+
.old_admin(keypair.pubkey())
358+
.new_admin(new_admin);
359+
360+
let blockhash = rpc_client.get_latest_blockhash().await?;
361+
let tx = Transaction::new_signed_with_payer(
362+
&[ix_builder.instruction()],
363+
Some(&keypair.pubkey()),
364+
&[keypair],
365+
blockhash,
366+
);
367+
info!("Setting vault config admin parameters: {:?}", ix_builder);
368+
info!(
369+
"Setting vault config admin transaction: {:?}",
370+
tx.get_signature()
371+
);
372+
rpc_client.send_and_confirm_transaction(&tx).await?;
373+
info!("Transaction confirmed: {:?}", tx.get_signature());
374+
Ok(())
375+
}
341376
}

docs/_tools/00_cli.md

+26
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Initialize, get, and set the config struct
5656

5757
* `initialize` — Initialize the config
5858
* `get` — Get the config
59+
* `set-admin` — Set the config admin
5960

6061

6162

@@ -75,6 +76,18 @@ Get the config
7576

7677

7778

79+
## `jito-restaking-cli restaking config set-admin`
80+
81+
Set the config admin
82+
83+
**Usage:** `jito-restaking-cli restaking config set-admin <NEW_ADMIN>`
84+
85+
###### **Arguments:**
86+
87+
* `<NEW_ADMIN>` — The new admin's pubkey
88+
89+
90+
7891
## `jito-restaking-cli restaking ncn`
7992

8093
**Usage:** `jito-restaking-cli restaking ncn <COMMAND>`
@@ -176,6 +189,7 @@ Vault program commands
176189

177190
* `initialize` — Creates global config (can only be done once)
178191
* `get` — Fetches global config
192+
* `set-admin` — Set the config admin
179193

180194

181195

@@ -200,6 +214,18 @@ Fetches global config
200214

201215

202216

217+
## `jito-restaking-cli vault config set-admin`
218+
219+
Set the config admin
220+
221+
**Usage:** `jito-restaking-cli vault config set-admin <NEW_ADMIN>`
222+
223+
###### **Arguments:**
224+
225+
* `<NEW_ADMIN>` — The new admin's pubkey
226+
227+
228+
203229
## `jito-restaking-cli vault vault`
204230

205231
Vault commands

integration_tests/tests/fixtures/restaking_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ impl RestakingProgramClient {
10771077
&new_admin.pubkey(),
10781078
)],
10791079
Some(&old_admin.pubkey()),
1080-
&[old_admin, new_admin],
1080+
&[old_admin],
10811081
blockhash,
10821082
))
10831083
.await

integration_tests/tests/fixtures/vault_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1708,7 +1708,7 @@ impl VaultProgramClient {
17081708
&new_admin.pubkey(),
17091709
)],
17101710
Some(&old_admin.pubkey()),
1711-
&[old_admin, new_admin],
1711+
&[old_admin],
17121712
blockhash,
17131713
))
17141714
.await

restaking_program/src/set_config_admin.rs

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ pub fn process_set_config_admin(program_id: &Pubkey, accounts: &[AccountInfo]) -
1616
let mut config_data = config.data.borrow_mut();
1717
let config = Config::try_from_slice_unchecked_mut(&mut config_data)?;
1818
load_signer(old_admin, false)?;
19-
load_signer(new_admin, false)?;
2019

2120
if config.admin != *old_admin.key {
2221
return Err(RestakingError::ConfigAdminInvalid.into());

restaking_sdk/src/sdk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ pub fn set_config_admin(
618618
let accounts = vec![
619619
AccountMeta::new(*config, false),
620620
AccountMeta::new_readonly(*old_admin, true),
621-
AccountMeta::new_readonly(*new_admin, true),
621+
AccountMeta::new_readonly(*new_admin, false),
622622
];
623623
Instruction {
624624
program_id: *program_id,

vault_program/src/set_config_admin.rs

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ pub fn process_set_config_admin(program_id: &Pubkey, accounts: &[AccountInfo]) -
1616
let mut config_data = config.data.borrow_mut();
1717
let config = Config::try_from_slice_unchecked_mut(&mut config_data)?;
1818
load_signer(old_admin, false)?;
19-
load_signer(new_admin, false)?;
2019

2120
if config.admin != *old_admin.key {
2221
return Err(VaultError::ConfigAdminInvalid.into());

vault_sdk/src/sdk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ pub fn set_config_admin(
768768
let accounts = vec![
769769
AccountMeta::new(*config, false),
770770
AccountMeta::new_readonly(*old_admin, true),
771-
AccountMeta::new_readonly(*new_admin, true),
771+
AccountMeta::new_readonly(*new_admin, false),
772772
];
773773
Instruction {
774774
program_id: *program_id,

0 commit comments

Comments
 (0)