Skip to main content

data_anchor_blober/instructions/
initialize.rs

1use anchor_lang::{prelude::*, Discriminator};
2
3use crate::{initial_hash, state::blober::Blober, SEED};
4
5#[derive(Accounts)]
6#[instruction(namespace: String)]
7pub struct Initialize<'info> {
8    #[account(
9        init,
10        payer = payer,
11        space = Blober::DISCRIMINATOR.len() + Blober::INIT_SPACE,
12        seeds = [
13            SEED,
14            payer.key().as_ref(),
15            namespace.as_bytes()
16        ],
17        bump
18    )]
19    pub blober: Account<'info, Blober>,
20
21    #[account(mut)]
22    pub payer: Signer<'info>,
23
24    pub system_program: Program<'info, System>,
25}
26
27pub fn initialize_handler(
28    ctx: Context<Initialize>,
29    namespace: String,
30    trusted: Pubkey,
31) -> Result<()> {
32    ctx.accounts.blober.caller = trusted;
33    ctx.accounts.blober.namespace = namespace;
34    ctx.accounts.blober.hash = initial_hash();
35    Ok(())
36}
37
38#[cfg(test)]
39mod tests {
40    use anchor_lang::{
41        prelude::{AccountMeta, Pubkey},
42        ToAccountMetas,
43    };
44
45    use crate::accounts::Initialize;
46
47    #[test]
48    fn test_first_account_is_the_blober() {
49        let blober = Pubkey::new_unique();
50        let payer = Pubkey::new_unique();
51        let system_program = Pubkey::new_unique();
52
53        let account = Initialize {
54            blober,
55            payer,
56            system_program,
57        };
58
59        let expected = AccountMeta {
60            pubkey: blober,
61            is_signer: false,
62            is_writable: true,
63        };
64
65        let is_signer = None;
66        let actual = &account.to_account_metas(is_signer)[0];
67        assert_eq!(actual, &expected);
68    }
69}