@dashevo/wasm-dpp 0.24.0-dev.11 → 0.24.0-dev.13

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 (167) hide show
  1. package/Cargo.toml +3 -0
  2. package/README.md +5 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.LICENSE.txt +9 -0
  5. package/dist/lib/dpp.d.ts +9 -0
  6. package/dist/lib/errors/AbstractConsensusError.d.ts +10 -0
  7. package/dist/lib/errors/DPPError.d.ts +5 -0
  8. package/dist/lib/errors/patchConsensusErrors.d.ts +1 -0
  9. package/dist/lib/{patchIdentifier.d.ts → identifier/patchIdentifier.d.ts} +1 -1
  10. package/dist/{index.d.ts → lib/index.d.ts} +1 -1
  11. package/dist/lib/utils/extend.d.ts +1 -0
  12. package/dist/wasm/wasm_dpp.d.ts +1595 -518
  13. package/karma.conf.js +5 -0
  14. package/lib/dpp.ts +24 -0
  15. package/lib/errors/AbstractConsensusError.ts +13 -0
  16. package/lib/errors/DPPError.ts +15 -0
  17. package/lib/errors/patchConsensusErrors.ts +175 -0
  18. package/lib/{patchIdentifier.ts → identifier/patchIdentifier.ts} +6 -5
  19. package/{index.ts → lib/index.ts} +5 -4
  20. package/lib/test/bootstrap.js +5 -0
  21. package/lib/test/expect/expectError.js +4 -2
  22. package/lib/test/mocks/getBlsAdapterMock.js +36 -0
  23. package/lib/test/utils/newDocumentsContainer.js +36 -0
  24. package/lib/utils/extend.ts +6 -0
  25. package/package.json +9 -6
  26. package/src/bls_adapter.rs +16 -1
  27. package/src/data_contract/data_contract.rs +35 -7
  28. package/src/data_contract/errors/invalid_data_contract.rs +21 -0
  29. package/src/data_contract/errors/invalid_document_type.rs +1 -1
  30. package/src/data_contract/index.rs +56 -1
  31. package/src/data_contract/mod.rs +1 -0
  32. package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +6 -8
  33. package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +4 -4
  34. package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +44 -0
  35. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +145 -0
  36. package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +49 -0
  37. package/src/data_contract/state_transition/mod.rs +2 -0
  38. package/src/data_contract_factory/data_contract_factory.rs +25 -12
  39. package/src/document/errors/invalid_document_error.rs +10 -9
  40. package/src/document/errors/invalid_initial_revision_error.rs +1 -1
  41. package/src/document/errors/mismatch_owners_ids_error.rs +14 -4
  42. package/src/document/errors/mod.rs +17 -13
  43. package/src/document/errors/no_documents_supplied_error.rs +4 -4
  44. package/src/document/factory.rs +192 -0
  45. package/src/document/mod.rs +222 -30
  46. package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +47 -1
  47. package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +25 -1
  48. package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +65 -0
  49. package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +123 -3
  50. package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
  51. package/src/document/validator.rs +30 -0
  52. package/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +5 -5
  53. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +4 -4
  54. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +36 -0
  55. package/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +20 -0
  56. package/src/errors/consensus/basic/document/mod.rs +4 -0
  57. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +2 -2
  58. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +2 -2
  59. package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
  60. package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
  61. package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
  62. package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +2 -2
  63. package/src/errors/consensus/basic/json_schema_error.rs +1 -1
  64. package/src/errors/consensus_error.rs +15 -8
  65. package/src/errors/dpp_error.rs +17 -0
  66. package/src/errors/from.rs +6 -1
  67. package/src/errors/js_conversion.rs +19 -4
  68. package/src/errors/mod.rs +3 -0
  69. package/src/errors/protocol_error.rs +15 -0
  70. package/src/{identifier.rs → identifier/mod.rs} +48 -3
  71. package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
  72. package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
  73. package/src/identity/errors/mod.rs +7 -0
  74. package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
  75. package/src/{identity_facade.rs → identity/identity_facade.rs} +3 -5
  76. package/src/{identity_public_key → identity/identity_public_key}/key_type.rs +0 -0
  77. package/src/{identity_public_key → identity/identity_public_key}/mod.rs +41 -10
  78. package/src/{identity_public_key → identity/identity_public_key}/purpose.rs +0 -0
  79. package/src/{identity_public_key → identity/identity_public_key}/security_level.rs +0 -0
  80. package/src/{identity.rs → identity/mod.rs} +20 -12
  81. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
  82. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
  83. package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
  84. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
  85. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
  86. package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
  87. package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
  88. package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
  89. package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +335 -0
  90. package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
  91. package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
  92. package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
  93. package/src/identity/state_transition/identity_create_transition/to_object.rs +46 -0
  94. package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
  95. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +280 -0
  96. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
  97. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
  98. package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
  99. package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
  100. package/src/identity/state_transition/mod.rs +9 -0
  101. package/src/identity/state_transition/validate_public_key_signatures.rs +59 -0
  102. package/src/identity/validation/mod.rs +3 -0
  103. package/src/identity/validation/public_keys_validator.rs +76 -0
  104. package/src/identity_public_key/public_keys_validator.rs +1 -1
  105. package/src/lib.rs +3 -6
  106. package/src/lodash.rs +7 -0
  107. package/src/state_repository.rs +188 -36
  108. package/src/state_transition/mod.rs +12 -0
  109. package/src/utils.rs +102 -7
  110. package/src/validation/json_schema_validator.rs +41 -0
  111. package/src/validation/mod.rs +5 -0
  112. package/src/{validation_result.rs → validation/validation_result.rs} +23 -5
  113. package/src/version/mod.rs +2 -0
  114. package/src/version/protocol_version.rs +26 -0
  115. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +579 -502
  116. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +175 -165
  117. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +83 -114
  118. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +1 -1
  119. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +82 -91
  120. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +75 -31
  121. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -148
  122. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +63 -75
  123. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +48 -19
  124. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +79 -114
  125. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +0 -11
  126. package/test/integration/stateTransition/StateTransitionFacade.spec.js +1 -1
  127. package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +135 -0
  128. package/test/unit/dataContract/DataContract.spec.js +5 -9
  129. package/test/unit/dataContract/DataContractFactory.spec.js +13 -6
  130. package/test/unit/dataContract/createDataContract.spec.js +0 -1
  131. package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +11 -3
  132. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
  133. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +20 -16
  134. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +24 -60
  135. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +27 -23
  136. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +29 -12
  137. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +66 -49
  138. package/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +73 -0
  139. package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
  140. package/test/unit/document/Document.spec.js +147 -155
  141. package/test/unit/document/DocumentFactory.spec.js +325 -91
  142. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +142 -64
  143. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +1 -1
  144. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +1 -1
  145. package/test/unit/identity/Identity.spec.js +2 -2
  146. package/test/unit/identity/IdentityPublicKey.spec.js +25 -31
  147. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +69 -30
  148. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +32 -32
  149. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +56 -25
  150. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
  151. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +48 -46
  152. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
  153. package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
  154. package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
  155. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
  156. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
  157. package/tsconfig.json +1 -1
  158. package/wasm/package.json +5 -0
  159. package/wasm/wasm_dpp.d.ts +1595 -518
  160. package/wasm/wasm_dpp.js +5007 -2172
  161. package/wasm/wasm_dpp_bg.js +1 -1
  162. package/wasm/wasm_dpp_bg.wasm +0 -0
  163. package/wasm/wasm_dpp_bg.wasm.d.ts +566 -365
  164. package/webpack.config.js +10 -1
  165. package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +0 -32
  166. package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +0 -93
  167. package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +0 -64
