data_anchor_blober/instructions/
insert_chunk.rs1use anchor_lang::prelude::*;
2
3use crate::{blob::Blob, state::blober::Blober, SEED};
4
5#[derive(Accounts)]
6pub struct InsertChunk<'info> {
7 #[account(
8 mut,
9 seeds = [
10 SEED,
11 payer.key().as_ref(),
12 blober.key().as_ref(),
13 blob.timestamp.to_le_bytes().as_ref(),
14 blob.size.to_le_bytes().as_ref(),
15 ],
16 bump = blob.bump
17 )]
18 pub blob: Account<'info, Blob>,
19
20 #[account(
21 constraint = blober.caller == payer.key(),
22 )]
23 pub blober: Account<'info, Blober>,
24
25 #[account(mut)]
26 pub payer: Signer<'info>,
27}
28
29pub fn insert_chunk_handler(ctx: Context<InsertChunk>, idx: u16, data: Vec<u8>) -> Result<()> {
30 ctx.accounts.blob.insert(Clock::get()?.slot, idx, &data);
31 Ok(())
32}
33
34#[cfg(test)]
35mod tests {
36 use anchor_lang::{
37 prelude::{AccountMeta, Pubkey},
38 ToAccountMetas,
39 };
40
41 use crate::accounts::InsertChunk;
42
43 #[test]
44 fn test_first_account_is_the_blob() {
45 let blob = Pubkey::new_unique();
46 let blober = Pubkey::new_unique();
47 let payer = Pubkey::new_unique();
48
49 let account = InsertChunk {
50 blob,
51 blober,
52 payer,
53 };
54
55 let expected = AccountMeta {
56 pubkey: blob,
57 is_signer: false,
58 is_writable: true,
59 };
60
61 let is_signer = None;
62 let actual = &account.to_account_metas(is_signer)[0];
63 assert_eq!(actual, &expected);
64 }
65}