chia_sdk_bindings/
clvm_types.rs

1use bindy::{Error, Result};
2use chia_bls::SecretKey;
3use chia_protocol::{Bytes32, Coin};
4use chia_puzzle_types::{EveProof as EveProofRs, LineageProof, Proof as ProofRs};
5
6use crate::{Nft, Program};
7
8#[derive(Clone)]
9pub struct Spend {
10    pub puzzle: Program,
11    pub solution: Program,
12}
13
14impl From<Spend> for chia_sdk_driver::Spend {
15    fn from(value: Spend) -> Self {
16        Self {
17            puzzle: value.puzzle.1,
18            solution: value.solution.1,
19        }
20    }
21}
22
23#[derive(Clone)]
24pub struct Output {
25    pub value: Program,
26    pub cost: u64,
27}
28
29#[derive(Clone)]
30pub struct Pair {
31    pub first: Program,
32    pub rest: Program,
33}
34
35#[derive(Clone)]
36pub struct CurriedProgram {
37    pub program: Program,
38    pub args: Vec<Program>,
39}
40
41#[derive(Clone)]
42pub struct Proof {
43    pub parent_parent_coin_info: Bytes32,
44    pub parent_inner_puzzle_hash: Option<Bytes32>,
45    pub parent_amount: u64,
46}
47
48impl Proof {
49    pub fn to_lineage_proof(&self) -> Result<Option<LineageProof>> {
50        Ok(self.clone().try_into().ok())
51    }
52}
53
54impl TryFrom<Proof> for LineageProof {
55    type Error = Error;
56
57    fn try_from(value: Proof) -> Result<Self> {
58        Ok(Self {
59            parent_parent_coin_info: value.parent_parent_coin_info,
60            parent_inner_puzzle_hash: value
61                .parent_inner_puzzle_hash
62                .ok_or(Error::MissingParentInnerPuzzleHash)?,
63            parent_amount: value.parent_amount,
64        })
65    }
66}
67
68impl From<LineageProof> for Proof {
69    fn from(value: LineageProof) -> Self {
70        Self {
71            parent_parent_coin_info: value.parent_parent_coin_info,
72            parent_inner_puzzle_hash: Some(value.parent_inner_puzzle_hash),
73            parent_amount: value.parent_amount,
74        }
75    }
76}
77
78impl From<Proof> for ProofRs {
79    fn from(value: Proof) -> Self {
80        if let Some(parent_inner_puzzle_hash) = value.parent_inner_puzzle_hash {
81            Self::Lineage(chia_puzzle_types::LineageProof {
82                parent_parent_coin_info: value.parent_parent_coin_info,
83                parent_inner_puzzle_hash,
84                parent_amount: value.parent_amount,
85            })
86        } else {
87            Self::Eve(EveProofRs {
88                parent_parent_coin_info: value.parent_parent_coin_info,
89                parent_amount: value.parent_amount,
90            })
91        }
92    }
93}
94
95impl From<ProofRs> for Proof {
96    fn from(value: ProofRs) -> Self {
97        match value {
98            ProofRs::Lineage(proof) => Self {
99                parent_parent_coin_info: proof.parent_parent_coin_info,
100                parent_inner_puzzle_hash: Some(proof.parent_inner_puzzle_hash),
101                parent_amount: proof.parent_amount,
102            },
103            ProofRs::Eve(proof) => Self {
104                parent_parent_coin_info: proof.parent_parent_coin_info,
105                parent_inner_puzzle_hash: None,
106                parent_amount: proof.parent_amount,
107            },
108        }
109    }
110}
111
112pub trait LineageProofExt {
113    fn to_proof(&self) -> Result<Proof>;
114}
115
116impl LineageProofExt for LineageProof {
117    fn to_proof(&self) -> Result<Proof> {
118        Ok((*self).into())
119    }
120}
121
122#[derive(Clone)]
123pub struct OfferSecurityCoinDetails {
124    pub security_coin: Coin,
125    pub security_coin_sk: SecretKey,
126}
127
128#[derive(Clone)]
129pub struct SettlementNftSpendResult {
130    pub new_nft: Nft,
131    pub security_conditions: Vec<Program>,
132}