use chia_wallet_sdk::driver::{Spend, SpendContext, SpendWithConditions};
use chia_wallet_sdk::types::Conditions;
use crate::types::Owner;
use crate::DidResult;
#[allow(dead_code)]
pub(crate) fn inner_spend(
ctx: &mut SpendContext,
owner: Owner,
conditions: Conditions,
) -> DidResult<Spend> {
match owner {
Owner::Standard(public_key) => {
let layer = chia_wallet_sdk::driver::StandardLayer::new(public_key);
Ok(layer.spend_with_conditions(ctx, conditions)?)
}
Owner::Custom(spend) => Ok(spend),
}
}
#[allow(dead_code)]
pub(crate) fn drain_coin_spends(ctx: &mut SpendContext) -> Vec<chia_protocol::CoinSpend> {
ctx.take()
}
#[cfg(test)]
mod tests {
use super::*;
use chia_wallet_sdk::driver::Spend;
use chia_wallet_sdk::prelude::PublicKey;
#[test]
fn standard_owner_builds_an_inner_spend() {
let mut ctx = SpendContext::new();
let owner = Owner::Standard(PublicKey::default());
let spend = inner_spend(&mut ctx, owner, Conditions::new())
.expect("standard layer should curry a spend");
assert_ne!(spend.puzzle, spend.solution);
assert!(drain_coin_spends(&mut ctx).is_empty());
}
#[test]
fn custom_owner_passes_the_inner_spend_through_unchanged() {
let mut ctx = SpendContext::new();
let puzzle = ctx.one();
let solution = ctx.nil();
let prebuilt = Spend::new(puzzle, solution);
let spend = inner_spend(&mut ctx, Owner::Custom(prebuilt), Conditions::new())
.expect("custom passthrough never fails");
assert_eq!(spend.puzzle, puzzle);
assert_eq!(spend.solution, solution);
}
}