namespaces/instructions/reverse_name_entry/
set_global_reverse_entry.rs1use 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 #[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}