devol_accounts_kit/instructions_data/as_transaction_instruction/
option_trade_debug.rs1use 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}