fuel-core-txpool 0.17.5

Transaction pool
Documentation
use crate::ports::TxPoolDb;
use fuel_core_storage::Result as StorageResult;
use fuel_core_types::{
    blockchain::primitives::BlockHeight,
    entities::{
        coin::{
            Coin,
            CompressedCoin,
        },
        message::CompressedMessage,
    },
    fuel_tx::{
        Contract,
        ContractId,
        MessageId,
        UtxoId,
    },
};
use std::{
    collections::{
        HashMap,
        HashSet,
    },
    sync::{
        Arc,
        Mutex,
    },
};

#[derive(Default)]
pub struct Data {
    pub coins: HashMap<UtxoId, CompressedCoin>,
    pub contracts: HashMap<ContractId, Contract>,
    pub messages: HashMap<MessageId, CompressedMessage>,
    pub spent_messages: HashSet<MessageId>,
}

#[derive(Clone, Default)]
pub struct MockDb {
    pub data: Arc<Mutex<Data>>,
}

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: CompressedMessage) {
        self.data
            .lock()
            .unwrap()
            .messages
            .insert(message.id(), message);
    }

    pub fn spend_message(&self, message_id: MessageId) {
        self.data.lock().unwrap().spent_messages.insert(message_id);
    }
}

impl TxPoolDb for MockDb {
    fn utxo(&self, utxo_id: &UtxoId) -> StorageResult<Option<CompressedCoin>> {
        Ok(self
            .data
            .lock()
            .unwrap()
            .coins
            .get(utxo_id)
            .map(Clone::clone))
    }

    fn contract_exist(&self, contract_id: &ContractId) -> StorageResult<bool> {
        Ok(self
            .data
            .lock()
            .unwrap()
            .contracts
            .contains_key(contract_id))
    }

    fn message(
        &self,
        message_id: &MessageId,
    ) -> StorageResult<Option<CompressedMessage>> {
        Ok(self
            .data
            .lock()
            .unwrap()
            .messages
            .get(message_id)
            .map(Clone::clone))
    }

    fn is_message_spent(&self, message_id: &MessageId) -> StorageResult<bool> {
        Ok(self
            .data
            .lock()
            .unwrap()
            .spent_messages
            .contains(message_id))
    }

    fn current_block_height(&self) -> StorageResult<BlockHeight> {
        Ok(Default::default())
    }
}