chia-sdk-driver 0.33.0

Driver code for interacting with standard puzzles on the Chia blockchain.
Documentation
use std::collections::HashSet;

use chia_sdk_types::{Condition, Conditions};

use crate::{Output, OutputSet};

#[derive(Debug, Default, Clone)]
pub struct ConditionsSpend {
    conditions: Conditions,
    outputs: HashSet<Output>,
}

impl ConditionsSpend {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn add_conditions(&mut self, conditions: Conditions) {
        for condition in conditions {
            if let Some(create_coin) = condition.as_create_coin() {
                let output = Output::new(create_coin.puzzle_hash, create_coin.amount);
                self.outputs.insert(output);
            }
            self.conditions.push(condition);
        }
    }

    pub fn finish(self) -> Conditions {
        self.conditions
    }
}

impl OutputSet for ConditionsSpend {
    fn has_output(&self, output: &Output) -> bool {
        self.outputs.contains(output)
    }

    fn can_run_cat_tail(&self) -> bool {
        !self.conditions.iter().any(Condition::is_run_cat_tail)
    }

    fn missing_singleton_output(&self) -> bool {
        !self.conditions.iter().any(|condition| {
            condition.is_melt_singleton()
                || condition
                    .as_create_coin()
                    .is_some_and(|create_coin| create_coin.amount % 2 == 1)
        })
    }
}