namespaces/instructions/reverse_name_entry/
set_global_reverse_entry.rs

1use anchor_spl::token::TokenAccount;
2use cardinal_token_manager::state::{TokenManager, TokenManagerState};
3use {
4    crate::{errors::ErrorCode, state::*},
5    anchor_lang::prelude::*,
6};
7
8#[derive(Accounts)]
9pub struct SetGlobalReverseEntryCtx<'info> {
10    namespace: Box<Account<'info, Namespace>>,
11    #[account(
12        mut,
13        seeds = [ENTRY_SEED.as_bytes(), namespace.key().as_ref(), name_entry.name.as_bytes()],
14        bump = name_entry.bump,
15    )]
16    name_entry: Box<Account<'info, Entry>>,
17    #[account(
18        init_if_needed,
19        payer = payer,
20        space = REVERSE_ENTRY_SIZE,
21        seeds = [REVERSE_ENTRY_SEED.as_bytes(), user.key().as_ref()],
22        bump,
23    )]
24    reverse_name_entry: Box<Account<'info, ReverseEntry>>,
25
26    #[account(constraint =
27        user_name_entry_mint_token_account.mint == name_entry.mint
28        && user_name_entry_mint_token_account.owner == user.key()
29        && user_name_entry_mint_token_account.amount > 0
30        @ ErrorCode::InvalidOwnerMint
31    )]
32    user_name_entry_mint_token_account: Box<Account<'info, TokenAccount>>,
33    /// CHECK: This is not dangerous because we don't read or write from this account
34    #[account(mut)]
35    token_manager: UncheckedAccount<'info>,
36
37    #[account(mut)]
38    user: Signer<'info>,
39    #[account(mut)]
40    payer: Signer<'info>,
41    system_program: Program<'info, System>,
42}
43
44pub fn handler(ctx: Context<SetGlobalReverseEntryCtx>) -> Result<()> {
45    let namespace = &mut ctx.accounts.namespace;
46    let entry = &mut ctx.accounts.name_entry;
47    entry.reverse_entry = Some(ctx.accounts.reverse_name_entry.key());
48
49    let token_manager = Account::<TokenManager>::try_from(&&ctx.accounts.token_manager)?;
50    if token_manager.mint != entry.mint || token_manager.issuer != namespace.key() || token_manager.state == TokenManagerState::Invalidated as u8 {
51        return Err(error!(ErrorCode::InvalidTokenManager));
52    }
53
54    let reverse_entry = &mut ctx.accounts.reverse_name_entry;
55    reverse_entry.bump = *ctx.bumps.get("reverse_name_entry").unwrap();
56    reverse_entry.namespace_name = ctx.accounts.namespace.name.clone();
57    reverse_entry.entry_name = entry.name.clone();
58    Ok(())
59}