use chia_protocol::{Bytes32, Coin, CoinSpend};
use chia_puzzle_types::standard::StandardArgs;
use chia_wallet_sdk::driver::{
DriverError, OptionContract, OptionType, OptionUnderlying, Spend, SpendContext,
SpendWithConditions, StandardLayer,
};
use chia_wallet_sdk::prelude::PublicKey;
use chia_wallet_sdk::types::Conditions;
pub enum Owner<'a> {
Standard(PublicKey),
Custom(&'a dyn SpendWithConditions),
}
impl Owner<'_> {
pub fn standard_puzzle_hash(&self) -> Option<Bytes32> {
match self {
Owner::Standard(public_key) => Some(StandardArgs::curry_tree_hash(*public_key).into()),
Owner::Custom(_) => None,
}
}
}
impl SpendWithConditions for Owner<'_> {
fn spend_with_conditions(
&self,
ctx: &mut SpendContext,
conditions: Conditions,
) -> std::result::Result<Spend, DriverError> {
match self {
Owner::Standard(public_key) => {
StandardLayer::new(*public_key).spend_with_conditions(ctx, conditions)
}
Owner::Custom(inner) => inner.spend_with_conditions(ctx, conditions),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct OptionTerms {
pub creator_puzzle_hash: Bytes32,
pub owner_puzzle_hash: Bytes32,
pub underlying_amount: u64,
pub strike_type: OptionType,
pub expiry_seconds: u64,
}
impl OptionTerms {
#[must_use]
pub fn new(
creator_puzzle_hash: Bytes32,
underlying_amount: u64,
strike_type: OptionType,
expiry_seconds: u64,
) -> Self {
Self {
creator_puzzle_hash,
owner_puzzle_hash: creator_puzzle_hash,
underlying_amount,
strike_type,
expiry_seconds,
}
}
}
#[derive(Clone, Debug)]
pub struct CreatedOption {
pub option: OptionContract,
pub underlying: OptionUnderlying,
pub underlying_coin: Coin,
}
#[derive(Clone, Debug)]
pub struct OptionSpend {
pub coin_spends: Vec<CoinSpend>,
pub created: Option<CreatedOption>,
}