use crate::ports::TxPoolDb; use fuel_core_storage::{ transactional::AtomicView, Result as StorageResult, }; use fuel_core_types::{ entities::{ coins::coin::{ Coin, CompressedCoin, }, relayer::message::Message, }, fuel_tx::{ Contract, ContractId, UtxoId, }, fuel_types::{ BlockHeight, Nonce, }, }; use std::{ collections::{ HashMap, HashSet, }, sync::{ Arc, Mutex, }, }; #[derive(Default)] pub struct Data { pub coins: HashMap, pub contracts: HashMap, pub messages: HashMap, pub spent_messages: HashSet, } #[derive(Clone, Default)] pub struct MockDb { pub data: Arc>, } impl MockDb { pub fn insert_coin(&self, coin: Coin) { self.data .lock() .unwrap() .coins .insert(coin.utxo_id, coin.compress()); } pub fn insert_message(&self, message: Message) { self.data .lock() .unwrap() .messages .insert(*message.id(), message); } pub fn spend_message(&self, id: Nonce) { self.data.lock().unwrap().spent_messages.insert(id); } } impl TxPoolDb for MockDb { fn utxo(&self, utxo_id: &UtxoId) -> StorageResult> { Ok(self.data.lock().unwrap().coins.get(utxo_id).cloned()) } fn contract_exist(&self, contract_id: &ContractId) -> StorageResult { Ok(self .data .lock() .unwrap() .contracts .contains_key(contract_id)) } fn message(&self, id: &Nonce) -> StorageResult> { Ok(self.data.lock().unwrap().messages.get(id).cloned()) } } pub struct MockDBProvider(pub MockDb); impl AtomicView for MockDBProvider { type View = MockDb; type Height = BlockHeight; fn latest_height(&self) -> Option { Some(BlockHeight::default()) } fn view_at(&self, _: &BlockHeight) -> StorageResult { Ok(self.latest_view()) } fn latest_view(&self) -> Self::View { self.0.clone() } }