@@ -0,0 +1,153 @@
1
+ use dpp::identity::state_transition::asset_lock_proof::{
2
+ AssetLockProofValidator, AssetLockTransactionValidator, ChainAssetLockProofStructureValidator,
3
+ InstantAssetLockProofStructureValidator,
4
+ };
5
+ use dpp::identity::state_transition::identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator;
6
+ use dpp::identity::state_transition::validate_public_key_signatures::PublicKeysSignaturesValidator;
7
+ use dpp::identity::validation::{
8
+ PublicKeysValidator, RequiredPurposeAndSecurityLevelValidator, PUBLIC_KEY_SCHEMA_FOR_TRANSITION,
9
+ };
10
+ use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext;
11
+
12
+ use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION};
13
+ use dpp::ProtocolError;
14
+
15
+ use std::sync::Arc;
16
+ use wasm_bindgen::prelude::*;
17
+
18
+ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter};
19
+ use crate::errors::from_dpp_err;
20
+ use crate::utils::ToSerdeJSONExt;
21
+ use crate::{
22
+ state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
23
+ validation::ValidationResultWasm,
24
+ StateTransitionExecutionContextWasm,
25
+ };
26
+
27
+ #[wasm_bindgen(js_name=IdentityCreateTransitionBasicValidator)]
28
+ pub struct IdentityCreateTransitionBasicValidatorWasm(
29
+ IdentityCreateTransitionBasicValidator<
30
+ PublicKeysValidator<BlsAdapter>,
31
+ RequiredPurposeAndSecurityLevelValidator,
32
+ ExternalStateRepositoryLikeWrapper,
33
+ PublicKeysSignaturesValidator<BlsAdapter>,
34
+ BlsAdapter,
35
+ >,
36
+ );
37
+
38
+ impl
39
+ From<
40
+ IdentityCreateTransitionBasicValidator<
41
+ PublicKeysValidator<BlsAdapter>,
42
+ RequiredPurposeAndSecurityLevelValidator,
43
+ ExternalStateRepositoryLikeWrapper,
44
+ PublicKeysSignaturesValidator<BlsAdapter>,
45
+ BlsAdapter,
46
+ >,
47
+ > for IdentityCreateTransitionBasicValidatorWasm
48
+ {
49
+ fn from(
50
+ validator: IdentityCreateTransitionBasicValidator<
51
+ PublicKeysValidator<BlsAdapter>,
52
+ RequiredPurposeAndSecurityLevelValidator,
53
+ ExternalStateRepositoryLikeWrapper,
54
+ PublicKeysSignaturesValidator<BlsAdapter>,
55
+ BlsAdapter,
56
+ >,
57
+ ) -> Self {
58
+ Self(validator)
59
+ }
60
+ }
61
+
62
+ #[wasm_bindgen(js_class=IdentityCreateTransitionBasicValidator)]
63
+ impl IdentityCreateTransitionBasicValidatorWasm {
64
+ #[wasm_bindgen(constructor)]
65
+ pub fn new(
66
+ state_repository: ExternalStateRepositoryLike,
67
+ js_bls: JsBlsAdapter,
68
+ ) -> Result<IdentityCreateTransitionBasicValidatorWasm, JsValue> {
69
+ let state_repository_wrapper =
70
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
71
+
72
+ let protocol_version_validator = ProtocolVersionValidator::new(
73
+ LATEST_VERSION,
74
+ LATEST_VERSION,
75
+ COMPATIBILITY_MAP.clone(),
76
+ );
77
+
78
+ let public_keys_validator = PublicKeysValidator::new_with_schema(
79
+ PUBLIC_KEY_SCHEMA_FOR_TRANSITION.clone(),
80
+ BlsAdapter(js_bls.clone()),
81
+ )
82
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
83
+
84
+ let public_keys_transition_validator = RequiredPurposeAndSecurityLevelValidator::default();
85
+
86
+ let asset_lock_proof_validator: AssetLockProofValidator<
87
+ ExternalStateRepositoryLikeWrapper,
88
+ >;
89
+ {
90
+ let tx_validator = Arc::new(AssetLockTransactionValidator::new(
91
+ state_repository_wrapper.clone(),
92
+ ));
93
+
94
+ let instant_asset_lock_proof_validator = InstantAssetLockProofStructureValidator::new(
95
+ state_repository_wrapper.clone(),
96
+ tx_validator.clone(),
97
+ )
98
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
99
+
100
+ let chain_asset_lock_proof_validator =
101
+ ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator)
102
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
103
+
104
+ asset_lock_proof_validator = AssetLockProofValidator::new(
105
+ instant_asset_lock_proof_validator,
106
+ chain_asset_lock_proof_validator,
107
+ );
108
+ }
109
+
110
+ let public_keys_signature_validator =
111
+ PublicKeysSignaturesValidator::new(BlsAdapter(js_bls.clone()));
112
+
113
+ let validator = IdentityCreateTransitionBasicValidator::new(
114
+ protocol_version_validator,
115
+ Arc::new(public_keys_validator),
116
+ Arc::new(public_keys_transition_validator),
117
+ Arc::new(asset_lock_proof_validator),
118
+ BlsAdapter(js_bls),
119
+ public_keys_signature_validator,
120
+ )
121
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
122
+
123
+ Ok(validator.into())
124
+ }
125
+
126
+ #[wasm_bindgen]
127
+ pub async fn validate(
128
+ mut self,
129
+ raw_state_transition: JsValue,
130
+ execution_context: &StateTransitionExecutionContextWasm,
131
+ ) -> Result<ValidationResultWasm, JsValue> {
132
+ let execution_context: &StateTransitionExecutionContext = execution_context.into();
133
+
134
+ let current_protocol_version =
135
+ js_sys::Reflect::get(&raw_state_transition, &"protocolVersion".into())
136
+ .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32)
137
+ .unwrap_or(LATEST_VERSION);
138
+
139
+ self.0
140
+ .protocol_version_validator()
141
+ .set_current_protocol_version(current_protocol_version);
142
+
143
+ let state_transition_json = raw_state_transition.with_serde_to_json_value()?;
144
+
145
+ let validation_result = self
146
+ .0
147
+ .validate(&state_transition_json, execution_context)
148
+ .await
149
+ .map_err(|e| from_dpp_err(e.into()))?;
150
+
151
+ Ok(validation_result.map(|_| JsValue::undefined()).into())
152
+ }
153
+ }
@@ -0,0 +1,37 @@
1
+ use crate::errors::from_dpp_err;
2
+ use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper};
3
+ use crate::validation::ValidationResultWasm;
4
+ use crate::IdentityCreateTransitionWasm;
5
+ use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state;
6
+ use wasm_bindgen::prelude::*;
7
+ use wasm_bindgen::JsValue;
8
+
9
+ #[wasm_bindgen(js_name=IdentityCreateTransitionStateValidator)]
10
+ pub struct IdentityCreateTransitionStateValidator {
11
+ state_repository: ExternalStateRepositoryLikeWrapper,
12
+ }
13
+
14
+ #[wasm_bindgen(js_class=IdentityCreateTransitionStateValidator)]
15
+ impl IdentityCreateTransitionStateValidator {
16
+ #[wasm_bindgen(constructor)]
17
+ pub fn new(state_repository: ExternalStateRepositoryLike) -> Self {
18
+ Self {
19
+ state_repository: ExternalStateRepositoryLikeWrapper::new(state_repository),
20
+ }
21
+ }
22
+
23
+ #[wasm_bindgen(js_name = validate)]
24
+ pub async fn validate(
25
+ &self,
26
+ state_transition: &IdentityCreateTransitionWasm,
27
+ ) -> Result<ValidationResultWasm, JsValue> {
28
+ let validation_result = validate_identity_create_transition_state(
29
+ &self.state_repository,
30
+ state_transition.to_owned().into(),
31
+ )
32
+ .await
33
+ .map_err(|e| from_dpp_err(e.into()))?;
34
+
35
+ Ok(validation_result.map(|_| JsValue::undefined()).into())
36
+ }
37
+ }
@@ -0,0 +1,8 @@
1
+ pub use identity_create_transition::*;
2
+
3
+ pub mod apply_identity_create_transition;
4
+ pub mod identity_create_transition;
5
+ pub mod identity_create_transition_basic_validator;
6
+ pub mod identity_create_transition_state_validator;
7
+
8
+ mod to_object;
@@ -0,0 +1,46 @@
1
+ use dpp::identity::state_transition::asset_lock_proof::AssetLockProof;
2
+ use dpp::{
3
+ identifier::Identifier,
4
+ identity::{
5
+ state_transition::identity_create_transition::IdentityCreateTransition, IdentityPublicKey,
6
+ },
7
+ state_transition::StateTransitionLike,
8
+ };
9
+ use serde::Deserialize;
10
+ use std::default::Default;
11
+
12
+ #[derive(Deserialize, Default)]
13
+ #[serde(rename_all = "camelCase")]
14
+ pub struct ToObjectOptions {
15
+ pub skip_signature: Option<bool>,
16
+ }
17
+
18
+ #[derive(Default)]
19
+ pub struct ToObject {
20
+ pub transition_type: u8,
21
+ pub protocol_version: u32,
22
+ pub identity_id: Identifier,
23
+ pub asset_lock_proof: AssetLockProof,
24
+ pub public_keys: Vec<IdentityPublicKey>,
25
+ pub signature: Option<Vec<u8>>,
26
+ }
27
+
28
+ pub fn to_object_struct(
29
+ transition: &IdentityCreateTransition,
30
+ options: ToObjectOptions,
31
+ ) -> ToObject {
32
+ let mut to_object = ToObject {
33
+ transition_type: transition.get_type() as u8,
34
+ protocol_version: transition.get_protocol_version(),
35
+ public_keys: transition.get_public_keys().to_owned(),
36
+ asset_lock_proof: transition.get_asset_lock_proof().to_owned(),
37
+ identity_id: transition.get_identity_id().to_owned(),
38
+ signature: None,
39
+ };
40
+
41
+ if !options.skip_signature.unwrap_or(false) {
42
+ to_object.signature = Some(transition.get_signature().to_owned());
43
+ }
44
+
45
+ to_object
46
+ }
@@ -0,0 +1,31 @@
1
+ use dpp::identity::state_transition::asset_lock_proof::AssetLockTransactionOutputFetcher;
2
+ use dpp::identity::state_transition::identity_topup_transition::ApplyIdentityTopUpTransition;
3
+ use std::sync::Arc;
4
+ use wasm_bindgen::prelude::*;
5
+
6
+ use crate::{
7
+ state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
8
+ IdentityTopUpTransitionWasm,
9
+ };
10
+
11
+ #[wasm_bindgen(js_name=applyIdentityTopUpTransition)]
12
+ pub async fn apply_identity_topup_transition_wasm(
13
+ state_repository: ExternalStateRepositoryLike,
14
+ state_transition: &IdentityTopUpTransitionWasm,
15
+ ) -> Result<(), JsValue> {
16
+ let wrapped_state_repository =
17
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
18
+
19
+ let tx_output_fetcher =
20
+ AssetLockTransactionOutputFetcher::new(wrapped_state_repository.clone());
21
+
22
+ let instance =
23
+ ApplyIdentityTopUpTransition::new(wrapped_state_repository, Arc::new(tx_output_fetcher));
24
+
25
+ instance
26
+ .apply(&state_transition.to_owned().into())
27
+ .await
28
+ .map_err(|e| JsValue::from_str(&e.to_string()))?;
29
+
30
+ Ok(())
31
+ }
@@ -0,0 +1,280 @@
1
+ use crate::utils::ToSerdeJSONExt;
2
+
3
+ use std::convert::TryInto;
4
+ use std::default::Default;
5
+
6
+ use wasm_bindgen::prelude::*;
7
+
8
+ use crate::identifier::IdentifierWrapper;
9
+
10
+ use crate::{
11
+ buffer::Buffer,
12
+ create_asset_lock_proof_from_wasm_instance,
13
+ errors::RustConversionError,
14
+ identity::state_transition::asset_lock_proof::{
15
+ ChainAssetLockProofWasm, InstantAssetLockProofWasm,
16
+ },
17
+ state_transition::StateTransitionExecutionContextWasm,
18
+ with_js_error,
19
+ };
20
+
21
+ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter};
22
+ use crate::errors::from_dpp_err;
23
+
24
+ use dpp::{
25
+ identifier::Identifier,
26
+ identity::state_transition::{
27
+ asset_lock_proof::AssetLockProof, identity_topup_transition::IdentityTopUpTransition,
28
+ },
29
+ state_transition::StateTransitionLike,
30
+ util::string_encoding,
31
+ util::string_encoding::Encoding,
32
+ };
33
+
34
+ #[wasm_bindgen(js_name=IdentityTopUpTransition)]
35
+ #[derive(Clone)]
36
+ pub struct IdentityTopUpTransitionWasm(IdentityTopUpTransition);
37
+
38
+ impl From<IdentityTopUpTransition> for IdentityTopUpTransitionWasm {
39
+ fn from(v: IdentityTopUpTransition) -> Self {
40
+ IdentityTopUpTransitionWasm(v)
41
+ }
42
+ }
43
+
44
+ impl From<IdentityTopUpTransitionWasm> for IdentityTopUpTransition {
45
+ fn from(v: IdentityTopUpTransitionWasm) -> Self {
46
+ v.0
47
+ }
48
+ }
49
+
50
+ #[wasm_bindgen(js_class = IdentityTopUpTransition)]
51
+ impl IdentityTopUpTransitionWasm {
52
+ #[wasm_bindgen(constructor)]
53
+ pub fn new(raw_parameters: JsValue) -> Result<IdentityTopUpTransitionWasm, JsValue> {
54
+ let raw_state_transition = raw_parameters.with_serde_to_json_value()?;
55
+
56
+ let identity_topup_transition =
57
+ IdentityTopUpTransition::from_raw_object(raw_state_transition)
58
+ .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?;
59
+
60
+ Ok(identity_topup_transition.into())
61
+ }
62
+
63
+ #[wasm_bindgen(js_name=setAssetLockProof)]
64
+ pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> {
65
+ let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?;
66
+
67
+ self.0
68
+ .set_asset_lock_proof(asset_lock_proof)
69
+ .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?;
70
+
71
+ Ok(())
72
+ }
73
+
74
+ #[wasm_bindgen(getter, js_name=assetLockProof)]
75
+ pub fn asset_lock_proof(&self) -> JsValue {
76
+ self.get_asset_lock_proof()
77
+ }
78
+
79
+ #[wasm_bindgen(js_name=getAssetLockProof)]
80
+ pub fn get_asset_lock_proof(&self) -> JsValue {
81
+ let asset_lock_proof = self.0.get_asset_lock_proof().to_owned();
82
+
83
+ match asset_lock_proof {
84
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
85
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).into()
86
+ }
87
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
88
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).into()
89
+ }
90
+ }
91
+ }
92
+
93
+ #[wasm_bindgen(js_name=getType)]
94
+ pub fn get_type(&self) -> u8 {
95
+ self.0.get_type() as u8
96
+ }
97
+
98
+ #[wasm_bindgen(getter, js_name=identityId)]
99
+ pub fn identity_id(&self) -> IdentifierWrapper {
100
+ self.get_identity_id()
101
+ }
102
+
103
+ #[wasm_bindgen(js_name=getIdentityId)]
104
+ pub fn get_identity_id(&self) -> IdentifierWrapper {
105
+ self.0.get_identity_id().clone().into()
106
+ }
107
+
108
+ #[wasm_bindgen(js_name=getOwnerId)]
109
+ pub fn get_owner_id(&self) -> IdentifierWrapper {
110
+ self.0.get_owner_id().clone().into()
111
+ }
112
+
113
+ #[wasm_bindgen(js_name=toObject)]
114
+ pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> {
115
+ let opts: super::to_object::ToObjectOptions = if options.is_object() {
116
+ with_js_error!(serde_wasm_bindgen::from_value(options))?
117
+ } else {
118
+ Default::default()
119
+ };
120
+
121
+ let object = super::to_object::to_object_struct(&self.0, opts);
122
+ let js_object = js_sys::Object::new();
123
+
124
+ js_sys::Reflect::set(
125
+ &js_object,
126
+ &"type".to_owned().into(),
127
+ &object.transition_type.into(),
128
+ )?;
129
+
130
+ js_sys::Reflect::set(
131
+ &js_object,
132
+ &"protocolVersion".to_owned().into(),
133
+ &object.protocol_version.into(),
134
+ )?;
135
+
136
+ if let Some(signature) = object.signature {
137
+ let signature_value: JsValue = if signature.is_empty() {
138
+ JsValue::undefined()
139
+ } else {
140
+ Buffer::from_bytes(signature.as_slice()).into()
141
+ };
142
+
143
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
144
+ }
145
+
146
+ let asset_lock_proof_object = match object.asset_lock_proof {
147
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
148
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_object()?
149
+ }
150
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
151
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_object()?
152
+ }
153
+ };
154
+
155
+ js_sys::Reflect::set(
156
+ &js_object,
157
+ &"assetLockProof".to_owned().into(),
158
+ &asset_lock_proof_object,
159
+ )?;
160
+
161
+ js_sys::Reflect::set(
162
+ &js_object,
163
+ &"identityId".to_owned().into(),
164
+ &Buffer::from_bytes(object.identity_id.buffer.as_slice()),
165
+ )?;
166
+
167
+ Ok(js_object.into())
168
+ }
169
+
170
+ #[wasm_bindgen(js_name=toJSON)]
171
+ pub fn to_json(&self) -> Result<JsValue, JsValue> {
172
+ let object = super::to_object::to_object_struct(&self.0, Default::default());
173
+ let js_object = js_sys::Object::new();
174
+
175
+ js_sys::Reflect::set(
176
+ &js_object,
177
+ &"type".to_owned().into(),
178
+ &object.transition_type.into(),
179
+ )?;
180
+
181
+ js_sys::Reflect::set(
182
+ &js_object,
183
+ &"protocolVersion".to_owned().into(),
184
+ &object.protocol_version.into(),
185
+ )?;
186
+
187
+ if let Some(signature) = object.signature {
188
+ let signature_value: JsValue = if signature.is_empty() {
189
+ JsValue::undefined()
190
+ } else {
191
+ string_encoding::encode(signature.as_slice(), Encoding::Base64).into()
192
+ };
193
+
194
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
195
+ }
196
+
197
+ let asset_lock_proof_json = match object.asset_lock_proof {
198
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
199
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json()?
200
+ }
201
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
202
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_json()?
203
+ }
204
+ };
205
+
206
+ js_sys::Reflect::set(
207
+ &js_object,
208
+ &"assetLockProof".to_owned().into(),
209
+ &asset_lock_proof_json,
210
+ )?;
211
+
212
+ let identity_id = object.identity_id.to_string(Encoding::Base58);
213
+
214
+ js_sys::Reflect::set(
215
+ &js_object,
216
+ &"identityId".to_owned().into(),
217
+ &identity_id.into(),
218
+ )?;
219
+
220
+ Ok(js_object.into())
221
+ }
222
+
223
+ #[wasm_bindgen(js_name=getModifiedDataIds)]
224
+ pub fn get_modified_data_ids(&self) -> Vec<JsValue> {
225
+ let ids = self.0.get_modified_data_ids();
226
+
227
+ ids.into_iter()
228
+ .map(|id| {
229
+ <IdentifierWrapper as std::convert::From<Identifier>>::from(id.clone()).into()
230
+ })
231
+ .collect()
232
+ }
233
+
234
+ #[wasm_bindgen(js_name=isDataContractStateTransition)]
235
+ pub fn is_data_contract_state_transition(&self) -> bool {
236
+ self.0.is_data_contract_state_transition()
237
+ }
238
+
239
+ #[wasm_bindgen(js_name=isDocumentStateTransition)]
240
+ pub fn is_document_state_transition(&self) -> bool {
241
+ self.0.is_document_state_transition()
242
+ }
243
+
244
+ #[wasm_bindgen(js_name=isIdentityStateTransition)]
245
+ pub fn is_identity_state_transition(&self) -> bool {
246
+ self.0.is_identity_state_transition()
247
+ }
248
+
249
+ #[wasm_bindgen(js_name=setExecutionContext)]
250
+ pub fn set_execution_context(&mut self, context: &StateTransitionExecutionContextWasm) {
251
+ self.0.set_execution_context(context.into())
252
+ }
253
+
254
+ #[wasm_bindgen(js_name=getExecutionContext)]
255
+ pub fn get_execution_context(&mut self) -> StateTransitionExecutionContextWasm {
256
+ self.0.get_execution_context().into()
257
+ }
258
+
259
+ #[wasm_bindgen(js_name=signByPrivateKey)]
260
+ pub fn sign_by_private_key(
261
+ &mut self,
262
+ private_key: Vec<u8>,
263
+ key_type: u8,
264
+ bls: JsBlsAdapter,
265
+ ) -> Result<(), JsValue> {
266
+ let bls_adapter = BlsAdapter(bls);
267
+ let key_type = key_type
268
+ .try_into()
269
+ .map_err(|e: anyhow::Error| e.to_string())?;
270
+
271
+ self.0
272
+ .sign_by_private_key(private_key.as_slice(), key_type, &bls_adapter)
273
+ .map_err(from_dpp_err)
274
+ }
275
+
276
+ #[wasm_bindgen(js_name=getSignature)]
277
+ pub fn get_signature(&self) -> Buffer {
278
+ Buffer::from_bytes(self.0.get_signature().as_slice())
279
+ }
280
+ }
@@ -0,0 +1,113 @@
1
+ use dpp::identity::state_transition::asset_lock_proof::{
2
+ AssetLockProofValidator, AssetLockTransactionValidator, ChainAssetLockProofStructureValidator,
3
+ InstantAssetLockProofStructureValidator,
4
+ };
5
+ use dpp::identity::state_transition::identity_topup_transition::validation::basic::IdentityTopUpTransitionBasicValidator;
6
+
7
+ use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext;
8
+
9
+ use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION};
10
+ use dpp::ProtocolError;
11
+
12
+ use std::sync::Arc;
13
+ use wasm_bindgen::prelude::*;
14
+
15
+ use crate::errors::from_dpp_err;
16
+ use crate::utils::ToSerdeJSONExt;
17
+ use crate::{
18
+ state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
19
+ validation::ValidationResultWasm,
20
+ StateTransitionExecutionContextWasm,
21
+ };
22
+
23
+ #[wasm_bindgen(js_name=IdentityTopUpTransitionBasicValidator)]
24
+ pub struct IdentityTopUpTransitionBasicValidatorWasm(
25
+ IdentityTopUpTransitionBasicValidator<ExternalStateRepositoryLikeWrapper>,
26
+ );
27
+
28
+ impl From<IdentityTopUpTransitionBasicValidator<ExternalStateRepositoryLikeWrapper>>
29
+ for IdentityTopUpTransitionBasicValidatorWasm
30
+ {
31
+ fn from(
32
+ validator: IdentityTopUpTransitionBasicValidator<ExternalStateRepositoryLikeWrapper>,
33
+ ) -> Self {
34
+ Self(validator)
35
+ }
36
+ }
37
+
38
+ #[wasm_bindgen(js_class=IdentityTopUpTransitionBasicValidator)]
39
+ impl IdentityTopUpTransitionBasicValidatorWasm {
40
+ #[wasm_bindgen(constructor)]
41
+ pub fn new(
42
+ state_repository: ExternalStateRepositoryLike,
43
+ ) -> Result<IdentityTopUpTransitionBasicValidatorWasm, JsValue> {
44
+ let state_repository_wrapper =
45
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
46
+
47
+ let protocol_version_validator = ProtocolVersionValidator::new(
48
+ LATEST_VERSION,
49
+ LATEST_VERSION,
50
+ COMPATIBILITY_MAP.clone(),
51
+ );
52
+
53
+ let asset_lock_proof_validator: AssetLockProofValidator<
54
+ ExternalStateRepositoryLikeWrapper,
55
+ >;
56
+ {
57
+ let tx_validator = Arc::new(AssetLockTransactionValidator::new(
58
+ state_repository_wrapper.clone(),
59
+ ));
60
+
61
+ let instant_asset_lock_proof_validator = InstantAssetLockProofStructureValidator::new(
62
+ state_repository_wrapper.clone(),
63
+ tx_validator.clone(),
64
+ )
65
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
66
+
67
+ let chain_asset_lock_proof_validator =
68
+ ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator)
69
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
70
+
71
+ asset_lock_proof_validator = AssetLockProofValidator::new(
72
+ instant_asset_lock_proof_validator,
73
+ chain_asset_lock_proof_validator,
74
+ );
75
+ }
76
+
77
+ let validator = IdentityTopUpTransitionBasicValidator::new(
78
+ protocol_version_validator,
79
+ Arc::new(asset_lock_proof_validator),
80
+ )
81
+ .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?;
82
+
83
+ Ok(validator.into())
84
+ }
85
+
86
+ #[wasm_bindgen]
87
+ pub async fn validate(
88
+ mut self,
89
+ raw_state_transition: JsValue,
90
+ execution_context: &StateTransitionExecutionContextWasm,
91
+ ) -> Result<ValidationResultWasm, JsValue> {
92
+ let execution_context: &StateTransitionExecutionContext = execution_context.into();
93
+
94
+ let current_protocol_version =
95
+ js_sys::Reflect::get(&raw_state_transition, &"protocolVersion".into())
96
+ .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32)
97
+ .unwrap_or(LATEST_VERSION);
98
+
99
+ self.0
100
+ .protocol_version_validator()
101
+ .set_current_protocol_version(current_protocol_version);
102
+
103
+ let state_transition_json = raw_state_transition.with_serde_to_json_value()?;
104
+
105
+ let validation_result = self
106
+ .0
107
+ .validate(&state_transition_json, execution_context)
108
+ .await
109
+ .map_err(|e| from_dpp_err(e.into()))?;
110
+
111
+ Ok(validation_result.map(|_| JsValue::undefined()).into())
112
+ }
113
+ }