@dashevo/wasm-dpp 0.25.0-dev.15 → 0.25.0-dev.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/Cargo.toml +5 -1
  2. package/dist/wasm/wasm_dpp.d.ts +1319 -1058
  3. package/dist/wasm/wasm_dpp.js +227 -116
  4. package/dist/wasm/wasm_dpp_bg.js +1 -1
  5. package/lib/test/fixtures/getDataContractFixture.js +9 -1
  6. package/lib/test/fixtures/getIdentityCreditTransferTransitionFixture.js +19 -0
  7. package/lib/wasm/wasm_dpp.d.ts +1319 -1058
  8. package/package.json +4 -4
  9. package/scripts/build-wasm.sh +6 -9
  10. package/src/data_contract/data_contract.rs +12 -0
  11. package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +18 -1
  12. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +18 -1
  13. package/src/data_contract_factory/data_contract_factory.rs +11 -2
  14. package/src/errors/consensus/consensus_error.rs +10 -1
  15. package/src/errors/consensus/state/data_contract/data_contract_config_update_error.rs +53 -0
  16. package/src/errors/consensus/state/data_contract/data_contract_is_readonly_error.rs +53 -0
  17. package/src/errors/consensus/state/data_contract/mod.rs +4 -0
  18. package/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs +1 -1
  19. package/src/identity/identity_facade.rs +20 -2
  20. package/src/identity/identity_factory.rs +20 -2
  21. package/src/identity/state_transition/identity_credit_transfer_transition/apply_identity_credit_transfer_transition.rs +31 -0
  22. package/src/identity/state_transition/identity_credit_transfer_transition/identity_credit_transfer_transition_basic_validator.rs +66 -0
  23. package/src/identity/state_transition/identity_credit_transfer_transition/identity_credit_transfer_transition_state_validator.rs +44 -0
  24. package/src/identity/state_transition/identity_credit_transfer_transition/mod.rs +8 -0
  25. package/src/identity/state_transition/identity_credit_transfer_transition/to_object.rs +52 -0
  26. package/src/identity/state_transition/identity_credit_transfer_transition/transition.rs +311 -0
  27. package/src/identity/state_transition/mod.rs +2 -0
  28. package/src/identity/state_transition/transition_types.rs +4 -0
  29. package/src/state_transition/conversion.rs +11 -1
  30. package/src/state_transition/state_transition_facade.rs +1 -1
  31. package/src/state_transition/state_transition_factory.rs +10 -1
  32. package/src/state_transition/validation/validate_state_transition_identity_signature.rs +5 -0
  33. package/test/unit/dataContract/DataContract.spec.js +18 -0
  34. package/test/unit/dataContract/DataContractFactory.spec.js +20 -0
  35. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +10 -0
  36. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +10 -0
  37. package/test/unit/identity/stateTransition/identityCreditTransferTransition/identityCreditTransferTransition.spec.js +139 -0
