@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,269 @@
1
+ mod chain;
2
+ mod instant;
3
+
4
+ pub use chain::*;
5
+ pub use instant::*;
6
+ use std::convert::TryInto;
7
+ use std::sync::Arc;
8
+ use wasm_bindgen::JsCast;
9
+ use wasm_bindgen::__rt::Ref;
10
+
11
+ use crate::errors::{from_dpp_err, RustConversionError};
12
+ use dpp::dashcore::consensus;
13
+ use dpp::dashcore::hashes::hex::FromHex;
14
+ use dpp::identity::errors::UnknownAssetLockProofTypeError;
15
+ use wasm_bindgen::prelude::*;
16
+
17
+ use crate::buffer::Buffer;
18
+ use crate::errors::dpp_error::from_dpp_error_ref;
19
+ use crate::identifier::IdentifierWrapper;
20
+ use crate::identity::errors::UnknownAssetLockProofTypeErrorWasm;
21
+ use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper};
22
+ use crate::utils::generic_of_js_val;
23
+ use crate::validation::ValidationResultWasm;
24
+ use crate::{Deserialize, StateTransitionExecutionContextWasm};
25
+ use dpp::identity::state_transition::asset_lock_proof::{
26
+ AssetLockProof, AssetLockProofType, AssetLockPublicKeyHashFetcher,
27
+ AssetLockTransactionOutputFetcher, AssetLockTransactionValidator,
28
+ };
29
+
30
+ #[derive(Deserialize, Clone)]
31
+ #[wasm_bindgen(js_name=AssetLockProof)]
32
+ pub struct AssetLockProofWasm(AssetLockProof);
33
+
34
+ impl From<AssetLockProof> for AssetLockProofWasm {
35
+ fn from(v: AssetLockProof) -> Self {
36
+ AssetLockProofWasm(v)
37
+ }
38
+ }
39
+
40
+ impl From<AssetLockProofWasm> for AssetLockProof {
41
+ fn from(v: AssetLockProofWasm) -> Self {
42
+ v.0
43
+ }
44
+ }
45
+
46
+ impl From<InstantAssetLockProofWasm> for AssetLockProofWasm {
47
+ fn from(f: InstantAssetLockProofWasm) -> Self {
48
+ AssetLockProof::Instant(f.into()).into()
49
+ }
50
+ }
51
+
52
+ impl From<ChainAssetLockProofWasm> for AssetLockProofWasm {
53
+ fn from(f: ChainAssetLockProofWasm) -> Self {
54
+ AssetLockProof::Chain(f.into()).into()
55
+ }
56
+ }
57
+
58
+ pub trait AssetLockProofLike {
59
+ fn to_object(&self) -> Result<JsValue, JsValue>;
60
+ }
61
+
62
+ #[wasm_bindgen(js_class = AssetLockProof)]
63
+ impl AssetLockProofWasm {
64
+ #[wasm_bindgen(constructor)]
65
+ pub fn new(raw_asset_lock_proof: JsValue) -> Result<AssetLockProofWasm, JsValue> {
66
+ let lock_type = get_lock_type(&raw_asset_lock_proof)?;
67
+
68
+ match lock_type {
69
+ AssetLockProofType::Instant => {
70
+ Ok(InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into())
71
+ }
72
+ AssetLockProofType::Chain => {
73
+ Ok(ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into())
74
+ }
75
+ }
76
+ }
77
+
78
+ #[wasm_bindgen(js_name=createIdentifier)]
79
+ pub fn create_identifier(&self) -> Result<IdentifierWrapper, JsValue> {
80
+ match &self.0 {
81
+ AssetLockProof::Instant(instant) => {
82
+ InstantAssetLockProofWasm::from(instant.to_owned()).create_identifier()
83
+ }
84
+ AssetLockProof::Chain(chain) => {
85
+ ChainAssetLockProofWasm::from(chain.to_owned()).create_identifier()
86
+ }
87
+ }
88
+ }
89
+
90
+ #[wasm_bindgen(js_name=toObject)]
91
+ pub fn to_object(&self) -> Result<JsValue, JsValue> {
92
+ match &self.0 {
93
+ AssetLockProof::Instant(instant) => {
94
+ InstantAssetLockProofWasm::from(instant.to_owned()).to_object()
95
+ }
96
+ AssetLockProof::Chain(chain) => {
97
+ ChainAssetLockProofWasm::from(chain.to_owned()).to_object()
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result<AssetLockProofType, JsValue> {
104
+ (js_sys::Reflect::get(raw_asset_lock_proof, &JsValue::from_str("type"))
105
+ .map_err(|_| {
106
+ RustConversionError::Error(String::from("error getting type from raw asset lock"))
107
+ .to_js_value()
108
+ })?
109
+ .as_f64()
110
+ .ok_or_else(|| JsValue::from_str("asset lock type must be a number"))? as u64)
111
+ .try_into()
112
+ .map_err(|_| JsValue::from_str("unrecognized asset lock proof type"))
113
+ }
114
+
115
+ #[wasm_bindgen(js_name=createAssetLockProofInstance)]
116
+ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result<JsValue, JsValue> {
117
+ let lock_type = get_lock_type(&raw_parameters)?;
118
+
119
+ match lock_type {
120
+ AssetLockProofType::Instant => {
121
+ InstantAssetLockProofWasm::new(raw_parameters).map(|v| v.into())
122
+ }
123
+ AssetLockProofType::Chain => ChainAssetLockProofWasm::new(raw_parameters).map(|v| v.into()),
124
+ }
125
+ }
126
+
127
+ pub fn create_asset_lock_proof_from_wasm_instance(
128
+ js_value: &JsValue,
129
+ ) -> Result<AssetLockProof, JsValue> {
130
+ let default_error: UnknownAssetLockProofTypeErrorWasm =
131
+ UnknownAssetLockProofTypeError::new(None).into();
132
+
133
+ let get_type_value = js_sys::Reflect::get(js_value, &JsValue::from_str("getType"))
134
+ .map_err(|_| default_error.clone())?;
135
+
136
+ let get_type_function: &js_sys::Function = get_type_value
137
+ .dyn_ref::<js_sys::Function>()
138
+ .ok_or_else(|| default_error.clone())?;
139
+
140
+ let raw_lock_type = get_type_function
141
+ .call0(js_value)?
142
+ .as_f64()
143
+ .ok_or(default_error)? as u64;
144
+
145
+ let lock_type: AssetLockProofType = raw_lock_type.try_into().map_err(|_| {
146
+ UnknownAssetLockProofTypeErrorWasm::from(UnknownAssetLockProofTypeError::new(Some(
147
+ raw_lock_type as u8,
148
+ )))
149
+ })?;
150
+
151
+ match lock_type {
152
+ AssetLockProofType::Instant => {
153
+ let instant: Ref<InstantAssetLockProofWasm> =
154
+ generic_of_js_val::<InstantAssetLockProofWasm>(js_value, "InstantAssetLockProof")?;
155
+
156
+ Ok(AssetLockProof::Instant(instant.clone().into()))
157
+ }
158
+ AssetLockProofType::Chain => {
159
+ let chain: Ref<ChainAssetLockProofWasm> =
160
+ generic_of_js_val::<ChainAssetLockProofWasm>(js_value, "ChainAssetLockProof")?;
161
+
162
+ Ok(AssetLockProof::Chain(chain.clone().into()))
163
+ }
164
+ }
165
+ }
166
+
167
+ #[wasm_bindgen(js_name=validateAssetLockTransaction)]
168
+ pub async fn validate_asset_lock_transaction(
169
+ state_repository: ExternalStateRepositoryLike,
170
+ raw_transaction: String,
171
+ output_index: usize,
172
+ execution_context: &StateTransitionExecutionContextWasm,
173
+ ) -> Result<ValidationResultWasm, JsValue> {
174
+ let tx_bytes = Vec::from_hex(&raw_transaction)
175
+ .map_err(|_| RustConversionError::Error(String::from("invalid transaction hex")))?;
176
+
177
+ let state_repository_wrapper =
178
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
179
+
180
+ let validator = AssetLockTransactionValidator::new(state_repository_wrapper);
181
+
182
+ let result = validator
183
+ .validate(tx_bytes.as_slice(), output_index, execution_context.into())
184
+ .await
185
+ .map_err(|e| from_dpp_err(e.into()))?;
186
+
187
+ let validation_result = result.map(|item| {
188
+ let object = js_sys::Object::new();
189
+
190
+ js_sys::Reflect::set(
191
+ &object,
192
+ &"publicKeyHash".to_owned().into(),
193
+ &Buffer::from_bytes(&item.public_key_hash),
194
+ )
195
+ .unwrap();
196
+
197
+ let deserialized_tx = consensus::serialize(&item.transaction);
198
+
199
+ js_sys::Reflect::set(
200
+ &object,
201
+ &"transaction".to_owned().into(),
202
+ &Buffer::from_bytes(&deserialized_tx),
203
+ )
204
+ .unwrap();
205
+
206
+ object
207
+ });
208
+
209
+ Ok(validation_result.into())
210
+ }
211
+
212
+ #[wasm_bindgen(js_name=fetchAssetLockTransactionOutput)]
213
+ pub async fn fetch_asset_lock_transaction_output(
214
+ state_repository: ExternalStateRepositoryLike,
215
+ raw_asset_lock_proof: JsValue,
216
+ execution_context: &StateTransitionExecutionContextWasm,
217
+ ) -> Result<JsValue, JsValue> {
218
+ let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&raw_asset_lock_proof)?;
219
+
220
+ let state_repository_wrapper =
221
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
222
+
223
+ let fetcher = AssetLockTransactionOutputFetcher::new(state_repository_wrapper);
224
+
225
+ let fetch_result = fetcher
226
+ .fetch(&asset_lock_proof, execution_context.into())
227
+ .await
228
+ .map_err(|e| from_dpp_error_ref(&e))?;
229
+
230
+ let tx_out = js_sys::Object::new();
231
+
232
+ js_sys::Reflect::set(
233
+ &tx_out,
234
+ &"satoshis".to_owned().into(),
235
+ &(fetch_result.value as u32).into(),
236
+ )
237
+ .unwrap();
238
+
239
+ let script_hex = format!("{:x}", fetch_result.script_pubkey);
240
+
241
+ js_sys::Reflect::set(&tx_out, &"script".to_owned().into(), &script_hex.into()).unwrap();
242
+
243
+ Ok(tx_out.into())
244
+ }
245
+
246
+ #[wasm_bindgen(js_name=fetchAssetLockPublicKeyHash)]
247
+ pub async fn fetch_asset_lock_public_key_hash(
248
+ state_repository: ExternalStateRepositoryLike,
249
+ raw_asset_lock_proof: JsValue,
250
+ execution_context: &StateTransitionExecutionContextWasm,
251
+ ) -> Result<JsValue, JsValue> {
252
+ let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&raw_asset_lock_proof)?;
253
+
254
+ let state_repository_wrapper =
255
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
256
+
257
+ let tx_output_fetcher =
258
+ AssetLockTransactionOutputFetcher::new(state_repository_wrapper.clone());
259
+
260
+ let public_key_hash_fetcher =
261
+ AssetLockPublicKeyHashFetcher::new(state_repository_wrapper, tx_output_fetcher);
262
+
263
+ let fetch_result = public_key_hash_fetcher
264
+ .fetch_public_key_hash(asset_lock_proof, execution_context.into())
265
+ .await
266
+ .map_err(|e| from_dpp_error_ref(&e))?;
267
+
268
+ Ok(Buffer::from_bytes(&fetch_result).into())
269
+ }
@@ -0,0 +1,26 @@
1
+ use dpp::identity::state_transition::identity_create_transition::ApplyIdentityCreateTransition;
2
+ use std::sync::Arc;
3
+ use wasm_bindgen::prelude::*;
4
+
5
+ use crate::{
6
+ state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
7
+ IdentityCreateTransitionWasm,
8
+ };
9
+
10
+ #[wasm_bindgen(js_name=applyIdentityCreateTransition)]
11
+ pub async fn apply_identity_create_transition_wasm(
12
+ state_repository: ExternalStateRepositoryLike,
13
+ state_transition: &IdentityCreateTransitionWasm,
14
+ ) -> Result<(), JsValue> {
15
+ let wrapped_state_repository =
16
+ Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
17
+
18
+ let instance = ApplyIdentityCreateTransition::new(wrapped_state_repository);
19
+
20
+ instance
21
+ .apply_identity_create_transition(&state_transition.to_owned().into())
22
+ .await
23
+ .map_err(|e| JsValue::from_str(&e.to_string()))?;
24
+
25
+ Ok(())
26
+ }
@@ -0,0 +1,335 @@
1
+ use std::convert::TryInto;
2
+ use std::default::Default;
3
+
4
+ use wasm_bindgen::__rt::Ref;
5
+ use wasm_bindgen::prelude::*;
6
+
7
+ use crate::identifier::IdentifierWrapper;
8
+
9
+ use crate::{
10
+ buffer::Buffer,
11
+ create_asset_lock_proof_from_wasm_instance,
12
+ errors::RustConversionError,
13
+ identity::{
14
+ state_transition::asset_lock_proof::{ChainAssetLockProofWasm, InstantAssetLockProofWasm},
15
+ IdentityPublicKeyWasm,
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
+ use crate::utils::{generic_of_js_val, ToSerdeJSONExt};
24
+ use dpp::{
25
+ identifier::Identifier,
26
+ identity::{
27
+ state_transition::{
28
+ asset_lock_proof::AssetLockProof, identity_create_transition::IdentityCreateTransition,
29
+ },
30
+ IdentityPublicKey,
31
+ },
32
+ state_transition::StateTransitionLike,
33
+ util::string_encoding,
34
+ util::string_encoding::Encoding,
35
+ };
36
+
37
+ #[wasm_bindgen(js_name=IdentityCreateTransition)]
38
+ #[derive(Clone)]
39
+ pub struct IdentityCreateTransitionWasm(IdentityCreateTransition);
40
+
41
+ impl From<IdentityCreateTransition> for IdentityCreateTransitionWasm {
42
+ fn from(v: IdentityCreateTransition) -> Self {
43
+ IdentityCreateTransitionWasm(v)
44
+ }
45
+ }
46
+
47
+ impl From<IdentityCreateTransitionWasm> for IdentityCreateTransition {
48
+ fn from(v: IdentityCreateTransitionWasm) -> Self {
49
+ v.0
50
+ }
51
+ }
52
+
53
+ #[wasm_bindgen(js_class = IdentityCreateTransition)]
54
+ impl IdentityCreateTransitionWasm {
55
+ #[wasm_bindgen(constructor)]
56
+ pub fn new(raw_parameters: JsValue) -> Result<IdentityCreateTransitionWasm, JsValue> {
57
+ let raw_state_transition = raw_parameters.with_serde_to_json_value()?;
58
+
59
+ let identity_create_transition = IdentityCreateTransition::new(raw_state_transition)
60
+ .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?;
61
+
62
+ Ok(identity_create_transition.into())
63
+ }
64
+
65
+ #[wasm_bindgen(js_name=setAssetLockProof)]
66
+ pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> {
67
+ let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?;
68
+
69
+ self.0
70
+ .set_asset_lock_proof(asset_lock_proof)
71
+ .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?;
72
+
73
+ Ok(())
74
+ }
75
+
76
+ #[wasm_bindgen(getter, js_name=assetLockProof)]
77
+ pub fn asset_lock_proof(&self) -> JsValue {
78
+ self.get_asset_lock_proof()
79
+ }
80
+
81
+ #[wasm_bindgen(js_name=getAssetLockProof)]
82
+ pub fn get_asset_lock_proof(&self) -> JsValue {
83
+ let asset_lock_proof = self.0.get_asset_lock_proof().to_owned();
84
+
85
+ match asset_lock_proof {
86
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
87
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).into()
88
+ }
89
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
90
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).into()
91
+ }
92
+ }
93
+ }
94
+
95
+ #[wasm_bindgen(js_name=setPublicKeys)]
96
+ pub fn set_public_keys(&mut self, public_keys: Vec<JsValue>) -> Result<(), JsValue> {
97
+ let public_keys = public_keys
98
+ .iter()
99
+ .map(|value| {
100
+ let public_key: Ref<IdentityPublicKeyWasm> =
101
+ generic_of_js_val::<IdentityPublicKeyWasm>(value, "IdentityPublicKey")?;
102
+ Ok(public_key.clone().into())
103
+ })
104
+ .collect::<Result<Vec<IdentityPublicKey>, JsValue>>()?;
105
+
106
+ self.0.set_public_keys(public_keys);
107
+
108
+ Ok(())
109
+ }
110
+
111
+ #[wasm_bindgen(js_name=addPublicKeys)]
112
+ pub fn add_public_keys(&mut self, public_keys: Vec<JsValue>) -> Result<(), JsValue> {
113
+ let mut public_keys = public_keys
114
+ .iter()
115
+ .map(|value| {
116
+ let public_key: Ref<IdentityPublicKeyWasm> =
117
+ generic_of_js_val::<IdentityPublicKeyWasm>(value, "IdentityPublicKey")?;
118
+ Ok(public_key.clone().into())
119
+ })
120
+ .collect::<Result<Vec<IdentityPublicKey>, JsValue>>()?;
121
+
122
+ self.0.add_public_keys(&mut public_keys);
123
+
124
+ Ok(())
125
+ }
126
+
127
+ #[wasm_bindgen(js_name=getPublicKeys)]
128
+ pub fn get_public_keys(&self) -> Vec<JsValue> {
129
+ self.0
130
+ .get_public_keys()
131
+ .iter()
132
+ .map(IdentityPublicKey::to_owned)
133
+ .map(IdentityPublicKeyWasm::from)
134
+ .map(JsValue::from)
135
+ .collect()
136
+ }
137
+
138
+ #[wasm_bindgen(getter, js_name=publicKeys)]
139
+ pub fn public_keys(&self) -> Vec<JsValue> {
140
+ self.get_public_keys()
141
+ }
142
+
143
+ #[wasm_bindgen(js_name=getType)]
144
+ pub fn get_type(&self) -> u8 {
145
+ self.0.get_type() as u8
146
+ }
147
+
148
+ #[wasm_bindgen(getter, js_name=identityId)]
149
+ pub fn identity_id(&self) -> IdentifierWrapper {
150
+ self.get_identity_id()
151
+ }
152
+
153
+ #[wasm_bindgen(js_name=getIdentityId)]
154
+ pub fn get_identity_id(&self) -> IdentifierWrapper {
155
+ self.0.get_identity_id().clone().into()
156
+ }
157
+
158
+ #[wasm_bindgen(js_name=getOwnerId)]
159
+ pub fn get_owner_id(&self) -> IdentifierWrapper {
160
+ self.0.get_owner_id().clone().into()
161
+ }
162
+
163
+ #[wasm_bindgen(js_name=toObject)]
164
+ pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> {
165
+ let opts: super::to_object::ToObjectOptions = if options.is_object() {
166
+ with_js_error!(serde_wasm_bindgen::from_value(options))?
167
+ } else {
168
+ Default::default()
169
+ };
170
+
171
+ let skip_signature = opts.skip_signature;
172
+ let object = super::to_object::to_object_struct(&self.0, opts);
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
+ Buffer::from_bytes(&signature).into()
192
+ };
193
+
194
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
195
+ }
196
+
197
+ let asset_lock_proof_object = match object.asset_lock_proof {
198
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
199
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_object()?
200
+ }
201
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
202
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_object()?
203
+ }
204
+ };
205
+
206
+ js_sys::Reflect::set(
207
+ &js_object,
208
+ &"assetLockProof".to_owned().into(),
209
+ &asset_lock_proof_object,
210
+ )?;
211
+
212
+ let keys_objects = object
213
+ .public_keys
214
+ .into_iter()
215
+ .map(IdentityPublicKeyWasm::from)
216
+ .map(|key| key.to_object(skip_signature))
217
+ .collect::<Result<js_sys::Array, _>>()?;
218
+
219
+ js_sys::Reflect::set(&js_object, &"publicKeys".to_owned().into(), &keys_objects)?;
220
+
221
+ Ok(js_object.into())
222
+ }
223
+
224
+ #[wasm_bindgen(js_name=toJSON)]
225
+ pub fn to_json(&self) -> Result<JsValue, JsValue> {
226
+ let object = super::to_object::to_object_struct(&self.0, Default::default());
227
+ let js_object = js_sys::Object::new();
228
+
229
+ js_sys::Reflect::set(
230
+ &js_object,
231
+ &"type".to_owned().into(),
232
+ &object.transition_type.into(),
233
+ )?;
234
+
235
+ js_sys::Reflect::set(
236
+ &js_object,
237
+ &"protocolVersion".to_owned().into(),
238
+ &object.protocol_version.into(),
239
+ )?;
240
+
241
+ if let Some(signature) = object.signature {
242
+ let signature_value: JsValue = if signature.is_empty() {
243
+ JsValue::undefined()
244
+ } else {
245
+ string_encoding::encode(signature.as_slice(), Encoding::Base64).into()
246
+ };
247
+
248
+ js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?;
249
+ }
250
+
251
+ let asset_lock_proof_json = match object.asset_lock_proof {
252
+ AssetLockProof::Instant(instant_asset_lock_proof) => {
253
+ InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json()?
254
+ }
255
+ AssetLockProof::Chain(chain_asset_lock_proof) => {
256
+ ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_json()?
257
+ }
258
+ };
259
+
260
+ js_sys::Reflect::set(
261
+ &js_object,
262
+ &"assetLockProof".to_owned().into(),
263
+ &asset_lock_proof_json,
264
+ )?;
265
+
266
+ let keys_objects = object
267
+ .public_keys
268
+ .into_iter()
269
+ .map(IdentityPublicKeyWasm::from)
270
+ .map(|key| key.to_json())
271
+ .collect::<Result<js_sys::Array, _>>()?;
272
+
273
+ js_sys::Reflect::set(&js_object, &"publicKeys".to_owned().into(), &keys_objects)?;
274
+
275
+ Ok(js_object.into())
276
+ }
277
+
278
+ #[wasm_bindgen(js_name=getModifiedDataIds)]
279
+ pub fn get_modified_data_ids(&self) -> Vec<JsValue> {
280
+ let ids = self.0.get_modified_data_ids();
281
+
282
+ ids.into_iter()
283
+ .map(|id| {
284
+ <IdentifierWrapper as std::convert::From<Identifier>>::from(id.clone()).into()
285
+ })
286
+ .collect()
287
+ }
288
+
289
+ #[wasm_bindgen(js_name=isDataContractStateTransition)]
290
+ pub fn is_data_contract_state_transition(&self) -> bool {
291
+ self.0.is_data_contract_state_transition()
292
+ }
293
+
294
+ #[wasm_bindgen(js_name=isDocumentStateTransition)]
295
+ pub fn is_document_state_transition(&self) -> bool {
296
+ self.0.is_document_state_transition()
297
+ }
298
+
299
+ #[wasm_bindgen(js_name=isIdentityStateTransition)]
300
+ pub fn is_identity_state_transition(&self) -> bool {
301
+ self.0.is_identity_state_transition()
302
+ }
303
+
304
+ #[wasm_bindgen(js_name=setExecutionContext)]
305
+ pub fn set_execution_context(&mut self, context: &StateTransitionExecutionContextWasm) {
306
+ self.0.set_execution_context(context.into())
307
+ }
308
+
309
+ #[wasm_bindgen(js_name=getExecutionContext)]
310
+ pub fn get_execution_context(&mut self) -> StateTransitionExecutionContextWasm {
311
+ self.0.get_execution_context().into()
312
+ }
313
+
314
+ #[wasm_bindgen(js_name=signByPrivateKey)]
315
+ pub fn sign_by_private_key(
316
+ &mut self,
317
+ private_key: Vec<u8>,
318
+ key_type: u8,
319
+ bls: JsBlsAdapter,
320
+ ) -> Result<(), JsValue> {
321
+ let bls_adapter = BlsAdapter(bls);
322
+ let key_type = key_type
323
+ .try_into()
324
+ .map_err(|e: anyhow::Error| e.to_string())?;
325
+
326
+ self.0
327
+ .sign_by_private_key(private_key.as_slice(), key_type, &bls_adapter)
328
+ .map_err(from_dpp_err)
329
+ }
330
+
331
+ #[wasm_bindgen(js_name=getSignature)]
332
+ pub fn get_signature(&self) -> Buffer {
333
+ Buffer::from_bytes(self.0.get_signature())
334
+ }
335
+ }