1use super::MockDashPlatformSdk;
2use dpp::balances::total_single_token_balance::TotalSingleTokenBalance;
3use dpp::bincode::config::standard;
4use dpp::address_funds::PlatformAddress;
5use dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_moment::RewardDistributionMoment;
6use dpp::data_contract::group::Group;
7use dpp::group::group_action::GroupAction;
8use dpp::tokens::contract_info::TokenContractInfo;
9use dpp::tokens::info::IdentityTokenInfo;
10use dpp::tokens::status::TokenStatus;
11use dpp::tokens::token_pricing_schedule::TokenPricingSchedule;
12use dpp::{
13 bincode,
14 block::{extended_epoch_info::ExtendedEpochInfo, finalized_epoch_info::FinalizedEpochInfo},
15 dashcore::{hashes::Hash as CoreHash, ProTxHash},
16 document::{serialization_traits::DocumentCborMethodsV0, Document},
17 identifier::Identifier,
18 identity::{identities_contract_keys::IdentitiesContractKeys, IdentityPublicKey},
19 platform_serialization::{platform_encode_to_vec, platform_versioned_decode_from_slice},
20 prelude::{DataContract, Identity},
21 serialization::{
22 PlatformDeserializableWithPotentialValidationFromVersionedStructure,
23 PlatformSerializableWithPlatformVersion,
24 },
25 voting::votes::{resource_vote::ResourceVote, Vote},
26};
27use drive::grovedb::Element;
28use drive_proof_verifier::types::evonode_status::EvoNodeStatus;
29use drive_proof_verifier::types::groups::GroupActions;
30use drive_proof_verifier::types::identity_token_balance::{
31 IdentitiesTokenBalances, IdentityTokenBalances,
32};
33use drive_proof_verifier::types::token_info::{IdentitiesTokenInfos, IdentityTokenInfos};
34use drive_proof_verifier::types::token_status::TokenStatuses;
35use drive::grovedb::GroveTrunkQueryResult;
36use drive_proof_verifier::types::{
37 AddressInfo, Contenders, ContestedResources, CurrentQuorumsInfo, ElementFetchRequestItem,
38 IdentityBalanceAndRevision, IndexMap, MasternodeProtocolVote, NullifiersTrunkState,
39 PlatformAddressTrunkState, PrefundedSpecializedBalance, ProposerBlockCounts,
40 RecentAddressBalanceChanges, RecentCompactedAddressBalanceChanges,
41 MostRecentShieldedAnchor, RecentCompactedNullifierChanges, RecentNullifierChanges,
42 RetrievedValues, ShieldedAnchors, TokenPreProgrammedDistributions,
43 ShieldedEncryptedNote, ShieldedEncryptedNotes, ShieldedNullifierStatus,
44 ShieldedNullifierStatuses, ShieldedPoolState, TotalCreditsInPlatform,
45 VotePollsGroupedByTimestamp, Voters,
46};
47use std::{collections::BTreeMap, hash::Hash};
48
49static BINCODE_CONFIG: bincode::config::Configuration = bincode::config::standard();
50
51pub trait MockResponse {
57 fn mock_serialize(&self, mock_sdk: &MockDashPlatformSdk) -> Vec<u8>;
63
64 fn mock_deserialize(mock_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
70 where
71 Self: Sized;
72}
73
74impl<T: MockResponse> MockResponse for Option<T> {
75 fn mock_deserialize(mock_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
76 where
77 Self: Sized,
78 {
79 if buf.is_empty() {
80 return None;
81 }
82
83 Some(T::mock_deserialize(mock_sdk, buf))
84 }
85 fn mock_serialize(&self, mock_sdk: &MockDashPlatformSdk) -> Vec<u8> {
86 match self {
87 Some(item) => item.mock_serialize(mock_sdk),
88 None => vec![],
89 }
90 }
91}
92
93impl<T: MockResponse> MockResponse for Vec<T> {
94 fn mock_deserialize(mock_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
95 where
96 Self: Sized,
97 {
98 let items: Vec<Vec<u8>> = bincode::decode_from_slice(buf, BINCODE_CONFIG)
99 .expect("decode vec of data")
100 .0;
101 items
102 .into_iter()
103 .map(|item| T::mock_deserialize(mock_sdk, &item))
104 .collect()
105 }
106
107 fn mock_serialize(&self, mock_sdk: &MockDashPlatformSdk) -> Vec<u8> {
108 let data: Vec<Vec<u8>> = self
109 .iter()
110 .map(|item| item.mock_serialize(mock_sdk))
111 .collect();
112
113 bincode::encode_to_vec(data, BINCODE_CONFIG).expect("encode vec of data")
114 }
115}
116
117impl<K: Ord + MockResponse, V: MockResponse> MockResponse for BTreeMap<K, V> {
118 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
119 where
120 Self: Sized,
121 {
122 let (data, _): (BTreeMap<Vec<u8>, Vec<u8>>, _) =
123 bincode::decode_from_slice(buf, BINCODE_CONFIG).expect("decode BTreeMap");
124
125 data.into_iter()
126 .map(|(k, v)| (K::mock_deserialize(sdk, &k), V::mock_deserialize(sdk, &v)))
127 .collect()
128 }
129
130 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
131 let data: BTreeMap<Vec<u8>, Vec<u8>> = self
132 .iter()
133 .map(|(k, v)| (k.mock_serialize(sdk), v.mock_serialize(sdk)))
134 .collect();
135
136 bincode::encode_to_vec(data, BINCODE_CONFIG).expect("encode BTreeMap")
137 }
138}
139
140impl<K: Hash + Eq + MockResponse, V: MockResponse> MockResponse for IndexMap<K, V> {
141 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
142 where
143 Self: Sized,
144 {
145 let (data, _): (IndexMap<Vec<u8>, Vec<u8>>, _) =
146 bincode::serde::decode_from_slice(buf, BINCODE_CONFIG).expect("decode IndexMap");
147
148 data.into_iter()
149 .map(|(k, v)| (K::mock_deserialize(sdk, &k), V::mock_deserialize(sdk, &v)))
150 .collect()
151 }
152
153 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
154 let data: IndexMap<Vec<u8>, Vec<u8>> = self
155 .iter()
156 .map(|(k, v)| (k.mock_serialize(sdk), v.mock_serialize(sdk)))
157 .collect();
158
159 bincode::serde::encode_to_vec(data, BINCODE_CONFIG).expect("encode IndexMap")
160 }
161}
162
163macro_rules! impl_mock_response {
167 ($name:ident) => {
168 impl MockResponse for $name {
169 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
170 platform_encode_to_vec(self, BINCODE_CONFIG, sdk.version())
171 .expect(concat!("encode ", stringify!($name)))
172 }
173 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
174 where
175 Self: Sized,
176 {
177 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
178 .expect(concat!("decode ", stringify!($name)))
179 }
180 }
181 };
182}
183
184impl MockResponse for DataContract {
187 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
188 self.serialize_to_bytes_with_platform_version(sdk.version())
189 .expect("encode data")
190 }
191
192 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
193 where
194 Self: Sized,
195 {
196 DataContract::versioned_deserialize(buf, true, sdk.version()).expect("decode data")
197 }
198}
199
200impl MockResponse for (DataContract, Vec<u8>) {
203 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
204 self.1.clone()
205 }
206
207 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
208 where
209 Self: Sized,
210 {
211 (
212 DataContract::versioned_deserialize(buf, true, sdk.version()).expect("decode data"),
213 buf.to_vec(),
214 )
215 }
216}
217
218impl MockResponse for Document {
221 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
222 self.to_cbor().expect("encode data")
223 }
224
225 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
226 where
227 Self: Sized,
228 {
229 Self::from_cbor(buf, None, None, sdk.version()).expect("decode data")
230 }
231}
232
233impl MockResponse for Element {
234 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
235 let config = standard();
237
238 bincode::encode_to_vec(self, config).expect("Failed to serialize Element")
240 }
241
242 fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
243 where
244 Self: Sized,
245 {
246 let config = standard();
248
249 bincode::decode_from_slice(buf, config)
251 .expect("Failed to deserialize Element")
252 .0
253 }
254}
255
256impl MockResponse for drive_proof_verifier::types::IdentityNonceFetcher {
257 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
258 self.0.to_be_bytes().to_vec()
259 }
260
261 fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
262 where
263 Self: Sized,
264 {
265 drive_proof_verifier::types::IdentityNonceFetcher(u64::from_be_bytes(
266 buf.try_into()
267 .expect("identity contract nonce should be should be 8 bytes"),
268 ))
269 }
270}
271
272impl MockResponse for drive_proof_verifier::types::IdentityContractNonceFetcher {
273 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
274 self.0.to_be_bytes().to_vec()
275 }
276
277 fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
278 where
279 Self: Sized,
280 {
281 drive_proof_verifier::types::IdentityContractNonceFetcher(u64::from_be_bytes(
282 buf.try_into()
283 .expect("identity contract nonce should be should be 8 bytes"),
284 ))
285 }
286}
287impl MockResponse for ProTxHash {
288 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
289 let data = self.as_raw_hash().as_byte_array();
290 platform_encode_to_vec(data, BINCODE_CONFIG, sdk.version()).expect("encode ProTxHash")
291 }
292 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
293 where
294 Self: Sized,
295 {
296 let data = platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
297 .expect("decode ProTxHash");
298 ProTxHash::from_raw_hash(CoreHash::from_byte_array(data))
299 }
300}
301
302impl MockResponse for ProposerBlockCounts {
303 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
304 self.0.mock_serialize(sdk)
305 }
306
307 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
308 where
309 Self: Sized,
310 {
311 let data = RetrievedValues::<Identifier, u64>::mock_deserialize(sdk, buf);
312 ProposerBlockCounts(data)
313 }
314}
315
316impl MockResponse for IdentityTokenBalances {
317 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
318 self.0.mock_serialize(sdk)
319 }
320
321 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
322 where
323 Self: Sized,
324 {
325 let map = RetrievedValues::mock_deserialize(sdk, buf);
326 Self(map)
327 }
328}
329
330impl MockResponse for IdentitiesTokenBalances {
331 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
332 self.0.mock_serialize(sdk)
333 }
334
335 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
336 where
337 Self: Sized,
338 {
339 let map = RetrievedValues::mock_deserialize(sdk, buf);
340 Self(map)
341 }
342}
343
344impl MockResponse for IdentityTokenInfos {
345 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
346 let vec: Vec<(Identifier, Option<IdentityTokenInfo>)> =
348 self.0.iter().map(|(k, v)| (*k, v.clone())).collect();
349
350 platform_encode_to_vec(vec, BINCODE_CONFIG, sdk.version())
352 .expect(concat!("encode ", stringify!($name)))
353 }
354
355 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
356 where
357 Self: Sized,
358 {
359 let vec: Vec<(Identifier, Option<IdentityTokenInfo>)> =
361 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
362 .expect(concat!("decode ", stringify!($name)));
363
364 Self(RetrievedValues::from_iter(vec))
365 }
366}
367
368impl MockResponse for IdentitiesTokenInfos {
369 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
370 let vec: Vec<(Identifier, Option<IdentityTokenInfo>)> =
372 self.0.iter().map(|(k, v)| (*k, v.clone())).collect();
373
374 platform_encode_to_vec(vec, BINCODE_CONFIG, sdk.version())
376 .expect(concat!("encode ", stringify!($name)))
377 }
378
379 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
380 where
381 Self: Sized,
382 {
383 let vec: Vec<(Identifier, Option<IdentityTokenInfo>)> =
385 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
386 .expect(concat!("decode ", stringify!($name)));
387
388 Self(RetrievedValues::from_iter(vec))
389 }
390}
391
392impl MockResponse for TokenStatuses {
393 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
394 let vec: Vec<(Identifier, Option<TokenStatus>)> =
396 self.iter().map(|(k, v)| (*k, v.clone())).collect();
397
398 platform_encode_to_vec(vec, BINCODE_CONFIG, sdk.version())
400 .expect(concat!("encode ", stringify!($name)))
401 }
402
403 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
404 where
405 Self: Sized,
406 {
407 let vec: Vec<(Identifier, Option<TokenStatus>)> =
409 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
410 .expect(concat!("decode ", stringify!($name)));
411
412 RetrievedValues::from_iter(vec)
413 }
414}
415
416impl MockResponse for TokenContractInfo {
417 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
418 platform_encode_to_vec(self, BINCODE_CONFIG, sdk.version())
419 .expect("encode TokenContractInfo")
420 }
421
422 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
423 where
424 Self: Sized,
425 {
426 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
427 .expect("decode TokenContractInfo")
428 }
429}
430
431impl MockResponse for TotalSingleTokenBalance {
432 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
433 bincode::encode_to_vec(self, BINCODE_CONFIG).expect("encode vec of data")
434 }
435
436 fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
437 where
438 Self: Sized,
439 {
440 bincode::decode_from_slice(buf, BINCODE_CONFIG)
441 .expect("decode vec of data")
442 .0
443 }
444}
445
446impl MockResponse for GroupActions {
447 fn mock_serialize(&self, sdk: &MockDashPlatformSdk) -> Vec<u8> {
448 let vec: Vec<(Identifier, Option<GroupAction>)> =
450 self.iter().map(|(k, v)| (*k, v.clone())).collect();
451
452 platform_encode_to_vec(vec, BINCODE_CONFIG, sdk.version())
454 .expect(concat!("encode ", stringify!($name)))
455 }
456
457 fn mock_deserialize(sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
458 where
459 Self: Sized,
460 {
461 let vec: Vec<(Identifier, Option<GroupAction>)> =
463 platform_versioned_decode_from_slice(buf, BINCODE_CONFIG, sdk.version())
464 .expect(concat!("decode ", stringify!($name)));
465
466 RetrievedValues::from_iter(vec)
467 }
468}
469
470impl MockResponse for IdentitiesContractKeys {
471 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
472 bincode::encode_to_vec(self, BINCODE_CONFIG).expect("encode IdentitiesContractKeys")
473 }
474
475 fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self
476 where
477 Self: Sized,
478 {
479 bincode::decode_from_slice(buf, BINCODE_CONFIG)
480 .expect("decode IdentitiesContractKeys")
481 .0
482 }
483}
484
485impl_mock_response!(Identity);
486impl_mock_response!(IdentityPublicKey);
487impl_mock_response!(Identifier);
488impl_mock_response!(MasternodeProtocolVote);
489impl_mock_response!(ResourceVote);
490impl_mock_response!(u8);
491impl_mock_response!(u16);
492impl_mock_response!(u32);
493impl_mock_response!(u64);
494impl_mock_response!(Vote);
495impl_mock_response!(ExtendedEpochInfo);
496impl_mock_response!(FinalizedEpochInfo);
497impl_mock_response!(ContestedResources);
498impl_mock_response!(IdentityBalanceAndRevision);
499impl_mock_response!(Contenders);
500impl_mock_response!(Voters);
501impl_mock_response!(VotePollsGroupedByTimestamp);
502impl_mock_response!(PrefundedSpecializedBalance);
503impl_mock_response!(TotalCreditsInPlatform);
504impl_mock_response!(ElementFetchRequestItem);
505impl_mock_response!(EvoNodeStatus);
506impl_mock_response!(CurrentQuorumsInfo);
507impl_mock_response!(Group);
508impl_mock_response!(TokenPricingSchedule);
509impl_mock_response!(RewardDistributionMoment);
510impl_mock_response!(TokenPreProgrammedDistributions);
511impl_mock_response!(PlatformAddress);
512impl_mock_response!(AddressInfo);
513impl_mock_response!(RecentAddressBalanceChanges);
514impl_mock_response!(RecentCompactedAddressBalanceChanges);
515impl_mock_response!(ShieldedPoolState);
516impl_mock_response!(ShieldedAnchors);
517impl_mock_response!(MostRecentShieldedAnchor);
518impl_mock_response!(ShieldedEncryptedNotes);
519impl_mock_response!(ShieldedEncryptedNote);
520impl_mock_response!(ShieldedNullifierStatuses);
521impl_mock_response!(ShieldedNullifierStatus);
522impl_mock_response!(RecentNullifierChanges);
523impl_mock_response!(RecentCompactedNullifierChanges);
524
525impl MockResponse for GroveTrunkQueryResult {
528 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
529 unimplemented!("GroveTrunkQueryResult does not support mock serialization - the Tree type is not serializable")
530 }
531
532 fn mock_deserialize(_sdk: &MockDashPlatformSdk, _buf: &[u8]) -> Self
533 where
534 Self: Sized,
535 {
536 unimplemented!("GroveTrunkQueryResult does not support mock deserialization - the Tree type is not serializable")
537 }
538}
539
540impl MockResponse for PlatformAddressTrunkState {
543 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
544 unimplemented!("PlatformAddressTrunkState does not support mock serialization - the Tree type is not serializable")
545 }
546
547 fn mock_deserialize(_sdk: &MockDashPlatformSdk, _buf: &[u8]) -> Self
548 where
549 Self: Sized,
550 {
551 unimplemented!("PlatformAddressTrunkState does not support mock deserialization - the Tree type is not serializable")
552 }
553}
554
555impl MockResponse for NullifiersTrunkState {
558 fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec<u8> {
559 unimplemented!("NullifiersTrunkState does not support mock serialization - the Tree type is not serializable")
560 }
561
562 fn mock_deserialize(_sdk: &MockDashPlatformSdk, _buf: &[u8]) -> Self
563 where
564 Self: Sized,
565 {
566 unimplemented!("NullifiersTrunkState does not support mock deserialization - the Tree type is not serializable")
567 }
568}