sol_did/instructions/
set_controllers.rs

1use crate::constants::DID_ACCOUNT_SEED;
2use crate::state::{DidAccount, Secp256k1RawSignature};
3use anchor_lang::prelude::*;
4
5pub fn set_controllers(
6    ctx: Context<SetControllers>,
7    set_controllers_arg: SetControllersArg,
8    eth_signature: Option<Secp256k1RawSignature>,
9) -> Result<()> {
10    let data = &mut ctx.accounts.did_data;
11    if eth_signature.is_some() {
12        data.nonce += 1;
13    }
14
15    data.set_native_controllers(set_controllers_arg.native_controllers)?;
16    data.set_other_controllers(set_controllers_arg.other_controllers)?;
17
18    Ok(())
19}
20
21#[derive(Accounts)]
22#[instruction(set_controllers_arg: SetControllersArg, eth_signature: Option<Secp256k1RawSignature>)]
23pub struct SetControllers<'info> {
24    #[account(
25        mut,
26        seeds = [DID_ACCOUNT_SEED.as_bytes(), did_data.initial_verification_method.key_data.as_ref()],
27        bump = did_data.bump,
28        constraint = did_data.find_authority_constraint(&authority.key(), &set_controllers_arg.try_to_vec().unwrap(), eth_signature.as_ref(), None).is_some(),
29    )]
30    pub did_data: Account<'info, DidAccount>,
31    pub authority: Signer<'info>,
32}
33
34/// Argument
35#[derive(AnchorSerialize, AnchorDeserialize, Default, Clone)]
36pub struct SetControllersArg {
37    pub native_controllers: Vec<Pubkey>,
38    pub other_controllers: Vec<String>,
39}