use chia_protocol::{Bytes32, CoinSpend};
use chia_wallet_sdk::driver::SpendContext;
use chia_wallet_sdk::types::{run_puzzle, Condition};
use clvm_traits::FromClvm;
pub(crate) fn emitted_conditions(
ctx: &mut SpendContext,
coin_spend: &CoinSpend,
) -> anyhow::Result<Vec<Condition>> {
let puzzle = ctx.alloc(&coin_spend.puzzle_reveal)?;
let solution = ctx.alloc(&coin_spend.solution)?;
let output = run_puzzle(ctx, puzzle, solution)?;
Ok(Vec::<Condition>::from_clvm(ctx, output)?)
}
pub(crate) fn all_emitted_conditions(
ctx: &mut SpendContext,
coin_spends: &[CoinSpend],
) -> anyhow::Result<Vec<Condition>> {
let mut conditions = Vec::new();
for coin_spend in coin_spends {
conditions.extend(emitted_conditions(ctx, coin_spend)?);
}
Ok(conditions)
}
pub(crate) fn creates_coin_to(
ctx: &mut SpendContext,
coin_spends: &[CoinSpend],
puzzle_hash: Bytes32,
) -> anyhow::Result<bool> {
Ok(all_emitted_conditions(ctx, coin_spends)?
.into_iter()
.any(|condition| {
matches!(condition.into_create_coin(), Some(create) if create.puzzle_hash == puzzle_hash)
}))
}