sol_cerberus/instructions/
delete_rule.rs1use 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, seeds = [b"seed".as_ref(), signer.key.as_ref()],
55 bump
56 )]
57 pub sol_cerberus_seed: Option<Account<'info, Seed>>,
58 #[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 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 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}