devol_accounts_kit/instructions_data/constructors/
start_next_pool.rs1use 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}