chik_wallet/puzzles/
singleton.rs

1use chik_protocol::Bytes32;
2use hex_literal::hex;
3use klvm_traits::{FromKlvm, ToKlvm};
4
5use crate::Proof;
6
7#[derive(Debug, Clone, PartialEq, Eq, ToKlvm, FromKlvm)]
8#[klvm(curry)]
9pub struct SingletonArgs<I> {
10    pub singleton_struct: SingletonStruct,
11    pub inner_puzzle: I,
12}
13
14#[derive(Debug, Clone, PartialEq, Eq, ToKlvm, FromKlvm)]
15#[klvm(tuple)]
16pub struct SingletonStruct {
17    pub mod_hash: Bytes32,
18    pub launcher_id: Bytes32,
19    pub launcher_puzzle_hash: Bytes32,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, ToKlvm, FromKlvm)]
23#[klvm(list)]
24pub struct SingletonSolution<I> {
25    pub proof: Proof,
26    pub amount: u64,
27    pub inner_solution: I,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, ToKlvm, FromKlvm)]
31#[klvm(list)]
32pub struct LauncherSolution<T> {
33    pub singleton_puzzle_hash: Bytes32,
34    pub amount: u64,
35    pub key_value_list: T,
36}
37
38impl SingletonStruct {
39    pub fn new(launcher_id: Bytes32) -> Self {
40        Self {
41            mod_hash: SINGLETON_TOP_LAYER_PUZZLE_HASH.into(),
42            launcher_id,
43            launcher_puzzle_hash: SINGLETON_LAUNCHER_PUZZLE_HASH.into(),
44        }
45    }
46}
47
48/// This is the puzzle reveal of the [singleton launcher](https://chiklisp.com/singletons#launcher) puzzle.
49pub const SINGLETON_LAUNCHER_PUZZLE: [u8; 175] = hex!(
50    "
51    ff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff
52    04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04
53    ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02
54    ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff
55    09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0b
56    ffff0101ff058080ff0180ff018080
57    "
58);
59
60/// This is the puzzle hash of the [singleton launcher](https://chiklisp.com/singletons#launcher) puzzle.
61pub const SINGLETON_LAUNCHER_PUZZLE_HASH: [u8; 32] = hex!(
62    "
63    eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9
64    "
65);
66
67/// This is the puzzle reveal of the [singleton](https://chiklisp.com/singletons) puzzle.
68pub const SINGLETON_TOP_LAYER_PUZZLE: [u8; 967] = hex!(
69    "
70    ff02ffff01ff02ffff03ffff18ff2fff3480ffff01ff04ffff04ff20ffff04ff
71    2fff808080ffff04ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff2aff
72    ff04ff02ffff04ff27ffff04ffff02ffff03ff77ffff01ff02ff36ffff04ff02
73    ffff04ff09ffff04ff57ffff04ffff02ff2effff04ff02ffff04ff05ff808080
74    80ff808080808080ffff011d80ff0180ffff04ffff02ffff03ff77ffff0181b7
75    ffff015780ff0180ff808080808080ffff04ff77ff808080808080ffff02ff3a
76    ffff04ff02ffff04ff05ffff04ffff02ff0bff5f80ffff01ff80808080808080
77    80ffff01ff088080ff0180ffff04ffff01ffffffff4947ff0233ffff0401ff01
78    02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04
79    ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff
80    0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff
81    0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80
82    ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff08
83    8080ff0180ff02ffff03ff0bffff01ff02ffff03ffff02ff26ffff04ff02ffff
84    04ff13ff80808080ffff01ff02ffff03ffff20ff1780ffff01ff02ffff03ffff
85    09ff81b3ffff01818f80ffff01ff02ff3affff04ff02ffff04ff05ffff04ff1b
86    ffff04ff34ff808080808080ffff01ff04ffff04ff23ffff04ffff02ff36ffff
87    04ff02ffff04ff09ffff04ff53ffff04ffff02ff2effff04ff02ffff04ff05ff
88    80808080ff808080808080ff738080ffff02ff3affff04ff02ffff04ff05ffff
89    04ff1bffff04ff34ff8080808080808080ff0180ffff01ff088080ff0180ffff
90    01ff04ff13ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff17ff80
91    80808080808080ff0180ffff01ff02ffff03ff17ff80ffff01ff088080ff0180
92    80ff0180ffffff02ffff03ffff09ff09ff3880ffff01ff02ffff03ffff18ff2d
93    ffff010180ffff01ff0101ff8080ff0180ff8080ff0180ff0bff3cffff0bff34
94    ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02
95    ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0b
96    ff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02
97    ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0d
98    ff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ffff21ff17
99    ffff09ff0bff158080ffff01ff04ff30ffff04ff0bff808080ffff01ff088080
100    ff0180ff018080
101    "
102);
103
104/// This is the puzzle hash of the [singleton](https://chiklisp.com/singletons) puzzle.
105pub const SINGLETON_TOP_LAYER_PUZZLE_HASH: [u8; 32] = hex!(
106    "
107    7faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9f
108    "
109);
110
111#[cfg(test)]
112mod tests {
113    use super::*;
114
115    use crate::assert_puzzle_hash;
116
117    #[test]
118    fn puzzle_hashes() {
119        assert_puzzle_hash!(SINGLETON_LAUNCHER_PUZZLE => SINGLETON_LAUNCHER_PUZZLE_HASH);
120        assert_puzzle_hash!(SINGLETON_TOP_LAYER_PUZZLE => SINGLETON_TOP_LAYER_PUZZLE_HASH);
121    }
122}