tachyon_math_library/instructions/
func_init.rs

1use crate::FunctionDataAccessors;
2use anchor_lang::prelude::*;
3use anchor_lang::ZeroCopy;
4use num_traits::FromPrimitive;
5use rust_decimal::Decimal;
6
7use crate::error::ErrorCode;
8use crate::state::*;
9
10#[derive(Accounts)]
11pub struct FuncInit<'info, T: ZeroCopy + Owner + FunctionDataAccessors> {
12    #[account(mut)]
13    pub admin: Signer<'info>,
14    #[account(
15        mut,
16        seeds = [FUNCTIONS_SEED],
17        bump,
18        has_one = admin
19    )]
20    pub functions: Account<'info, Functions>,
21    #[account(zero)]
22    pub f: AccountLoader<'info, T>,
23    pub system_program: Program<'info, System>,
24}
25
26impl<T: ZeroCopy + Owner + FunctionDataAccessors> FuncInit<'_, T> {
27    pub fn handler(ctx: Context<FuncInit<T>>, domain_start_raw: [u8; 16], domain_end_raw: [u8; 16], ft: FunctionType) -> Result<()> {
28        let mut f = ctx.accounts.f.load_init()?;
29
30        if f.get_is_initialized() {
31            return err!(ErrorCode::AccountAlreadyInitialized);
32        }
33        f.set_initialized_true()?;
34
35        let domain_start = Decimal::deserialize(domain_start_raw);
36        let domain_end = Decimal::deserialize(domain_end_raw);
37
38        f.set_domain_start(domain_start_raw)?;
39        f.set_domain_end(domain_end_raw)?;
40
41        let num_values = Decimal::from_usize(NUM_VALUES).unwrap();
42        let interval = (domain_end - domain_start) / num_values;
43
44        f.set_num_values(NUM_VALUES as u32)?;
45        f.set_interval(interval.serialize())?;
46
47        f.set_function_type(ft)?;
48
49        Ok(())
50    }
51}