devol_accounts_kit/instructions_data/
option_trade_debug.rs

1use crate::constants::BUCKETS_COUNT;
2use crate::instructions_data::dvl_deserializable_instruction::DvlDeserializableInstruction;
3use crate::instructions_data::option_trade::{INSTRUCTION_OPTION_TRADE_DATA_SIZE, INSTRUCTION_OPTION_TRADE_VERSION, InstructionOptionTrade};
4use crate::utils::option_trade_basket_data::OptionTradeBasketData;
5
6pub const INSTRUCTION_OPTION_TRADE_DEBUG_DATA_SIZE: usize = INSTRUCTION_OPTION_TRADE_DATA_SIZE + 16;
7
8#[repr(C)]
9pub struct InstructionOptionTradeDebug {
10    pub option_trade: InstructionOptionTrade,
11    pub time_to_expiration: i64,
12    pub underlying_price: i64,
13}
14
15pub struct OptionTradeDebugParams<'a> {
16    pub trade_qty: [i32; BUCKETS_COUNT],
17    pub max_cost: Option<i64>,
18    pub basket: Option<&'a [OptionTradeBasketData]>,
19    pub time_to_expiration: i64,
20    pub underlying_price: i64,
21}
22
23impl<'a> DvlDeserializableInstruction<'a> for InstructionOptionTradeDebug {
24    #[inline(always)]
25    fn expected_size() -> usize {INSTRUCTION_OPTION_TRADE_DEBUG_DATA_SIZE}
26    #[inline(always)]
27    fn expected_version() -> u8 {INSTRUCTION_OPTION_TRADE_VERSION} // always the same as OPTION TRADE version
28}
29
30#[cfg(not(feature = "on-chain"))]
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use std::mem;
35    use crate::instructions_data::common::instruction_size_params::INSTRUCTION_SIZE_LIMIT;
36    use crate::instructions_data::option_trade::{INSTRUCTION_OPTION_TRADE_ACCOUNTS_SIZE};
37
38    pub const INSTR_OPTION_TRADE_DEBUG_OPTION_TRADE_OFFSET: usize = 0;
39    pub const INSTR_OPTION_TRADE_DEBUG_TIME_TO_EXPIRATION_OFFSET: usize = INSTRUCTION_OPTION_TRADE_DATA_SIZE;
40    pub const INSTR_OPTION_TRADE_DEBUG_UNDERLYING_PRICE_OFFSET: usize = INSTRUCTION_OPTION_TRADE_DATA_SIZE + 8;
41
42    #[test]
43    fn test_instruction_data_offsets() {
44        let data = InstructionOptionTradeDebug::default();
45        let base_ptr = &data as *const _ as usize;
46
47        assert_eq!(&data.option_trade as *const _ as usize - base_ptr, INSTR_OPTION_TRADE_DEBUG_OPTION_TRADE_OFFSET);
48        assert_eq!(&data.time_to_expiration as *const _ as usize - base_ptr, INSTR_OPTION_TRADE_DEBUG_TIME_TO_EXPIRATION_OFFSET);
49        assert_eq!(&data.underlying_price as *const _ as usize - base_ptr, INSTR_OPTION_TRADE_DEBUG_UNDERLYING_PRICE_OFFSET);
50
51        let structure_size = mem::size_of::<InstructionOptionTradeDebug>();
52        assert_eq!(structure_size, INSTRUCTION_OPTION_TRADE_DEBUG_DATA_SIZE);
53        assert_eq!(structure_size + INSTRUCTION_OPTION_TRADE_ACCOUNTS_SIZE <= INSTRUCTION_SIZE_LIMIT, true);
54    }
55}