@@ -0,0 +1,311 @@
1
+ use crate::utils::{ToSerdeJSONExt, WithJsError};
2
+
3
+ use std::convert::TryInto;
4
+ use std::default::Default;
5
+
6
+ use wasm_bindgen::prelude::*;
7
+
8
+ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter};
9
+ use crate::identifier::IdentifierWrapper;
10
+ use crate::{buffer::Buffer, errors::RustConversionError, with_js_error, IdentityPublicKeyWasm};
11
+ use dpp::identifier::Identifier;
12
+ use dpp::identity::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition;
13
+ use dpp::identity::KeyType;
14
+ use dpp::platform_value::string_encoding::Encoding;
15
+ use dpp::platform_value::{string_encoding, BinaryData};
16
+ use dpp::serialization_traits::PlatformSerializable;
17
+ use dpp::state_transition::StateTransitionLike;
18
+ use dpp::state_transition::{StateTransition, StateTransitionIdentitySigned};
19
+
20
+ #[wasm_bindgen(js_name=IdentityCreditTransferTransition)]
21
+ #[derive(Clone)]
22
+ pub struct IdentityCreditTransferTransitionWasm(IdentityCreditTransferTransition);
23
+
24
+ impl From<IdentityCreditTransferTransition> for IdentityCreditTransferTransitionWasm {
25
+ fn from(v: IdentityCreditTransferTransition) -> Self {
26
+ IdentityCreditTransferTransitionWasm(v)
27
+ }
28
+ }
29
+
30
+ impl From<IdentityCreditTransferTransitionWasm> for IdentityCreditTransferTransition {
31
+ fn from(v: IdentityCreditTransferTransitionWasm) -> Self {
32
+ v.0
33
+ }
34
+ }
35
+
36
+ #[wasm_bindgen(js_class = IdentityCreditTransferTransition)]
37
+ impl IdentityCreditTransferTransitionWasm {
38
+ #[wasm_bindgen(constructor)]
39
+ pub fn new(raw_parameters: JsValue) -> Result<IdentityCreditTransferTransitionWasm, JsValue> {
40
+ let raw_state_transition = raw_parameters.with_serde_to_platform_value()?;
41
+
42
+ let identity_credit_transfer_transition =
43
+ IdentityCreditTransferTransition::from_raw_object(raw_state_transition)
44
+ .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?;
45
+
46
+ Ok(identity_credit_transfer_transition.into())
47
+ }
48
+
49
+ #[wasm_bindgen(js_name=getType)]
50
+ pub fn get_type(&self) -> u8 {
51
+ IdentityCreditTransferTransition::get_type() as u8
52
+ }
53
+
54
+ #[wasm_bindgen(getter, js_name=identityId)]
55
+ pub fn identity_id(&self) -> IdentifierWrapper {
56
+ self.get_identity_id()
57
+ }
58
+
59
+ #[wasm_bindgen(getter, js_name=recipientId)]
60
+ pub fn recipient_id(&self) -> IdentifierWrapper {
61
+ self.get_recipient_id()
62
+ }
63
+
64
+ #[wasm_bindgen(getter, js_name=amount)]
65
+ pub fn amount(&self) -> u64 {
66
+ self.0.get_amount()
67
+ }
68
+
69
+ #[wasm_bindgen(js_name=getIdentityId)]
70
+ pub fn get_identity_id(&self) -> IdentifierWrapper {
71
+ (*self.0.get_identity_id()).into()
72
+ }
73
+
74
+ #[wasm_bindgen(js_name=getRecipientId)]
75
+ pub fn get_recipient_id(&self) -> IdentifierWrapper {
76
+ (*self.0.get_recipient_id()).into()
77
+ }
78
+
79
+ #[wasm_bindgen(js_name=getAmount)]
80
+ pub fn get_amount(&self) -> f64 {
81
+ self.0.get_amount() as f64
82
+ }
83
+
84
+ #[wasm_bindgen(js_name=setAmount)]
85
+ pub fn set_amount(&mut self, amount: f64) {
86
+ self.0.set_amount(amount as u64);
87
+ }
88
+
89
+ #[wasm_bindgen(js_name=toObject)]
90
+ pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> {
91
+ let opts: super::to_object::ToObjectOptions = if options.is_object() {
92
+ with_js_error!(serde_wasm_bindgen::from_value(options))?
93
+ } else {
94
+ Default::default()
95
+ };
96
+
97
+ let object = super::to_object::to_object_struct(&self.0, opts);
98
+ let js_object = js_sys::Object::new();
99
+
100
+ js_sys::Reflect::set(
101
+ &js_object,
102
+ &"type".to_owned().into(),
103
+ &object.transition_type.into(),
104
+ )?;
105
+
106
+ js_sys::Reflect::set(
107
+ &js_object,
108
+ &"protocolVersion".to_owned().into(),
109
+ &object.protocol_version.into(),
110
+ )?;
111
+
112
+ if let Some(signature) = object.signature {
113
+ let signature_value: JsValue = if signature.is_empty() {
114
+ JsValue::undefined()
115
+ } else {
116
+ Buffer::from_bytes(signature.as_slice()).into()
117
+ };
118
+
119
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
120
+
121
+ if let Some(signature_public_key_id) = object.signature_public_key_id {
122
+ js_sys::Reflect::set(
123
+ &js_object,
124
+ &"signaturePublicKeyId".to_owned().into(),
125
+ &JsValue::from(signature_public_key_id),
126
+ )?;
127
+ } else {
128
+ js_sys::Reflect::set(
129
+ &js_object,
130
+ &"signaturePublicKeyId".to_owned().into(),
131
+ &JsValue::undefined(),
132
+ )?;
133
+ }
134
+ }
135
+
136
+ js_sys::Reflect::set(
137
+ &js_object,
138
+ &"identityId".to_owned().into(),
139
+ &Buffer::from_bytes(object.identity_id.to_buffer().as_slice()),
140
+ )?;
141
+
142
+ js_sys::Reflect::set(
143
+ &js_object,
144
+ &"recipientId".to_owned().into(),
145
+ &Buffer::from_bytes(object.recipient_id.to_buffer().as_slice()),
146
+ )?;
147
+
148
+ js_sys::Reflect::set(
149
+ &js_object,
150
+ &"amount".to_owned().into(),
151
+ &JsValue::from_f64(object.amount as f64),
152
+ )?;
153
+
154
+ Ok(js_object.into())
155
+ }
156
+
157
+ #[wasm_bindgen(js_name=toBuffer)]
158
+ pub fn to_buffer(&self) -> Result<Buffer, JsValue> {
159
+ let bytes = PlatformSerializable::serialize(&StateTransition::IdentityCreditTransfer(
160
+ self.0.clone(),
161
+ ))
162
+ .with_js_error()?;
163
+ Ok(Buffer::from_bytes(&bytes))
164
+ }
165
+
166
+ #[wasm_bindgen(js_name=toJSON)]
167
+ pub fn to_json(&self) -> Result<JsValue, JsValue> {
168
+ let object = super::to_object::to_object_struct(&self.0, Default::default());
169
+ let js_object = js_sys::Object::new();
170
+
171
+ js_sys::Reflect::set(
172
+ &js_object,
173
+ &"type".to_owned().into(),
174
+ &object.transition_type.into(),
175
+ )?;
176
+
177
+ js_sys::Reflect::set(
178
+ &js_object,
179
+ &"protocolVersion".to_owned().into(),
180
+ &object.protocol_version.into(),
181
+ )?;
182
+
183
+ if let Some(signature) = object.signature {
184
+ let signature_value: JsValue = if signature.is_empty() {
185
+ JsValue::undefined()
186
+ } else {
187
+ string_encoding::encode(signature.as_slice(), Encoding::Base64).into()
188
+ };
189
+
190
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
191
+
192
+ if let Some(signature_public_key_id) = object.signature_public_key_id {
193
+ js_sys::Reflect::set(
194
+ &js_object,
195
+ &"signaturePublicKeyId".to_owned().into(),
196
+ &signature_public_key_id.into(),
197
+ )?;
198
+ } else {
199
+ js_sys::Reflect::set(
200
+ &js_object,
201
+ &"signaturePublicKeyId".to_owned().into(),
202
+ &JsValue::undefined(),
203
+ )?;
204
+ }
205
+ }
206
+
207
+ let identity_id = object.identity_id.to_string(Encoding::Base58);
208
+
209
+ js_sys::Reflect::set(
210
+ &js_object,
211
+ &"identityId".to_owned().into(),
212
+ &identity_id.into(),
213
+ )?;
214
+
215
+ let recipient_id = object.recipient_id.to_string(Encoding::Base58);
216
+
217
+ js_sys::Reflect::set(
218
+ &js_object,
219
+ &"recipientId".to_owned().into(),
220
+ &recipient_id.into(),
221
+ )?;
222
+
223
+ js_sys::Reflect::set(
224
+ &js_object,
225
+ &"amount".to_owned().into(),
226
+ &JsValue::from_f64(object.amount as f64),
227
+ )?;
228
+
229
+ Ok(js_object.into())
230
+ }
231
+
232
+ #[wasm_bindgen(js_name=getModifiedDataIds)]
233
+ pub fn get_modified_data_ids(&self) -> Vec<JsValue> {
234
+ let ids = self.0.get_modified_data_ids();
235
+
236
+ ids.into_iter()
237
+ .map(|id| <IdentifierWrapper as std::convert::From<Identifier>>::from(id).into())
238
+ .collect()
239
+ }
240
+
241
+ #[wasm_bindgen(js_name=isDataContractStateTransition)]
242
+ pub fn is_data_contract_state_transition(&self) -> bool {
243
+ self.0.is_data_contract_state_transition()
244
+ }
245
+
246
+ #[wasm_bindgen(js_name=isDocumentStateTransition)]
247
+ pub fn is_document_state_transition(&self) -> bool {
248
+ self.0.is_document_state_transition()
249
+ }
250
+
251
+ #[wasm_bindgen(js_name=isIdentityStateTransition)]
252
+ pub fn is_identity_state_transition(&self) -> bool {
253
+ self.0.is_identity_state_transition()
254
+ }
255
+
256
+ #[wasm_bindgen(js_name=signByPrivateKey)]
257
+ pub fn sign_by_private_key(
258
+ &mut self,
259
+ private_key: Vec<u8>,
260
+ key_type: u8,
261
+ bls: Option<JsBlsAdapter>,
262
+ ) -> Result<(), JsValue> {
263
+ let key_type = key_type
264
+ .try_into()
265
+ .map_err(|e: anyhow::Error| e.to_string())?;
266
+
267
+ if bls.is_none() && key_type == KeyType::BLS12_381 {
268
+ return Err(JsError::new(
269
+ format!("BLS adapter is required for BLS key type '{}'", key_type).as_str(),
270
+ )
271
+ .into());
272
+ }
273
+
274
+ let bls_adapter = if let Some(adapter) = bls {
275
+ BlsAdapter(adapter)
276
+ } else {
277
+ BlsAdapter(JsValue::undefined().into())
278
+ };
279
+
280
+ self.0
281
+ .sign_by_private_key(private_key.as_slice(), key_type, &bls_adapter)
282
+ .with_js_error()
283
+ }
284
+
285
+ #[wasm_bindgen(js_name=getSignature)]
286
+ pub fn get_signature(&self) -> Buffer {
287
+ Buffer::from_bytes(self.0.get_signature().as_slice())
288
+ }
289
+
290
+ #[wasm_bindgen(js_name=setSignature)]
291
+ pub fn set_signature(&mut self, signature: Option<Vec<u8>>) {
292
+ self.0.signature = BinaryData::new(signature.unwrap_or(vec![]))
293
+ }
294
+
295
+ #[wasm_bindgen]
296
+ pub fn sign(
297
+ &mut self,
298
+ identity_public_key: &IdentityPublicKeyWasm,
299
+ private_key: Vec<u8>,
300
+ bls: JsBlsAdapter,
301
+ ) -> Result<(), JsValue> {
302
+ let bls_adapter = BlsAdapter(bls);
303
+ self.0
304
+ .sign(
305
+ &identity_public_key.to_owned().into(),
306
+ &private_key,
307
+ &bls_adapter,
308
+ )
309
+ .with_js_error()
310
+ }
311
+ }
@@ -1,11 +1,13 @@
1
1
  pub use asset_lock_proof::*;
