chik_wallet/puzzles/
singleton.rs1use 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
48pub const SINGLETON_LAUNCHER_PUZZLE: [u8; 175] = hex!(
50 "
51 ff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff
52 04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04
53 ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02
54 ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff
55 09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0b
56 ffff0101ff058080ff0180ff018080
57 "
58);
59
60pub const SINGLETON_LAUNCHER_PUZZLE_HASH: [u8; 32] = hex!(
62 "
63 eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9
64 "
65);
66
67pub 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
104pub 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}