sol_did/instructions/
set_vm_flags.rs1use 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 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#[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}