2
2
  pub use identity_create_transition::*;
3
+ pub use identity_credit_transfer_transition::*;
3
4
  pub use identity_topup_transition::*;
4
5
  pub use identity_update_transition::*;
5
6
  pub use validate_public_key_signatures::*;
6
7
 
7
8
  mod asset_lock_proof;
8
9
  mod identity_create_transition;
10
+ mod identity_credit_transfer_transition;
9
11
  pub(crate) mod identity_public_key_transitions;
10
12
  mod identity_topup_transition;
11
13
  mod identity_update_transition;
@@ -11,6 +11,7 @@ pub enum StateTransitionTypeWasm {
11
11
  DataContractUpdate = 4,
12
12
  IdentityUpdate = 5,
13
13
  IdentityCreditWithdrawal = 6,
14
+ IdentityCreditTransfer = 7,
14
15
  }
15
16
 
16
17
  impl From<StateTransitionType> for StateTransitionTypeWasm {
@@ -25,6 +26,9 @@ impl From<StateTransitionType> for StateTransitionTypeWasm {
25
26
  StateTransitionType::IdentityCreditWithdrawal => {
26
27
  StateTransitionTypeWasm::IdentityCreditWithdrawal
27
28
  }
29
+ StateTransitionType::IdentityCreditTransfer => {
30
+ StateTransitionTypeWasm::IdentityCreditTransfer
31
+ }
28
32
  }
29
33
  }
