chia_sdk_bindings/
clvm_types.rs1use 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}