locked_voter/instructions/
revoke_program_lock_privilege.rs

1//! Handler for [locked_voter::revoke_program_lock_privilege].
2
3use crate::*;
4
5/// Accounts for [locked_voter::revoke_program_lock_privilege].
6#[derive(Accounts)]
7pub struct RevokeProgramLockPrivilege<'info> {
8    /// The [Locker].
9    pub locker: Account<'info, Locker>,
10    /// [LockerWhitelistEntry].
11    #[account(mut, has_one = locker, close = payer)]
12    pub whitelist_entry: Account<'info, LockerWhitelistEntry>,
13
14    /// Governor for the [Locker].
15    pub governor: Account<'info, Governor>,
16
17    /// Smart wallet on the [Governor].
18    pub smart_wallet: Signer<'info>,
19
20    /// Payer of the initialization.
21    #[account(mut)]
22    pub payer: Signer<'info>,
23}
24
25impl<'info> RevokeProgramLockPrivilege<'info> {
26    /// Emit event that [LockerWhitelistEntry] was closed.
27    pub fn revoke_program_lock_privilege(&mut self) -> Result<()> {
28        emit!(RevokeLockPrivilegeEvent {
29            locker: self.whitelist_entry.locker,
30            program_id: self.whitelist_entry.program_id,
31            timestamp: Clock::get()?.unix_timestamp
32        });
33
34        Ok(())
35    }
36}
37
38impl<'info> Validate<'info> for RevokeProgramLockPrivilege<'info> {
39    fn validate(&self) -> Result<()> {
40        assert_keys_eq!(self.governor.smart_wallet, self.smart_wallet);
41        assert_keys_eq!(self.whitelist_entry.locker, self.locker);
42        Ok(())
43    }
44}
45
46#[event]
47/// Event called in [locked_voter::revoke_program_lock_privilege].
48pub struct RevokeLockPrivilegeEvent {
49    /// The [Locker].
50    #[index]
51    pub locker: Pubkey,
52    /// ProgramId approved to make CPI calls to [locked_voter::lock].
53    pub program_id: Pubkey,
54    /// Timestamp of the event.
55    pub timestamp: i64,
56}