30
34
  }
@@ -2,7 +2,8 @@ use crate::errors::consensus::consensus_error::from_consensus_error;
2
2
  use crate::utils::generic_of_js_val;
3
3
  use crate::{
4
4
  DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm,
5
- DocumentsBatchTransitionWasm, IdentityCreateTransitionWasm, IdentityTopUpTransitionWasm,
5
+ DocumentsBatchTransitionWasm, IdentityCreateTransitionWasm,
6
+ IdentityCreditTransferTransitionWasm, IdentityTopUpTransitionWasm,
6
7
  IdentityUpdateTransitionWasm, PreCalculatedOperationWasm, ReadOperationWasm,
7
8
  SignatureVerificationOperationWasm,
8
9
  };
@@ -127,6 +128,15 @@ pub fn create_state_transition_from_wasm_instance(
127
128
 
128
129
  Ok(StateTransition::IdentityUpdate(st.clone().into()))
129
130
  }
131
+ StateTransitionType::IdentityCreditTransfer => {
132
+ let st: Ref<IdentityCreditTransferTransitionWasm> =
133
+ generic_of_js_val::<IdentityCreditTransferTransitionWasm>(
134
+ js_value,
135
+ "IdentityCreditTransferTransition",
136
+ )?;
137
+
138
+ Ok(StateTransition::IdentityCreditTransfer(st.clone().into()))
139
+ }
130
140
  _ => Err(JsError::new("Unsupported state transition type").into()),
