data_anchor_blober/instructions/
initialize.rs1use 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}