sol_did/instructions/
set_vm_flags.rs

1use crate::constants::DID_ACCOUNT_SEED;
2use crate::errors::DidSolError;
3use crate::state::{DidAccount, Secp256k1RawSignature, VerificationMethodFlags};
4use anchor_lang::prelude::*;
5
6pub fn set_vm_flags(
7    ctx: Context<SetVmFlagsMethod>,
8    flags_vm: UpdateFlagsVerificationMethod,
9    eth_signature: Option<Secp256k1RawSignature>,
10) -> Result<()> {
11    let data = &mut ctx.accounts.did_data;
12    if eth_signature.is_some() {
13        data.nonce += 1;
14    }
15
16    let vm = data.find_verification_method(&flags_vm.fragment);
17    require!(vm.is_some(), DidSolError::VmFragmentNotFound);
18    let vm = vm.unwrap();
19    vm.flags = flags_vm.flags;
20
21    // prevent lockout
22    require!(
23        data.has_authority_verification_methods(),
24        DidSolError::VmCannotRemoveLastAuthority
25    );
26
27    Ok(())
28}
29#[derive(Accounts)]
30#[instruction(flags_vm: UpdateFlagsVerificationMethod, eth_signature: Option<Secp256k1RawSignature>)]
31pub struct SetVmFlagsMethod<'info> {
32    #[account(
33        mut,
34        seeds = [DID_ACCOUNT_SEED.as_bytes(), did_data.initial_verification_method.key_data.as_ref()],
35        bump = did_data.bump,
36        constraint = did_data.find_authority_constraint(&authority.key(), &flags_vm.try_to_vec().unwrap(), eth_signature.as_ref(), flags_vm.get_filter_fragment()).is_some(),
37    )]
38    pub did_data: Account<'info, DidAccount>,
39    pub authority: Signer<'info>,
40}
41
42/// Argument
43#[derive(AnchorSerialize, AnchorDeserialize, Default, Clone)]
44pub struct UpdateFlagsVerificationMethod {
45    pub fragment: String,
46    pub flags: u16,
47}
48
49impl UpdateFlagsVerificationMethod {
50    pub fn get_filter_fragment(&self) -> Option<&String> {
51        let flags = VerificationMethodFlags::from_bits(self.flags).unwrap();
52        if flags.contains(VerificationMethodFlags::OWNERSHIP_PROOF) {
53            Some(&self.fragment)
54        } else {
55            None
56        }
57    }
58}