dpp/state_transition/state_transitions/document/batch_transition/
mod.rs1use bincode::{Decode, Encode};
2
3use std::convert::TryInto;
4
5use derive_more::From;
6
7use platform_value::Value;
8#[cfg(feature = "serde-conversion")]
9use serde::{Deserialize, Serialize};
10
11use crate::ProtocolError;
12use crate::{identity::SecurityLevel, state_transition::StateTransitionFieldTypes};
13
14pub use self::batched_transition::{
15 document_base_transition, document_create_transition,
16 document_create_transition::DocumentCreateTransition, document_delete_transition,
17 document_delete_transition::DocumentDeleteTransition, document_index_only_delete_transition,
18 document_index_only_delete_transition::DocumentIndexOnlyDeleteTransition,
19 document_replace_transition, document_replace_transition::DocumentReplaceTransition,
20 token_base_transition, token_burn_transition, token_burn_transition::TokenBurnTransition,
21 token_claim_transition, token_claim_transition::TokenClaimTransition,
22 token_config_update_transition, token_config_update_transition::TokenConfigUpdateTransition,
23 token_destroy_frozen_funds_transition,
24 token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransition,
25 token_direct_purchase_transition,
26 token_direct_purchase_transition::TokenDirectPurchaseTransition,
27 token_emergency_action_transition,
28 token_emergency_action_transition::TokenEmergencyActionTransition, token_freeze_transition,
29 token_freeze_transition::TokenFreezeTransition, token_mint_transition,
30 token_mint_transition::TokenMintTransition, token_set_price_for_direct_purchase_transition,
31 token_set_price_for_direct_purchase_transition::TokenSetPriceForDirectPurchaseTransition,
32 token_transfer_transition, token_transfer_transition::TokenTransferTransition,
33 token_unfreeze_transition, token_unfreeze_transition::TokenUnfreezeTransition,
34};
35
36use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable};
37use platform_versioning::PlatformVersioned;
38
39pub mod accessors;
40pub mod batched_transition;
41pub mod fields;
42mod identity_signed;
43pub mod methods;
44pub mod resolvers;
45mod state_transition_estimated_fee_validation;
46mod state_transition_like;
47mod v0;
48mod v1;
49#[cfg(feature = "validation")]
50mod validation;
51mod version;
52
53use crate::state_transition::data_contract_update_transition::{
54 SIGNATURE, SIGNATURE_PUBLIC_KEY_ID,
55};
56
57use crate::state_transition::batch_transition::fields::property_names;
58
59use crate::identity::state_transition::OptionallyAssetLockProved;
60pub use v0::*;
61pub use v1::*;
62
63#[derive(
64 Debug,
65 Clone,
66 PartialEq,
67 Encode,
68 Decode,
69 PlatformDeserialize,
70 PlatformSerialize,
71 PlatformSignable,
72 PlatformVersioned,
73 From,
74)]
75#[cfg_attr(
76 feature = "serde-conversion",
77 derive(Serialize, Deserialize),
78 serde(tag = "$formatVersion")
79)]
80#[platform_serialize(unversioned)] #[platform_version_path_bounds(
82 "dpp.state_transition_serialization_versions.batch_state_transition"
83)]
84pub enum BatchTransition {
85 #[cfg_attr(feature = "serde-conversion", serde(rename = "0"))]
86 V0(BatchTransitionV0),
87 #[cfg_attr(feature = "serde-conversion", serde(rename = "1"))]
88 V1(BatchTransitionV1),
89}
90
91#[cfg(all(feature = "json-conversion", feature = "serde-conversion"))]
92impl crate::serialization::JsonConvertible for BatchTransition {}
93
94#[cfg(all(feature = "value-conversion", feature = "serde-conversion"))]
95impl crate::serialization::ValueConvertible for BatchTransition {}
96
97impl StateTransitionFieldTypes for BatchTransition {
98 fn binary_property_paths() -> Vec<&'static str> {
99 vec![SIGNATURE]
100 }
101
102 fn identifiers_property_paths() -> Vec<&'static str> {
103 vec![property_names::OWNER_ID]
104 }
105
106 fn signature_property_paths() -> Vec<&'static str> {
107 vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID]
108 }
109}
110
111#[cfg(all(
112 test,
113 feature = "json-conversion",
114 feature = "value-conversion",
115 feature = "serde-conversion"
116))]
117pub(crate) mod json_convertible_tests {
118 use super::*;
119 use platform_value::{platform_value, BinaryData, Identifier};
120 use serde_json::json;
121
122 pub(crate) fn fixture() -> BatchTransition {
123 BatchTransition::V0(BatchTransitionV0 {
124 owner_id: Identifier::new([0xc0; 32]),
125 transitions: vec![], user_fee_increase: 23,
127 signature_public_key_id: 4,
128 signature: BinaryData::new(vec![0xd0; 65]),
129 })
130 }
131
132 #[test]
133 fn json_round_trip_with_full_wire_shape() {
134 use crate::serialization::JsonConvertible;
135 let original = fixture();
136 let json = original.to_json().expect("to_json");
137 assert_eq!(
143 json,
144 json!({
145 "$formatVersion": "0",
146 "ownerId": "DyRkUpQxYG2VnP2SkMdQs5BTsVPeKCpSHLxzByc2Sxvj",
147 "transitions": [],
148 "userFeeIncrease": 23,
149 "signaturePublicKeyId": 4,
150 "signature": "0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NA=",
151 })
152 );
153 let recovered = BatchTransition::from_json(json).expect("from_json");
154 assert_eq!(original, recovered);
155 }
156
157 #[test]
158 fn value_round_trip_with_full_wire_shape() {
159 use crate::serialization::ValueConvertible;
160 use platform_value::Value;
161 let original = fixture();
162 let value = original.to_object().expect("to_object");
163 let owner_id = Identifier::new([0xc0; 32]);
164 assert_eq!(
168 value,
169 platform_value!({
170 "$formatVersion": "0",
171 "ownerId": owner_id,
172 "transitions": Value::Array(vec![]),
173 "userFeeIncrease": 23u16,
174 "signaturePublicKeyId": 4u32,
175 "signature": Value::Bytes(vec![0xd0; 65]),
176 })
177 );
178 let recovered = BatchTransition::from_object(value).expect("from_object");
179 assert_eq!(original, recovered);
180 }
181}
182
183pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> SecurityLevel {
185 let maybe_security_level: Option<u64> = v
186 .get_optional_integer(property_names::SECURITY_LEVEL_REQUIREMENT)
187 .expect("document schema must be a map");
189
190 match maybe_security_level {
191 Some(some_level) => (some_level as u8).try_into().unwrap_or(default),
192 None => default,
193 }
194}
195
196impl OptionallyAssetLockProved for BatchTransition {}
197
198#[cfg(test)]
199mod tests;