drive/state_transition_action/identity/identity_create/
mod.rs1pub mod transformer;
3pub mod v0;
5
6use crate::state_transition_action::identity::identity_create::v0::{
7 IdentityCreateTransitionActionV0, IdentityFromIdentityCreateTransitionActionV0,
8};
9use derive_more::From;
10use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue;
11use dpp::identity::{Identity, IdentityPublicKey, PartialIdentity};
12use dpp::platform_value::{Bytes36, Identifier};
13use dpp::prelude::UserFeeIncrease;
14use dpp::version::PlatformVersion;
15use dpp::ProtocolError;
16
17#[derive(Debug, Clone, From)]
19pub enum IdentityCreateTransitionAction {
20 V0(IdentityCreateTransitionActionV0),
22}
23
24impl IdentityCreateTransitionAction {
26 pub fn public_keys(&self) -> &Vec<IdentityPublicKey> {
28 match self {
29 IdentityCreateTransitionAction::V0(transition) => &transition.public_keys,
30 }
31 }
32
33 pub fn asset_lock_value_to_be_consumed(&self) -> &AssetLockValue {
36 match self {
37 IdentityCreateTransitionAction::V0(transition) => {
38 &transition.asset_lock_value_to_be_consumed
39 }
40 }
41 }
42
43 pub fn asset_lock_value_to_be_consumed_owned(self) -> AssetLockValue {
46 match self {
47 IdentityCreateTransitionAction::V0(transition) => {
48 transition.asset_lock_value_to_be_consumed
49 }
50 }
51 }
52
53 pub fn identity_id(&self) -> Identifier {
55 match self {
56 IdentityCreateTransitionAction::V0(transition) => transition.identity_id,
57 }
58 }
59
60 pub fn asset_lock_outpoint(&self) -> Bytes36 {
62 match self {
63 IdentityCreateTransitionAction::V0(action) => action.asset_lock_outpoint,
64 }
65 }
66
67 pub fn user_fee_increase(&self) -> UserFeeIncrease {
69 match self {
70 IdentityCreateTransitionAction::V0(transition) => transition.user_fee_increase,
71 }
72 }
73}
74
75impl From<IdentityCreateTransitionAction> for PartialIdentity {
76 fn from(value: IdentityCreateTransitionAction) -> Self {
77 match value {
78 IdentityCreateTransitionAction::V0(v0) => v0.into(),
79 }
80 }
81}
82
83impl From<&IdentityCreateTransitionAction> for PartialIdentity {
84 fn from(value: &IdentityCreateTransitionAction) -> Self {
85 match value {
86 IdentityCreateTransitionAction::V0(v0) => v0.into(),
87 }
88 }
89}
90
91pub trait IdentityFromIdentityCreateTransitionAction {
93 fn try_from_identity_create_transition_action_returning_asset_lock_value(
95 value: IdentityCreateTransitionAction,
96 platform_version: &PlatformVersion,
97 ) -> Result<(Self, AssetLockValue), ProtocolError>
98 where
99 Self: Sized;
100 fn try_from_borrowed_identity_create_transition_action(
102 value: &IdentityCreateTransitionAction,
103 platform_version: &PlatformVersion,
104 ) -> Result<Self, ProtocolError>
105 where
106 Self: Sized;
107}
108
109impl IdentityFromIdentityCreateTransitionAction for Identity {
110 fn try_from_identity_create_transition_action_returning_asset_lock_value(
111 value: IdentityCreateTransitionAction,
112 platform_version: &PlatformVersion,
113 ) -> Result<(Self, AssetLockValue), ProtocolError> {
114 match value {
115 IdentityCreateTransitionAction::V0(v0) => {
116 Identity::try_from_identity_create_transition_action_returning_asset_lock_value_v0(
117 v0,
118 platform_version,
119 )
120 }
121 }
122 }
123
124 fn try_from_borrowed_identity_create_transition_action(
125 value: &IdentityCreateTransitionAction,
126 platform_version: &PlatformVersion,
127 ) -> Result<Self, ProtocolError> {
128 match value {
129 IdentityCreateTransitionAction::V0(v0) => {
130 Identity::try_from_borrowed_identity_create_transition_action_v0(
131 v0,
132 platform_version,
133 )
134 }
135 }
136 }
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142 use crate::state_transition_action::identity::identity_create::v0::IdentityCreateTransitionActionV0;
143 use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0};
144 use dpp::identity::accessors::IdentityGettersV0;
145 use dpp::identity::IdentityPublicKey;
146 use dpp::platform_value::{Bytes32, Bytes36};
147 use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher;
148 use dpp::version::PlatformVersion;
149
150 fn make_asset_lock_value() -> AssetLockValue {
151 let platform_version = PlatformVersion::latest();
152 AssetLockValue::new(1000, vec![1, 2, 3], 500, vec![], platform_version)
153 .expect("expected asset lock value")
154 }
155
156 fn make_v0() -> IdentityCreateTransitionActionV0 {
157 let platform_version = PlatformVersion::latest();
158 let (key, _private) =
159 IdentityPublicKey::random_masternode_transfer_key(1, Some(42), platform_version)
160 .expect("expected a random key");
161 IdentityCreateTransitionActionV0 {
162 signable_bytes_hasher: SignableBytesHasher::PreHashed(Bytes32([0xCC; 32])),
163 public_keys: vec![key],
164 asset_lock_value_to_be_consumed: make_asset_lock_value(),
165 identity_id: Identifier::from([0xAA; 32]),
166 asset_lock_outpoint: Bytes36([0xDD; 36]),
167 user_fee_increase: 5,
168 }
169 }
170
171 #[test]
172 fn test_from_v0() {
173 let v0 = make_v0();
174 let action: IdentityCreateTransitionAction = v0.into();
175 assert!(matches!(action, IdentityCreateTransitionAction::V0(_)));
176 }
177
178 #[test]
179 fn test_public_keys() {
180 let action = IdentityCreateTransitionAction::V0(make_v0());
181 assert_eq!(action.public_keys().len(), 1);
182 }
183
184 #[test]
185 fn test_asset_lock_value_to_be_consumed() {
186 let action = IdentityCreateTransitionAction::V0(make_v0());
187 let alv = action.asset_lock_value_to_be_consumed();
188 assert_eq!(alv.remaining_credit_value(), 500);
189 assert_eq!(alv.initial_credit_value(), 1000);
190 }
191
192 #[test]
193 fn test_asset_lock_value_to_be_consumed_owned() {
194 let action = IdentityCreateTransitionAction::V0(make_v0());
195 let alv = action.asset_lock_value_to_be_consumed_owned();
196 assert_eq!(alv.remaining_credit_value(), 500);
197 }
198
199 #[test]
200 fn test_identity_id() {
201 let action = IdentityCreateTransitionAction::V0(make_v0());
202 assert_eq!(action.identity_id(), Identifier::from([0xAA; 32]));
203 }
204
205 #[test]
206 fn test_asset_lock_outpoint() {
207 let action = IdentityCreateTransitionAction::V0(make_v0());
208 assert_eq!(action.asset_lock_outpoint(), Bytes36([0xDD; 36]));
209 }
210
211 #[test]
212 fn test_user_fee_increase() {
213 let action = IdentityCreateTransitionAction::V0(make_v0());
214 assert_eq!(action.user_fee_increase(), 5);
215 }
216
217 #[test]
218 fn test_into_partial_identity_owned() {
219 let action = IdentityCreateTransitionAction::V0(make_v0());
220 let partial: PartialIdentity = action.into();
221 assert_eq!(partial.id, Identifier::from([0xAA; 32]));
222 assert_eq!(partial.balance, Some(500));
223 assert!(partial.revision.is_none());
224 }
225
226 #[test]
227 fn test_into_partial_identity_borrowed() {
228 let action = IdentityCreateTransitionAction::V0(make_v0());
229 let partial: PartialIdentity = (&action).into();
230 assert_eq!(partial.id, Identifier::from([0xAA; 32]));
231 assert_eq!(partial.balance, Some(500));
232 }
233
234 #[test]
235 fn test_try_from_identity_create_transition_action_returning_asset_lock_value() {
236 let platform_version = PlatformVersion::latest();
237 let action = IdentityCreateTransitionAction::V0(make_v0());
238 let (identity, alv) =
239 Identity::try_from_identity_create_transition_action_returning_asset_lock_value(
240 action,
241 platform_version,
242 )
243 .expect("expected identity");
244 assert_eq!(identity.id(), Identifier::from([0xAA; 32]));
245 assert_eq!(alv.remaining_credit_value(), 500);
246 }
247
248 #[test]
249 fn test_try_from_borrowed_identity_create_transition_action() {
250 let platform_version = PlatformVersion::latest();
251 let action = IdentityCreateTransitionAction::V0(make_v0());
252 let identity = Identity::try_from_borrowed_identity_create_transition_action(
253 &action,
254 platform_version,
255 )
256 .expect("expected identity");
257 assert_eq!(identity.id(), Identifier::from([0xAA; 32]));
258 }
259}