@@ -72,3 +72,178 @@ impl Drive {
7272 }
7373 }
7474}
75+
76+ #[ cfg( test) ]
77+ mod tests {
78+ use super :: * ;
79+ use crate :: util:: test_helpers:: setup:: setup_drive_with_initial_state_structure;
80+ use dpp:: block:: block_info:: BlockInfo ;
81+ use dpp:: data_contract:: accessors:: v1:: DataContractV1Getters ;
82+ use dpp:: data_contract:: associated_token:: token_configuration:: v0:: TokenConfigurationV0 ;
83+ use dpp:: data_contract:: associated_token:: token_configuration:: TokenConfiguration ;
84+ use dpp:: data_contract:: config:: v0:: DataContractConfigV0 ;
85+ use dpp:: data_contract:: config:: DataContractConfig ;
86+ use dpp:: data_contract:: v1:: DataContractV1 ;
87+ use dpp:: identity:: accessors:: IdentityGettersV0 ;
88+ use dpp:: identity:: Identity ;
89+ use dpp:: prelude:: DataContract ;
90+ use dpp:: tokens:: info:: v0:: IdentityTokenInfoV0 ;
91+ use dpp:: version:: PlatformVersion ;
92+ use std:: collections:: BTreeMap ;
93+
94+ fn create_token_contract ( _platform_version : & PlatformVersion ) -> DataContract {
95+ DataContract :: V1 ( DataContractV1 {
96+ id : Default :: default ( ) ,
97+ version : 0 ,
98+ owner_id : Default :: default ( ) ,
99+ document_types : Default :: default ( ) ,
100+ config : DataContractConfig :: V0 ( DataContractConfigV0 {
101+ can_be_deleted : false ,
102+ readonly : false ,
103+ keeps_history : false ,
104+ documents_keep_history_contract_default : false ,
105+ documents_mutable_contract_default : false ,
106+ documents_can_be_deleted_contract_default : false ,
107+ requires_identity_encryption_bounded_key : None ,
108+ requires_identity_decryption_bounded_key : None ,
109+ } ) ,
110+ schema_defs : None ,
111+ created_at : None ,
112+ updated_at : None ,
113+ created_at_block_height : None ,
114+ updated_at_block_height : None ,
115+ created_at_epoch : None ,
116+ updated_at_epoch : None ,
117+ groups : Default :: default ( ) ,
118+ tokens : BTreeMap :: from ( [ (
119+ 0 ,
120+ TokenConfiguration :: V0 ( TokenConfigurationV0 :: default_most_restrictive ( ) ) ,
121+ ) ] ) ,
122+ keywords : Vec :: new ( ) ,
123+ description : None ,
124+ } )
125+ }
126+
127+ #[ test]
128+ fn should_prove_and_verify_token_infos_for_identity_id_with_frozen_token ( ) {
129+ let drive = setup_drive_with_initial_state_structure ( None ) ;
130+ let platform_version = PlatformVersion :: latest ( ) ;
131+
132+ let identity = Identity :: random_identity ( 3 , Some ( 14 ) , platform_version)
133+ . expect ( "expected a platform identity" ) ;
134+ let identity_id = identity. id ( ) . to_buffer ( ) ;
135+
136+ let contract = create_token_contract ( platform_version) ;
137+ let token_id = contract. token_id ( 0 ) . expect ( "expected token at position 0" ) ;
138+
139+ drive
140+ . add_new_identity (
141+ identity. clone ( ) ,
142+ false ,
143+ & BlockInfo :: default ( ) ,
144+ true ,
145+ None ,
146+ platform_version,
147+ )
148+ . expect ( "expected to add an identity" ) ;
149+
150+ drive
151+ . insert_contract (
152+ & contract,
153+ BlockInfo :: default ( ) ,
154+ true ,
155+ None ,
156+ platform_version,
157+ )
158+ . expect ( "expected to insert contract" ) ;
159+
160+ // Freeze the identity for this token
161+ drive
162+ . token_freeze (
163+ token_id,
164+ identity. id ( ) ,
165+ & BlockInfo :: default ( ) ,
166+ true ,
167+ None ,
168+ platform_version,
169+ )
170+ . expect ( "expected to freeze token" ) ;
171+
172+ // Generate proof
173+ let token_ids = vec ! [ token_id. to_buffer( ) ] ;
174+ let proof = drive
175+ . prove_identity_token_infos ( & token_ids, identity_id, None , platform_version)
176+ . expect ( "expected to get proof" ) ;
177+
178+ let ( _, infos) : ( _ , BTreeMap < [ u8 ; 32 ] , Option < IdentityTokenInfo > > ) =
179+ Drive :: verify_token_infos_for_identity_id (
180+ proof. as_slice ( ) ,
181+ & token_ids,
182+ identity_id,
183+ false ,
184+ platform_version,
185+ )
186+ . expect ( "expected proof verification to succeed" ) ;
187+
188+ assert_eq ! ( infos. len( ) , 1 ) ;
189+ assert_eq ! (
190+ infos. get( & token_id. to_buffer( ) ) ,
191+ Some ( & Some ( IdentityTokenInfo :: V0 ( IdentityTokenInfoV0 {
192+ frozen: true
193+ } ) ) )
194+ ) ;
195+ }
196+
197+ #[ test]
198+ fn should_prove_and_verify_absent_token_infos_for_identity_id ( ) {
199+ let drive = setup_drive_with_initial_state_structure ( None ) ;
200+ let platform_version = PlatformVersion :: latest ( ) ;
201+
202+ let identity = Identity :: random_identity ( 3 , Some ( 14 ) , platform_version)
203+ . expect ( "expected a platform identity" ) ;
204+ let identity_id = identity. id ( ) . to_buffer ( ) ;
205+
206+ let contract = create_token_contract ( platform_version) ;
207+ let token_id = contract. token_id ( 0 ) . expect ( "expected token at position 0" ) ;
208+
209+ drive
210+ . add_new_identity (
211+ identity. clone ( ) ,
212+ false ,
213+ & BlockInfo :: default ( ) ,
214+ true ,
215+ None ,
216+ platform_version,
217+ )
218+ . expect ( "expected to add an identity" ) ;
219+
220+ drive
221+ . insert_contract (
222+ & contract,
223+ BlockInfo :: default ( ) ,
224+ true ,
225+ None ,
226+ platform_version,
227+ )
228+ . expect ( "expected to insert contract" ) ;
229+
230+ // No freeze -- info should be absent
231+ let token_ids = vec ! [ token_id. to_buffer( ) ] ;
232+ let proof = drive
233+ . prove_identity_token_infos ( & token_ids, identity_id, None , platform_version)
234+ . expect ( "expected to get proof" ) ;
235+
236+ let ( _, infos) : ( _ , BTreeMap < [ u8 ; 32 ] , Option < IdentityTokenInfo > > ) =
237+ Drive :: verify_token_infos_for_identity_id (
238+ proof. as_slice ( ) ,
239+ & token_ids,
240+ identity_id,
241+ false ,
242+ platform_version,
243+ )
244+ . expect ( "expected proof verification to succeed" ) ;
245+
246+ assert_eq ! ( infos. len( ) , 1 ) ;
247+ assert_eq ! ( infos. get( & token_id. to_buffer( ) ) , Some ( & None ) ) ;
248+ }
249+ }
0 commit comments