131
141
  }
132
142
  }
@@ -69,7 +69,7 @@ impl StateTransitionFacadeWasm {
69
69
  .map_err(PlatformValueErrorWasm::from)?
70
70
  .try_into()
71
71
  .map_err(|e: TryFromPrimitiveError<StateTransitionType>| {
72
- InvalidStateTransitionTypeErrorWasm::new(e.number as u8)
72
+ InvalidStateTransitionTypeErrorWasm::new(e.number)
73
73
  })?;
74
74
 
75
75
  if state_transition_type == StateTransitionType::DataContractUpdate {
@@ -8,6 +8,7 @@ use dpp::{state_transition::{
8
8
  StateTransitionFactory, StateTransitionFactoryOptions, StateTransition, errors::StateTransitionError,
9
9
  }, version::ProtocolVersionValidator, data_contract::state_transition::{data_contract_create_transition::validation::state::validate_data_contract_create_transition_basic::DataContractCreateTransitionBasicValidator, data_contract_update_transition::validation::basic::DataContractUpdateTransitionBasicValidator}, identity::{state_transition::{identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator, validate_public_key_signatures::{PublicKeysSignaturesValidator}, asset_lock_proof::{AssetLockProofValidator, ChainAssetLockProofStructureValidator, InstantAssetLockProofStructureValidator, AssetLockTransactionValidator}, identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator, identity_credit_withdrawal_transition::validation::basic::validate_identity_credit_withdrawal_transition_basic::IdentityCreditWithdrawalTransitionBasicValidator, identity_update_transition::validate_identity_update_transition_basic::ValidateIdentityUpdateTransitionBasic}, validation::PublicKeysValidator}, document::validation::basic::validate_documents_batch_transition_basic::DocumentBatchTransitionBasicValidator, ProtocolError};
10
10
  use wasm_bindgen::{prelude::wasm_bindgen, JsValue};
11
+ use dpp::identity::state_transition::identity_credit_transfer_transition::validation::basic::identity_credit_transfer_basic::IdentityCreditTransferTransitionBasicValidator;
11
12
  use dpp::platform_value::Value;
12
13
 
13
14
  use crate::utils::{ToSerdeJSONExt, WithJsError};
@@ -18,7 +19,8 @@ use crate::{
18
19
  state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
19
20
  state_transition::errors::invalid_state_transition_error::InvalidStateTransitionErrorWasm,
20
21
  with_js_error, DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm,
21
- DocumentsBatchTransitionWasm, IdentityCreateTransitionWasm, IdentityTopUpTransitionWasm,
22
+ DocumentsBatchTransitionWasm, IdentityCreateTransitionWasm,
23
+ IdentityCreditTransferTransitionWasm, IdentityTopUpTransitionWasm,
22
24
  IdentityUpdateTransitionWasm,
23
25
  };
24
26
 
@@ -58,6 +60,9 @@ impl StateTransitionFactoryWasm {
58
60
  StateTransition::IdentityTopUp(st) => {
59
61
  Ok(IdentityTopUpTransitionWasm::from(st).into())
60
62
  }
63
+ StateTransition::IdentityCreditTransfer(st) => {
64
+ Ok(IdentityCreditTransferTransitionWasm::from(st).into())
65
+ }
61
66
  StateTransition::DocumentsBatch(st) => {
62
67
  Ok(DocumentsBatchTransitionWasm::from(st).into())
63
68
  }
@@ -150,6 +155,10 @@ impl StateTransitionFactoryWasm {
150
155
  state_repository_wrapper.clone(),
151
156
  protocol_version_validator.clone(),
152
157
  ),
158
+ IdentityCreditTransferTransitionBasicValidator::new(
159
+ ProtocolVersionValidator::default(),
160
+ )
161
+ .map_err(from_dpp_init_error)?,
153
162
  ),
154
163
  );
155
164
 
@@ -100,5 +100,10 @@ pub async fn validate_state_transition_identity_signature_wasm(
100
100
  .validate(&mut state_transition, &execution_context)
101
101
  .await
102
102
  }
103
+ StateTransition::IdentityCreditTransfer(mut state_transition) => {
104
+ validator
105
+ .validate(&mut state_transition, &execution_context)
106
+ .await
107
+ }
103
108
  }
