devol_accounts_kit/instructions_data/constructors/
start_next_pool.rs

1use std::error::Error;
2use crate::accounts::worker::svm_params::SvmParams;
3use crate::constants::{BOUNDS_COUNT, FD};
4use crate::instructions_data::dvl_instruction_data::DvlInstructionData;
5use crate::instructions_data::instructions::Instructions;
6use crate::instructions_data::start_next_pool::{INSTRUCTION_START_NEXT_POOL_VERSION, InstructionStartNextPool};
7
8pub struct StartNextPoolParams {
9    pub svm_params: SvmParams,
10    pub bounds: [f32; BOUNDS_COUNT],
11    pub margin_vega: f64,
12    pub margin_vanna: f64,
13    pub margin_volga: f64,
14    pub range_lr: f64,
15    pub w_lr: f64,
16    pub max_lr: f64,
17    pub max_pct_pool: f64,
18    pub perm_impact: f64,
19}
20
21impl<'a> DvlInstructionData<'a> for InstructionStartNextPool {
22    type DvlInstrParams = StartNextPoolParams;
23
24    fn new(
25        params: Self::DvlInstrParams,
26    ) -> Result<Box<InstructionStartNextPool>, Box<dyn Error>> {
27        let mut bounds_i32 = [0; BOUNDS_COUNT];
28        for i in 0..BOUNDS_COUNT {
29            bounds_i32[i] = (params.bounds[i] + 0.5) as i32;
30        }
31        Ok(Box::new(InstructionStartNextPool {
32            cmd: Instructions::StartNextPool as u8,
33            version: INSTRUCTION_START_NEXT_POOL_VERSION,
34            reserved: [0; 6],
35            svm_params: params.svm_params,
36            margin_vega: (params.margin_vega * FD) as i64,
37            margin_vanna: (params.margin_vanna * FD) as i64,
38            margin_volga: (params.margin_volga * FD) as i64,
39            bounds: bounds_i32,
40            w_lr: (params.w_lr * FD) as i64,
41            range_lr: (params.range_lr * FD) as i64,
42            max_pct_pool: (params.max_pct_pool * FD) as i64,
43            max_lr: (params.max_lr * FD) as i64,
44            perm_impact: params.perm_impact,
45        }))
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use crate::instructions_data::dvl_instruction_data::DvlInstruction;
53
54    #[test]
55    fn test_instruction_start_next_pool_params() {
56        const TEST_C: f64 = 10.0;
57        const TEST_P: f64 = 20.0;
58        const TEST_V: f64 = 30.0;
59        const TEST_VT: f64 = 40.0;
60        const TEST_PSI: f64 = 20.0;
61        const TEST_MARGIN: f64 = 20.;
62        const TEST_BOUND: i32 = 30;
63        const TEST_LR: f64 = 10.;
64        const TEST_IMPACT: f64 = 5.0;
65
66        let start_next_pool_params = StartNextPoolParams {
67            svm_params: SvmParams {
68                c: TEST_C,
69                p: TEST_P,
70                v: TEST_V,
71                vt: TEST_VT,
72                psi: TEST_PSI,
73            },
74            margin_vega: TEST_MARGIN,
75            margin_vanna: TEST_MARGIN,
76            margin_volga: TEST_MARGIN,
77            bounds: [TEST_BOUND as f32; BOUNDS_COUNT],
78            w_lr: TEST_LR,
79            range_lr: TEST_LR,
80            max_pct_pool: TEST_LR,
81            max_lr: TEST_LR,
82            perm_impact: TEST_IMPACT,
83        };
84        let data =
85            DvlInstruction::new::<InstructionStartNextPool>(start_next_pool_params).unwrap();
86        assert_eq!(data.cmd, Instructions::StartNextPool as u8);
87        assert_eq!(data.version, INSTRUCTION_START_NEXT_POOL_VERSION);
88        assert_eq!(data.svm_params.c, TEST_C);
89        assert_eq!(data.svm_params.p, TEST_P);
90        assert_eq!(data.svm_params.v, TEST_V);
91        assert_eq!(data.svm_params.vt, TEST_VT);
92        assert_eq!(data.svm_params.psi, TEST_PSI);
93        assert_eq!(data.margin_vega as f64 / FD, TEST_MARGIN);
94        assert_eq!(data.margin_vanna as f64 / FD, TEST_MARGIN);
95        assert_eq!(data.margin_volga as f64 / FD, TEST_MARGIN);
96        assert_eq!(data.bounds, [TEST_BOUND; BOUNDS_COUNT]);
97        assert_eq!(data.w_lr as f64 / FD, TEST_LR);
98        assert_eq!(data.range_lr as f64 / FD, TEST_LR);
99        assert_eq!(data.max_pct_pool as f64 / FD, TEST_LR);
100        assert_eq!(data.max_lr as f64 / FD, TEST_LR);
101        assert_eq!(data.perm_impact, TEST_IMPACT);
102    }
103}