Skip to main content

devol_accounts_kit/instructions_data/as_transaction_instruction/
option_trade_debug.rs

1use std::error::Error;
2use async_trait::async_trait;
3use solana_program::instruction::{AccountMeta, Instruction};
4use solana_program::pubkey::Pubkey;
5use solana_program::system_program;
6use crate::account_readers::dvl_readable::{DvlClientParams, DvlIndexParam};
7use crate::accounts::client::client_account::client_account::ClientAccount;
8use crate::accounts::instruments::instruments_account::InstrumentsAccount;
9use crate::accounts::oracles::oracles_account::OraclesAccount;
10use crate::accounts::root::root_account::RootAccount;
11use crate::accounts::worker::pool_logs::pool_logs_account::PoolLogsAccount;
12use crate::accounts::worker::pools_trace::pools_trace_account::PoolsTraceAccount;
13use crate::accounts::worker::tasks_trace::tasks_trace_account::TasksTraceAccount;
14use crate::accounts::worker::worker_account::WorkerAccount;
15use crate::dvl_client::dvl_client::DvlClient;
16use crate::instructions_data::as_transaction_instruction::as_transaction_instruction::AsTransactionInstruction;
17use crate::instructions_data::dvl_instruction_data::DvlInstructionData;
18use crate::instructions_data::option_trade_debug::InstructionOptionTradeDebug;
19
20pub struct OptionTradeDebugTransactionParams {
21    pub worker_id: u32,
22    pub client_key: Pubkey,
23}
24
25#[async_trait]
26impl AsTransactionInstruction for InstructionOptionTradeDebug {
27    type DvlTransactionInstructionParams = OptionTradeDebugTransactionParams;
28
29    async fn as_transaction_instruction(
30        &self,
31        client: &DvlClient,
32        signer: &Pubkey,
33        transaction_params: Self::DvlTransactionInstructionParams,
34    ) -> Result<Box<Instruction>, Box<dyn Error>> {
35        let data = self.to_vec_le();
36        let root_acc_key = client.account_public_key::<RootAccount>(()).await?;
37        let client_acc_key = client.account_public_key::<ClientAccount>(DvlClientParams {
38            client_address: &transaction_params.client_key,
39            signer_account_params: None,
40        }).await?;
41        let instruments_acc_key = client.account_public_key::<InstrumentsAccount>(()).await?;
42        let worker_acc_key = client.account_public_key::<WorkerAccount>(DvlIndexParam { id: transaction_params.worker_id }).await?;
43        let pools_trace_key = client.account_public_key::<PoolsTraceAccount>(DvlIndexParam { id: transaction_params.worker_id }).await?;
44        let tasks_trace_key = client.account_public_key::<TasksTraceAccount>(DvlIndexParam { id: transaction_params.worker_id }).await?;
45        let pools_log_key = client.account_public_key::<PoolLogsAccount>(DvlIndexParam { id: transaction_params.worker_id }).await?;
46
47        let worker_account = client.get_account::<WorkerAccount>(DvlIndexParam { id: transaction_params.worker_id }).await?;
48        let instr_id = worker_account.instr_id;
49        let instrument_account = client.get_account::<InstrumentsAccount>(()).await?;
50        let oracle_id = instrument_account.data[instr_id as usize].assigned_oracle_num;
51        let oracle_acc = client.get_account::<OraclesAccount>(()).await?;
52        let oracle_data = oracle_acc.data[oracle_id as usize];
53        let oracles_account_key = client.account_public_key::<OraclesAccount>(()).await?;
54        let ext_oracle_account1_key = oracle_data.params[0].account;
55        let ext_oracle_account2_key = oracle_data.params[1].account;
56        let ext_oracle_account3_key = oracle_data.params[2].account;
57        let relative_oracle_data = oracle_acc.data[oracle_data.relative_oracle_num as usize];
58        let relative_ext_oracle_account1_key =
59            relative_oracle_data.params[0].account;
60        let relative_ext_oracle_account2_key =
61            relative_oracle_data.params[1].account;
62        let relative_ext_oracle_account3_key =
63            relative_oracle_data.params[2].account;
64
65        let account_metas = Vec::from([
66            AccountMeta {
67                pubkey: *signer,
68                is_signer: true,
69                is_writable: false,
70            },
71            AccountMeta {
72                pubkey: *root_acc_key,
73                is_signer: false,
74                is_writable: false,
75            },
76            AccountMeta {
77                pubkey: *client_acc_key,
78                is_signer: false,
79                is_writable: true,
80            },
81            AccountMeta {
82                pubkey: *instruments_acc_key,
83                is_signer: false,
84                is_writable: false,
85            },
86            AccountMeta {
87                pubkey: *worker_acc_key,
88                is_signer: false,
89                is_writable: true,
90            },
91            AccountMeta {
92                pubkey: *tasks_trace_key,
93                is_signer: false,
94                is_writable: true,
95            },
96            AccountMeta {
97                pubkey: *pools_trace_key,
98                is_signer: false,
99                is_writable: true,
100            },
101            AccountMeta {
102                pubkey: *pools_log_key,
103                is_signer: false,
104                is_writable: true,
105            },
106            AccountMeta::new_readonly(system_program::id(), false),
107            AccountMeta {
108                pubkey: *oracles_account_key,
109                is_signer: false,
110                is_writable: false,
111            },
112            AccountMeta {
113                pubkey: ext_oracle_account1_key,
114                is_signer: false,
115                is_writable: false,
116            },
117            AccountMeta {
118                pubkey: ext_oracle_account2_key,
119                is_signer: false,
120                is_writable: false,
121            },
122            AccountMeta {
123                pubkey: ext_oracle_account3_key,
124                is_signer: false,
125                is_writable: false,
126            },
127            AccountMeta {
128                pubkey: relative_ext_oracle_account1_key,
129                is_signer: false,
130                is_writable: false,
131            },
132            AccountMeta {
133                pubkey: relative_ext_oracle_account2_key,
134                is_signer: false,
135                is_writable: false,
136            },
137            AccountMeta {
138                pubkey: relative_ext_oracle_account3_key,
139                is_signer: false,
140                is_writable: false,
141            },
142        ]);
143        Ok(Box::from(Instruction::new_with_bytes(
144            client.program_id,
145            &*data,
146            account_metas,
147        )))
148    }
149}