104
109
  }
@@ -335,4 +335,22 @@ describe('DataContract', () => {
335
335
  expect(dataContract.getMetadata().toObject()).to.deep.equal(otherMetadataToObject);
336
336
  });
337
337
  });
338
+
339
+ describe('#setConfig', () => {
340
+ it('should set config', () => {
341
+ const config = {
342
+ canBeDeleted: true,
343
+ readonly: true,
344
+ keepsHistory: true,
345
+ documentsKeepHistoryContractDefault: true,
346
+ documentsMutableContractDefault: true,
347
+ };
348
+
349
+ dataContract.setConfig(config);
350
+
351
+ const restoredConfig = dataContract.getConfig();
352
+
353
+ expect(config).to.deep.equal(restoredConfig);
354
+ });
355
+ });
338
356
  });
@@ -46,6 +46,26 @@ describe('DataContractFactory', () => {
46
46
 
47
47
  expect(result).excluding('$id').to.deep.equal(rawDataContract);
48
48
  });
49
+
50
+ it('should pass config', () => {
51
+ const config = {
52
+ canBeDeleted: false,
53
+ readonly: false,
54
+ keepsHistory: true,
55
+ documentsKeepHistoryContractDefault: false,
56
+ documentsMutableContractDefault: true,
57
+ };
58
+ const contract = factory.create(
59
+ dataContract.getOwnerId(),
60
+ rawDataContract.documents,
61
+ config,
62
+ );
63
+
64
+ const result = contract.toObject();
65
+
66
+ expect(contract.getConfig()).to.be.deep.equal(config);
67
+ expect(result).excluding('$id').to.deep.equal(rawDataContract);
68
+ });
49
69
  });
