bolt_component/
lib.rs

1use anchor_lang::prelude::*;
2
3declare_id!("CmP2djJgABZ4cRokm4ndxuq6LerqpNHLBsaUv2XKEJua");
4
5#[program]
6pub mod bolt_component {
7    use super::*;
8
9    pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
10        Ok(())
11    }
12
13    pub fn update(_ctx: Context<Update>, _data: Vec<u8>) -> Result<()> {
14        Ok(())
15    }
16
17    #[derive(Accounts)]
18    pub struct Update<'info> {
19        #[account(mut)]
20        /// CHECK: The component to update
21        pub bolt_component: UncheckedAccount<'info>,
22        #[account()]
23        /// CHECK: The authority of the component
24        pub authority: Signer<'info>,
25        #[account(address = anchor_lang::solana_program::sysvar::instructions::id())]
26        /// CHECK: The instruction sysvar
27        pub instruction_sysvar_account: AccountInfo<'info>,
28        #[account()]
29        pub session_token: Option<UncheckedAccount<'info>>,
30    }
31}
32
33#[derive(Accounts)]
34pub struct Initialize<'info> {
35    #[account(mut)]
36    pub payer: Signer<'info>,
37    #[account(mut)]
38    /// CHECK: The component to initialize
39    pub data: UncheckedAccount<'info>,
40    #[account()]
41    /// CHECK: A generic entity account
42    pub entity: AccountInfo<'info>,
43    #[account()]
44    /// CHECK: The authority of the component
45    pub authority: AccountInfo<'info>,
46    #[account(address = anchor_lang::solana_program::sysvar::instructions::id())]
47    /// CHECK: The instruction sysvar
48    pub instruction_sysvar_account: AccountInfo<'info>,
49    pub system_program: Program<'info, System>,
50}
51
52#[derive(InitSpace, AnchorSerialize, AnchorDeserialize, Default, Copy, Clone)]
53pub struct BoltMetadata {
54    pub authority: Pubkey,
55}
56
57#[cfg(feature = "cpi")]
58pub trait CpiContextBuilder<'info>: ToAccountMetas + ToAccountInfos<'info> + Sized {
59    fn build_cpi_context(
60        self,
61        program: AccountInfo<'info>,
62    ) -> CpiContext<'info, 'info, 'info, 'info, Self>;
63}
64
65#[cfg(feature = "cpi")]
66impl<'info> CpiContextBuilder<'info> for cpi::accounts::Update<'info> {
67    fn build_cpi_context(
68        mut self,
69        program: AccountInfo<'info>,
70    ) -> CpiContext<'info, 'info, 'info, 'info, Self> {
71        let cpi_program = program.to_account_info();
72        self.session_token = Some(self.session_token.unwrap_or(program.to_account_info()));
73        CpiContext::new(cpi_program, self)
74    }
75}