sss_token/instructions/
unpause.rs1use anchor_lang::prelude::*;
2
3use crate::errors::SssError;
4use crate::events::ProgramUnpaused;
5use crate::state::*;
6use crate::utils::{require_paused, require_role};
7
8#[derive(Accounts)]
9pub struct Unpause<'info> {
10 pub authority: Signer<'info>,
11
12 #[account(
13 mut,
14 seeds = [StablecoinConfig::SEED_PREFIX, config.mint.as_ref()],
15 bump = config.bump,
16 )]
17 pub config: Account<'info, StablecoinConfig>,
18
19 #[account(
20 seeds = [RoleRegistry::SEED_PREFIX, config.key().as_ref()],
21 bump = role_registry.bump,
22 constraint = role_registry.config == config.key() @ SssError::InvalidAuthority,
23 )]
24 pub role_registry: Account<'info, RoleRegistry>,
25}
26
27pub fn handler(ctx: Context<Unpause>) -> Result<()> {
28 let config = &ctx.accounts.config;
29 require_paused(config)?;
30 require_role(
31 &ctx.accounts.role_registry,
32 &ctx.accounts.authority.key(),
33 Role::Pauser,
34 )?;
35
36 let clock = Clock::get()?;
37
38 let config = &mut ctx.accounts.config;
39 config.is_paused = false;
40 config.updated_at = clock.unix_timestamp;
41
42 emit!(ProgramUnpaused {
43 config: config.key(),
44 pauser: ctx.accounts.authority.key(),
45 timestamp: clock.unix_timestamp,
46 });
47
48 Ok(())
49}