chia_sdk_bindings/
clvm_types.rs

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