Skip to main content

o2_tools/
log_decoder.rs

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}