50
70
 
51
71
  describe('createFromObject', () => {
@@ -68,6 +68,16 @@ describe('DataContractCreateTransition', () => {
68
68
  expect(result).to.be.instanceOf(Buffer);
69
69
  expect(result).to.have.lengthOf(2271);
70
70
  });
71
+
72
+ it('should be able to restore contract config from bytes', () => {
73
+ const config = stateTransition.getDataContract().getConfig();
74
+ config.keepsHistory = true;
75
+ stateTransition.setDataContractConfig(config);
76
+ expect(stateTransition.getDataContract().getConfig().keepsHistory).to.be.true();
77
+ const buffer = stateTransition.toBuffer();
78
+ const restoredSt = DataContractCreateTransition.fromBuffer(buffer);
79
+ expect(restoredSt.getDataContract().getConfig().keepsHistory).to.be.true();
80
+ });
71
81
  });
72
82
 
73
83
  describe('#getOwnerId', () => {
@@ -68,6 +68,16 @@ describe('DataContractUpdateTransition', () => {
68
68
  expect(result).to.be.instanceOf(Buffer);
69
69
  expect(result).to.have.lengthOf(2239);
70
70
  });
71
+
72
+ it('should be able to restore contract config from bytes', () => {
73
+ const config = stateTransition.getDataContract().getConfig();
74
+ config.keepsHistory = true;
75
+ stateTransition.setDataContractConfig(config);
76
+ expect(stateTransition.getDataContract().getConfig().keepsHistory).to.be.true();
77
+ const buffer = stateTransition.toBuffer();
78
+ const restoredSt = DataContractUpdateTransition.fromBuffer(buffer);
79
+ expect(restoredSt.getDataContract().getConfig().keepsHistory).to.be.true();
80
+ });
71
81
  });
72
82
 
