dg_xch_core 2.1.1

Core library containing type/error definitions, CLVM tools, Consensus and Pool definitions
Documentation
use crate::blockchain::coin::Coin;
use crate::blockchain::coin_spend::CoinSpend;
use crate::blockchain::npc_result::NPCResult;
use crate::blockchain::sized_bytes::Bytes32;
use crate::blockchain::spend_bundle::SpendBundle;
use serde::{Deserialize, Serialize};
use std::cmp::Ordering;
use std::collections::HashMap;
use std::hash::{Hash, Hasher};

#[derive(PartialEq, Eq, Serialize, Deserialize, Debug, Clone)]
pub struct BundleCoinSpend {
    pub coin_spend: CoinSpend,
    pub eligible_for_dedup: bool,
    pub additions: Vec<Coin>,
    pub cost: Option<u64>,
}

#[derive(PartialEq, Eq, Serialize, Deserialize, Debug, Clone, Default)]
pub struct MempoolItem {
    pub spend_bundle: SpendBundle,
    pub fee: u64,
    pub cost: u64,
    pub npc_result: NPCResult,
    pub spend_bundle_name: Bytes32,
    #[serde(skip)]
    pub height_added_to_mempool: u32,
    #[serde(skip)]
    pub assert_height: Option<u32>,
    #[serde(skip)]
    pub assert_before_height: Option<u32>,
    #[serde(skip)]
    pub assert_before_seconds: Option<u64>,
    #[serde(skip)]
    pub bundle_coin_spends: HashMap<Bytes32, BundleCoinSpend>,
    #[serde(default)]
    pub additions: Vec<Coin>,
    #[serde(default)]
    pub removals: Vec<Coin>,
}
impl MempoolItem {
    #[allow(clippy::cast_precision_loss)]
    #[must_use]
    pub fn fee_per_cost(&self) -> f64 {
        (self.fee / self.cost()) as f64
    }
    #[must_use]
    pub fn name(&self) -> Bytes32 {
        self.spend_bundle_name
    }
    #[must_use]
    pub fn cost(&self) -> u64 {
        self.npc_result
            .conds
            .as_ref()
            .map(|c| c.cost)
            .unwrap_or_default()
    }
    #[must_use]
    pub fn additions(self) -> Vec<Coin> {
        self.npc_result.additions()
    }

    #[must_use]
    pub fn removals(self) -> Vec<Coin> {
        self.spend_bundle.removals()
    }
}

impl PartialOrd<Self> for MempoolItem {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

impl Ord for MempoolItem {
    fn cmp(&self, other: &Self) -> Ordering {
        self.fee_per_cost().total_cmp(&other.fee_per_cost())
    }
}
impl Hash for MempoolItem {
    fn hash<H: Hasher>(&self, state: &mut H) {
        state.write(self.spend_bundle_name.as_ref());
    }
}