chia-sdk-bindings 0.34.0

Underlying implementation of chia-wallet-sdk bindings.
Documentation
use bindy::{Error, Result};
use chia_bls::SecretKey;
use chia_protocol::{Bytes32, Coin};
use chia_puzzle_types::{EveProof as EveProofRs, LineageProof, Proof as ProofRs};

use crate::{Nft, Program};

#[derive(Clone)]
pub struct Spend {
    pub puzzle: Program,
    pub solution: Program,
}

impl From<Spend> for chia_sdk_driver::Spend {
    fn from(value: Spend) -> Self {
        Self {
            puzzle: value.puzzle.1,
            solution: value.solution.1,
        }
    }
}

#[derive(Clone)]
pub struct Output {
    pub value: Program,
    pub cost: u64,
}

#[derive(Clone)]
pub struct Pair {
    pub first: Program,
    pub rest: Program,
}

#[derive(Clone)]
pub struct CurriedProgram {
    pub program: Program,
    pub args: Vec<Program>,
}

#[derive(Clone)]
pub struct Proof {
    pub parent_parent_coin_info: Bytes32,
    pub parent_inner_puzzle_hash: Option<Bytes32>,
    pub parent_amount: u64,
}

impl Proof {
    pub fn to_lineage_proof(&self) -> Result<Option<LineageProof>> {
        Ok(self.clone().try_into().ok())
    }
}

impl TryFrom<Proof> for LineageProof {
    type Error = Error;

    fn try_from(value: Proof) -> Result<Self> {
        Ok(Self {
            parent_parent_coin_info: value.parent_parent_coin_info,
            parent_inner_puzzle_hash: value
                .parent_inner_puzzle_hash
                .ok_or(Error::MissingParentInnerPuzzleHash)?,
            parent_amount: value.parent_amount,
        })
    }
}

impl From<LineageProof> for Proof {
    fn from(value: LineageProof) -> Self {
        Self {
            parent_parent_coin_info: value.parent_parent_coin_info,
            parent_inner_puzzle_hash: Some(value.parent_inner_puzzle_hash),
            parent_amount: value.parent_amount,
        }
    }
}

impl From<Proof> for ProofRs {
    fn from(value: Proof) -> Self {
        if let Some(parent_inner_puzzle_hash) = value.parent_inner_puzzle_hash {
            Self::Lineage(chia_puzzle_types::LineageProof {
                parent_parent_coin_info: value.parent_parent_coin_info,
                parent_inner_puzzle_hash,
                parent_amount: value.parent_amount,
            })
        } else {
            Self::Eve(EveProofRs {
                parent_parent_coin_info: value.parent_parent_coin_info,
                parent_amount: value.parent_amount,
            })
        }
    }
}

impl From<ProofRs> for Proof {
    fn from(value: ProofRs) -> Self {
        match value {
            ProofRs::Lineage(proof) => Self {
                parent_parent_coin_info: proof.parent_parent_coin_info,
                parent_inner_puzzle_hash: Some(proof.parent_inner_puzzle_hash),
                parent_amount: proof.parent_amount,
            },
            ProofRs::Eve(proof) => Self {
                parent_parent_coin_info: proof.parent_parent_coin_info,
                parent_inner_puzzle_hash: None,
                parent_amount: proof.parent_amount,
            },
        }
    }
}

pub trait LineageProofExt {
    fn to_proof(&self) -> Result<Proof>;
}

impl LineageProofExt for LineageProof {
    fn to_proof(&self) -> Result<Proof> {
        Ok((*self).into())
    }
}

#[derive(Clone)]
pub struct OfferSecurityCoinDetails {
    pub security_coin: Coin,
    pub security_coin_sk: SecretKey,
}

#[derive(Clone)]
pub struct SettlementNftSpendResult {
    pub new_nft: Nft,
    pub security_conditions: Vec<Program>,
}