chik_sdk_bindings/mips/
members.rs1use binky::Result;
2use chik_bls::PublicKey;
3use chik_protocol::Bytes32;
4use chik_sdk_driver::{member_puzzle_hash, MofN};
5use chik_sdk_types::{
6 puzzles::{
7 BlsMember, FixedPuzzleMember, K1Member, K1MemberPuzzleAssert, PasskeyMember,
8 PasskeyMemberPuzzleAssert, R1Member, R1MemberPuzzleAssert, SingletonMember,
9 },
10 Mod,
11};
12use klvm_utils::TreeHash;
13
14use crate::{K1PublicKey, R1PublicKey};
15
16use super::{convert_restrictions, Restriction};
17
18#[derive(Default, Clone)]
19pub struct MemberConfig {
20 pub top_level: bool,
21 pub nonce: u32,
22 pub restrictions: Vec<Restriction>,
23}
24
25impl MemberConfig {
26 pub fn new() -> Result<Self> {
27 Ok(Self::default())
28 }
29
30 pub fn with_top_level(&self, top_level: bool) -> Result<Self> {
31 Ok(Self {
32 top_level,
33 nonce: self.nonce,
34 restrictions: self.restrictions.clone(),
35 })
36 }
37
38 pub fn with_nonce(&self, nonce: u32) -> Result<Self> {
39 Ok(Self {
40 top_level: self.top_level,
41 nonce,
42 restrictions: self.restrictions.clone(),
43 })
44 }
45
46 pub fn with_restrictions(&self, restrictions: Vec<Restriction>) -> Result<Self> {
47 Ok(Self {
48 top_level: self.top_level,
49 nonce: self.nonce,
50 restrictions,
51 })
52 }
53}
54
55fn member_hash(config: MemberConfig, inner_hash: TreeHash) -> Result<TreeHash> {
56 Ok(member_puzzle_hash(
57 config.nonce.try_into().unwrap(),
58 convert_restrictions(config.restrictions),
59 inner_hash,
60 config.top_level,
61 ))
62}
63
64pub fn m_of_n_hash(config: MemberConfig, required: u32, items: Vec<TreeHash>) -> Result<TreeHash> {
65 member_hash(
66 config,
67 MofN::new(required.try_into().unwrap(), items).inner_puzzle_hash(),
68 )
69}
70
71pub fn k1_member_hash(
72 config: MemberConfig,
73 public_key: K1PublicKey,
74 fast_forward: bool,
75) -> Result<TreeHash> {
76 member_hash(
77 config,
78 if fast_forward {
79 K1MemberPuzzleAssert::new(public_key.0).curry_tree_hash()
80 } else {
81 K1Member::new(public_key.0).curry_tree_hash()
82 },
83 )
84}
85
86pub fn r1_member_hash(
87 config: MemberConfig,
88 public_key: R1PublicKey,
89 fast_forward: bool,
90) -> Result<TreeHash> {
91 member_hash(
92 config,
93 if fast_forward {
94 R1MemberPuzzleAssert::new(public_key.0).curry_tree_hash()
95 } else {
96 R1Member::new(public_key.0).curry_tree_hash()
97 },
98 )
99}
100
101pub fn bls_member_hash(config: MemberConfig, public_key: PublicKey) -> Result<TreeHash> {
102 member_hash(config, BlsMember::new(public_key).curry_tree_hash())
103}
104
105pub fn passkey_member_hash(
106 config: MemberConfig,
107 public_key: R1PublicKey,
108 fast_forward: bool,
109) -> Result<TreeHash> {
110 member_hash(
111 config,
112 if fast_forward {
113 PasskeyMemberPuzzleAssert::new(public_key.0).curry_tree_hash()
114 } else {
115 PasskeyMember::new(public_key.0).curry_tree_hash()
116 },
117 )
118}
119
120pub fn singleton_member_hash(config: MemberConfig, launcher_id: Bytes32) -> Result<TreeHash> {
121 member_hash(config, SingletonMember::new(launcher_id).curry_tree_hash())
122}
123
124pub fn fixed_member_hash(config: MemberConfig, fixed_puzzle_hash: Bytes32) -> Result<TreeHash> {
125 member_hash(
126 config,
127 FixedPuzzleMember::new(fixed_puzzle_hash).curry_tree_hash(),
128 )
129}
130
131pub fn custom_member_hash(config: MemberConfig, inner_hash: TreeHash) -> Result<TreeHash> {
132 member_hash(config, inner_hash)
133}