Skip to main content

sss_token/instructions/
unpause.rs

1use 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}