Skip to main content

data_anchor_blober/instructions/
insert_chunk.rs

1use 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}