sol_cerberus/instructions/
delete_rule.rs

1use anchor_spl::{metadata::MetadataAccount, token::TokenAccount};
2use crate::instructions::allowed::{allowed, AllowedRule};
3use crate::state::app::{App, Seed};
4use crate::state::role::Role;
5use crate::state::rule::*;
6use crate::utils::{utc_now, roles::address_or_wildcard};
7use anchor_lang::prelude::*;
8use crate::metadata_program;
9
10
11#[derive(Accounts)]
12pub struct DeleteRule<'info> {
13    #[account(mut)]
14    pub signer: Signer<'info>,
15    #[account(
16        mut,
17        close = collector,
18        seeds = [rule.namespace.to_le_bytes().as_ref(), rule.role.as_ref(), rule.resource.as_ref(), rule.permission.as_ref(), sol_cerberus_app.id.key().as_ref()], 
19        bump = rule.bump,
20    )]
21    pub rule: Account<'info, Rule>,
22    #[account(
23        seeds = [b"app".as_ref(), sol_cerberus_app.id.key().as_ref()],
24        bump = sol_cerberus_app.bump,
25    )]
26    pub sol_cerberus_app: Box<Account<'info, App>>,
27    #[account(
28        seeds = [sol_cerberus_role.role.as_ref(), address_or_wildcard(&sol_cerberus_role.address), sol_cerberus_role.app_id.key().as_ref()],
29        bump = sol_cerberus_role.bump
30    )]
31    pub sol_cerberus_role: Option<Box<Account<'info, Role>>>,
32    #[account(
33        seeds = [sol_cerberus_rule.namespace.to_le_bytes().as_ref(), sol_cerberus_rule.role.as_ref(), sol_cerberus_rule.resource.as_ref(), sol_cerberus_rule.permission.as_ref(), sol_cerberus_rule.app_id.key().as_ref()],
34        bump = sol_cerberus_rule.bump,
35    )]
36    pub sol_cerberus_rule: Option<Box<Account<'info, Rule>>>,
37    #[account(
38        seeds = [sol_cerberus_rule2.namespace.to_le_bytes().as_ref(), sol_cerberus_rule2.role.as_ref(), sol_cerberus_rule2.resource.as_ref(), sol_cerberus_rule2.permission.as_ref(), sol_cerberus_rule2.app_id.key().as_ref()],
39        bump = sol_cerberus_rule2.bump,
40    )]
41    pub sol_cerberus_rule2: Option<Box<Account<'info, Rule>>>,
42    #[account()]
43    pub sol_cerberus_token: Option<Box<Account<'info, TokenAccount>>>,
44    #[account(
45        seeds = [b"metadata", metadata_program::ID.as_ref(), sol_cerberus_metadata.mint.key().as_ref()],
46        seeds::program =metadata_program::ID,
47        bump,
48    )]
49    pub sol_cerberus_metadata: Option<Box<Account<'info, MetadataAccount>>>,
50    #[account(
51        init_if_needed,
52        payer = signer,
53        space = 9, // Account discriminator + initialized
54        seeds = [b"seed".as_ref(), signer.key.as_ref()],
55        bump
56    )]
57    pub sol_cerberus_seed: Option<Account<'info, Seed>>,
58    /// CHECK: collector of the funds
59    #[account(mut)]
60    collector: AccountInfo<'info>,
61    pub system_program: Program<'info, System>,
62}
63
64pub fn delete_rule(
65    ctx: Context<DeleteRule>
66) -> Result<()> {
67      // Checks if is allowed to delete a rule for this specific Namespace and Role.
68      allowed(
69        &ctx.accounts.signer,
70        &ctx.accounts.sol_cerberus_app,
71        &ctx.accounts.sol_cerberus_role,
72        &ctx.accounts.sol_cerberus_rule,
73        &ctx.accounts.sol_cerberus_token,
74        &ctx.accounts.sol_cerberus_metadata,
75        &mut ctx.accounts.sol_cerberus_seed,
76        &ctx.accounts.system_program,
77        AllowedRule {
78            app_id: ctx.accounts.sol_cerberus_app.id.key(),
79            namespace: Namespaces::DeleteRuleNSRole as u8,
80            resource: ctx.accounts.rule.namespace.to_string(),
81            permission: ctx.accounts.rule.role.to_string(),
82        },
83    )?;
84    // // Checks if is allowed to delete a rule for this specific Resource and Permission.
85    allowed(
86        &ctx.accounts.signer,
87        &ctx.accounts.sol_cerberus_app,
88        &ctx.accounts.sol_cerberus_role,
89        &ctx.accounts.sol_cerberus_rule2,
90        &ctx.accounts.sol_cerberus_token,
91        &ctx.accounts.sol_cerberus_metadata,
92        &mut None,
93        &ctx.accounts.system_program,
94        AllowedRule {
95            app_id: ctx.accounts.sol_cerberus_app.id.key(),
96            namespace: Namespaces::DeleteRuleResourcePerm as u8,
97            resource: ctx.accounts.rule.resource.to_string(),
98            permission: ctx.accounts.rule.permission.to_string(),
99        },
100    )?;
101
102    emit!(RulesChanged {
103        time: utc_now(),
104        app_id: ctx.accounts.sol_cerberus_app.id,
105    });
106    Ok(())
107}