1use async_trait::async_trait;
2use fuels::{
3 prelude::*,
4 types::{
5 Address,
6 AssetId,
7 ContractId,
8 coin_type_id::CoinTypeId,
9 input::Input,
10 },
11};
12
13use crate::{
14 order_book_deploy::OrderBook,
15 trade_account_deploy::TradingAccount,
16};
17
18#[derive(Clone)]
19pub struct NoOpAccount {
20 address: Address,
21}
22
23impl Default for NoOpAccount {
24 fn default() -> Self {
25 Self::new()
26 }
27}
28
29impl NoOpAccount {
30 pub fn new() -> Self {
31 Self {
32 address: Address::zeroed(),
33 }
34 }
35}
36
37#[async_trait]
38impl ViewOnlyAccount for NoOpAccount {
39 fn address(&self) -> Address {
40 self.address
41 }
42
43 fn try_provider(&self) -> Result<&Provider> {
44 panic!("NoOpAccount does not have a provider")
45 }
46
47 async fn get_asset_inputs_for_amount(
48 &self,
49 _asset_id: AssetId,
50 _amount: u128,
51 _excluded_coins: Option<Vec<CoinTypeId>>,
52 ) -> Result<Vec<Input>> {
53 panic!("NoOpAccount cannot get asset inputs")
54 }
55}
56pub trait LogDecoderExt {
57 fn decoder_instance(contract_id: ContractId) -> LogDecoder;
58 fn decoder_instance_with_contract_ids(contract_ids: &[ContractId]) -> LogDecoder;
59}
60
61impl LogDecoderExt for crate::order_book_deploy::OrderBook<NoOpAccount> {
62 fn decoder_instance(contract_id: ContractId) -> LogDecoder {
63 Self::new(contract_id, NoOpAccount::new()).log_decoder()
64 }
65
66 fn decoder_instance_with_contract_ids(contract_ids: &[ContractId]) -> LogDecoder {
67 contract_ids
68 .iter()
69 .map(|&id| Self::decoder_instance(id))
70 .collect::<Vec<_>>()
71 .into_iter()
72 .fold(LogDecoder::default(), |mut acc, decoder| {
73 acc.merge(decoder);
74 acc
75 })
76 }
77}
78
79impl LogDecoderExt for crate::trade_account_deploy::TradingAccount<NoOpAccount> {
80 fn decoder_instance(contract_id: ContractId) -> LogDecoder {
81 Self::new(contract_id, NoOpAccount::new()).log_decoder()
82 }
83
84 fn decoder_instance_with_contract_ids(contract_ids: &[ContractId]) -> LogDecoder {
85 contract_ids
86 .iter()
87 .map(|&id| Self::decoder_instance(id))
88 .collect::<Vec<_>>()
89 .into_iter()
90 .fold(LogDecoder::default(), |mut acc, decoder| {
91 acc.merge(decoder);
92 acc
93 })
94 }
95}
96
97#[derive(Default)]
98pub struct GetLogDecoder {
99 pub trade_accounts: Option<Vec<ContractId>>,
100 pub order_books: Option<Vec<ContractId>>,
101}
102
103pub fn get_log_decoder(log_decoder_config: GetLogDecoder) -> LogDecoder {
104 let mut log_decoder = LogDecoder::default();
105
106 if let Some(trade_accounts) = log_decoder_config.trade_accounts {
107 log_decoder.merge(TradingAccount::decoder_instance_with_contract_ids(
108 &trade_accounts,
109 ));
110 }
111 if let Some(order_books) = log_decoder_config.order_books {
112 log_decoder.merge(OrderBook::decoder_instance_with_contract_ids(&order_books));
113 }
114
115 log_decoder
116}