chik_sdk_bindings/mips/
members.rs

1use 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}