73
83
  describe.skip('#hash', () => {
@@ -0,0 +1,139 @@
1
+ const getIdentityCreditTransferTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreditTransferTransitionFixture');
2
+
3
+ const { default: loadWasmDpp } = require('../../../../..');
4
+ const { getLatestProtocolVersion, StateTransitionTypes } = require('../../../../..');
5
+
6
+ describe('IdentityCreditTransferTransition', () => {
7
+ let rawStateTransition;
8
+ let stateTransition;
9
+
10
+ let IdentityCreditTransferTransition;
11
+ let Identifier;
12
+
13
+ before(async () => {
14
+ ({
15
+ IdentityCreditTransferTransition, Identifier,
16
+ } = await loadWasmDpp());
17
+ });
18
+
19
+ beforeEach(async () => {
20
+ rawStateTransition = (await getIdentityCreditTransferTransitionFixture()).toObject();
21
+
22
+ stateTransition = new IdentityCreditTransferTransition(
23
+ rawStateTransition,
24
+ );
25
+ });
26
+
27
+ describe('#constructor', () => {
28
+ it('should create an instance with specified data from specified raw transition', () => {
29
+ expect(stateTransition.getIdentityId().toBuffer()).to.be.deep.equal(
30
+ rawStateTransition.identityId,
31
+ );
32
+ expect(stateTransition.getRecipientId().toBuffer()).to.be.deep.equal(
33
+ rawStateTransition.recipientId,
34
+ );
35
+ expect(stateTransition.getAmount()).to.be.equal(
36
+ rawStateTransition.amount,
37
+ );
38
+ });
39
+ });
40
+
41
+ describe('#getType', () => {
42
+ it('should return IDENTITY_CREDIT_TRANSFER type', () => {
43
+ expect(stateTransition.getType()).to.equal(StateTransitionTypes.IdentityCreditTransfer);
44
+ });
45
+ });
46
+
47
+ describe('#getIdentityId', () => {
48
+ it('should return identity id', () => {
49
+ expect(stateTransition.getIdentityId().toBuffer()).to.deep.equal(
50
+ rawStateTransition.identityId,
51
+ );
52
+ });
53
+ });
54
+
55
+ describe('#getRecipientId', () => {
56
+ it('should return recipient id', () => {
57
+ expect(stateTransition.getRecipientId().toBuffer()).to.deep.equal(
58
+ rawStateTransition.recipientId,
59
+ );
60
+ });
61
+ });
62
+
63
+ describe('#toObject', () => {
64
+ it('should return raw state transition', () => {
65
+ rawStateTransition = stateTransition.toObject();
66
+
67
+ expect(rawStateTransition).to.deep.equal({
68
+ protocolVersion: getLatestProtocolVersion(),
69
+ type: StateTransitionTypes.IdentityCreditTransfer,
70
+ identityId: rawStateTransition.identityId,
71
+ recipientId: rawStateTransition.recipientId,
72
+ amount: rawStateTransition.amount,
73
+ signature: Buffer.alloc(32).fill(0),
74
+ signaturePublicKeyId: 0,
75
+ });
76
+ });
77
+
78
+ it('should return raw state transition', () => {
79
+ rawStateTransition = stateTransition.toObject({ skipSignature: true });
80
+
81
+ expect(rawStateTransition).to.deep.equal({
82
+ protocolVersion: getLatestProtocolVersion(),
83
+ type: StateTransitionTypes.IdentityCreditTransfer,
84
+ identityId: rawStateTransition.identityId,
85
+ recipientId: rawStateTransition.recipientId,
86
+ amount: rawStateTransition.amount,
87
+ });
88
+ });
89
+ });
90
+
91
+ describe('#toJSON', () => {
92
+ it('should return JSON representation of state transition', () => {
93
+ const jsonStateTransition = stateTransition.toJSON();
94
+
95
+ expect(jsonStateTransition).to.deep.equal({
96
+ protocolVersion: getLatestProtocolVersion(),
97
+ type: StateTransitionTypes.IdentityCreditTransfer,
98
+ identityId: new Identifier(rawStateTransition.identityId).toString(),
99
+ recipientId: new Identifier(rawStateTransition.recipientId).toString(),
100
+ amount: rawStateTransition.amount,
101
+ signature: Buffer.alloc(32).fill(0).toString('base64'),
102
+ signaturePublicKeyId: 0,
103
+ });
104
+ });
105
+ });
106
+
107
+ describe('#getModifiedDataIds', () => {
108
+ it('should return ids of topped up identity', () => {
109
+ const result = stateTransition.getModifiedDataIds();
110
+
111
+ expect(result.length).to.be.equal(2);
112
+ const [identityId, recipientId] = result;
113
+
114
+ expect(identityId).to.be.an.instanceOf(Identifier);
115
+ expect(identityId.toBuffer()).to.be.deep.equal(rawStateTransition.identityId);
116
+
117
+ expect(recipientId).to.be.an.instanceOf(Identifier);
118
+ expect(recipientId.toBuffer()).to.be.deep.equal(rawStateTransition.recipientId);
119
+ });
120
+ });
121
+
122
+ describe('#isDataContractStateTransition', () => {
123
+ it('should return false', () => {
124
+ expect(stateTransition.isDataContractStateTransition()).to.be.false();
125
+ });
126
+ });
127
+
128
+ describe('#isDocumentStateTransition', () => {
129
+ it('should return false', () => {
130
+ expect(stateTransition.isDocumentStateTransition()).to.be.false();
131
+ });
132
+ });
133
+
134
+ describe('#isIdentityStateTransition', () => {
135
+ it('should return true', () => {
136
+ expect(stateTransition.isIdentityStateTransition()).to.be.true();
137
+ });
138
+ });
139
+ });