sealevel_tools/cpi/token_program/extensions/
initialize_group_pointer.rs

1use crate::{cpi::CpiInstruction, entrypoint::NoStdAccountInfo, pubkey::Pubkey};
2
3/// Arguments for the initialize group member pointer instruction on the specified Token program,
4/// which is used to establish a group (collection) of mints. This instruction must be called before
5/// a mint is initialized.
6#[derive(Clone, PartialEq, Eq)]
7pub struct InitializeGroupPointer<'a> {
8    pub token_program_id: &'a Pubkey,
9    pub mint: &'a NoStdAccountInfo,
10    pub authority: Option<&'a Pubkey>,
11    pub group: Option<&'a Pubkey>,
12}
13
14impl<'a> InitializeGroupPointer<'a> {
15    /// Consume arguments to perform CPI call.
16    #[inline(always)]
17    pub fn into_invoke(self) {
18        let Self {
19            token_program_id,
20            mint,
21            authority,
22            group,
23        } = self;
24
25        // Group pointer selector == 40.
26        let instruction_data = super::serialize_initialize_pointer_instruction_data(
27            40,
28            super::unwrap_or_default_pubkey(authority),
29            super::unwrap_or_default_pubkey(group),
30        );
31
32        CpiInstruction {
33            program_id: token_program_id,
34            accounts: &[mint.to_meta_c()],
35            data: &instruction_data,
36        }
37        .invoke_signed(&[mint.to_info_c()], &[]);
38    }
39}