@dashevo/wasm-dpp 0.24.0-dev.12 → 0.24.0-dev.14

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 (245) hide show
  1. package/.mocharc.yml +1 -1
  2. package/Cargo.toml +5 -2
  3. package/README.md +5 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.LICENSE.txt +9 -0
  6. package/dist/wasm/wasm_dpp.d.ts +3397 -1237
  7. package/karma.conf.js +5 -0
  8. package/lib/identifier/patchIdentifier.ts +5 -4
  9. package/lib/index.ts +1 -1
  10. package/lib/test/bootstrap.js +5 -0
  11. package/lib/test/fixtures/getDataContractFixture.js +267 -0
  12. package/lib/test/fixtures/getDocumentsFixture.js +43 -0
  13. package/lib/test/mocks/createStateRepositoryMock.js +64 -0
  14. package/lib/test/mocks/getBlsAdapterMock.js +51 -0
  15. package/package.json +11 -8
  16. package/src/bls_adapter.rs +17 -1
  17. package/src/buffer.rs +3 -0
  18. package/src/dash_platform_protocol.rs +107 -10
  19. package/src/data_contract/data_contract.rs +59 -10
  20. package/src/data_contract/data_contract_facade.rs +128 -0
  21. package/src/data_contract/errors/invalid_data_contract.rs +16 -16
  22. package/src/data_contract/errors/invalid_document_type.rs +8 -8
  23. package/src/data_contract/errors/mod.rs +10 -16
  24. package/src/data_contract/index.rs +56 -1
  25. package/src/data_contract/mod.rs +4 -0
  26. package/src/data_contract/state_transition/data_contract_create_transition/apply.rs +1 -1
  27. package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +41 -10
  28. package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +35 -4
  29. package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +1 -1
  30. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +20 -7
  31. package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +47 -11
  32. package/src/data_contract_factory/data_contract_factory.rs +19 -17
  33. package/src/data_trigger/data_trigger_execution_context.rs +95 -0
  34. package/src/data_trigger/data_trigger_execution_result.rs +48 -0
  35. package/src/data_trigger/execute_data_triggers_factory.rs +60 -0
  36. package/src/data_trigger/get_data_triggers_factory.rs +65 -0
  37. package/src/data_trigger/mod.rs +121 -0
  38. package/src/document/document_facade.rs +125 -0
  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 +257 -0
  45. package/src/document/fetch_and_validate_data_contract.rs +77 -0
  46. package/src/document/generate_document_id.rs +17 -0
  47. package/src/document/mod.rs +311 -37
  48. package/src/document/state_transition/document_batch_transition/apply_document_batch_transition.rs +22 -0
  49. package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +253 -1
  50. package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +60 -1
  51. package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +263 -0
  52. package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +302 -3
  53. package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
  54. package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs +40 -0
  55. package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs +50 -0
  56. package/src/document/state_transition/document_batch_transition/validation/basic/mod.rs +8 -0
  57. package/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +34 -0
  58. package/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs +39 -0
  59. package/src/document/state_transition/document_batch_transition/validation/mod.rs +2 -0
  60. package/src/document/state_transition/document_batch_transition/validation/state/fetch_documents.rs +43 -0
  61. package/src/document/state_transition/document_batch_transition/validation/state/mod.rs +3 -0
  62. package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs +27 -0
  63. package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +47 -0
  64. package/src/document/validator.rs +52 -0
  65. package/src/errors/compatible_protocol_version_is_not_defined_error.rs +24 -0
  66. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +1 -1
  67. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +1 -1
  68. package/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs +2 -2
  69. package/src/errors/consensus/basic/document/invalid_document_type_error.rs +15 -1
  70. package/src/errors/consensus/basic/document/missing_data_contract_id_error.rs +16 -2
  71. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +1 -1
  72. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +1 -1
  73. package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
  74. package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
  75. package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
  76. package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +2 -2
  77. package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs +29 -0
  78. package/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs +4 -3
  79. package/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs +1 -1
  80. package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +1 -1
  81. package/src/errors/consensus/basic/identity/missing_public_key_error.rs +4 -3
  82. package/src/errors/consensus/basic/identity/mod.rs +2 -0
  83. package/src/errors/consensus/basic/invalid_identifier_error.rs +1 -1
  84. package/src/errors/consensus/basic/json_schema_error.rs +8 -2
  85. package/src/errors/consensus/basic/public_key_is_disabled_error.rs +1 -1
  86. package/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +9 -9
  87. package/src/errors/consensus/state/document/invalid_document_revision_error.rs +4 -4
  88. package/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs +35 -0
  89. package/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs +34 -0
  90. package/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +10 -7
  91. package/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs +2 -3
  92. package/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs +7 -3
  93. package/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs +2 -3
  94. package/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +7 -4
  95. package/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs +2 -1
  96. package/src/errors/consensus/state/identity/mod.rs +4 -0
  97. package/src/errors/consensus_error.rs +218 -268
  98. package/src/errors/data_contract_not_present_error.rs +23 -0
  99. package/src/errors/dpp_error.rs +17 -0
  100. package/src/errors/from.rs +22 -0
  101. package/src/errors/js_conversion.rs +52 -5
  102. package/src/errors/mod.rs +6 -0
  103. package/src/errors/protocol_error.rs +14 -3
  104. package/src/identifier/errors.rs +30 -0
  105. package/src/identifier/mod.rs +95 -11
  106. package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
  107. package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
  108. package/src/identity/errors/invalid_identity_error.rs +32 -0
  109. package/src/identity/errors/mod.rs +9 -0
  110. package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
  111. package/src/identity/factory_utils.rs +87 -0
  112. package/src/identity/identity_facade.rs +194 -20
  113. package/src/identity/identity_factory.rs +209 -0
  114. package/src/identity/identity_public_key/mod.rs +51 -40
  115. package/src/identity/mod.rs +31 -17
  116. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
  117. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
  118. package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
  119. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
  120. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
  121. package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
  122. package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
  123. package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
  124. package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +337 -0
  125. package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
  126. package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
  127. package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
  128. package/src/identity/state_transition/identity_create_transition/to_object.rs +45 -0
  129. package/src/identity/state_transition/identity_public_key_transitions.rs +207 -0
  130. package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
  131. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +278 -0
  132. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
  133. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
  134. package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
  135. package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
  136. package/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs +24 -0
  137. package/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +55 -0
  138. package/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +448 -0
  139. package/src/identity/state_transition/identity_update_transition/identity_update_transition_basic_validator.rs +94 -0
  140. package/src/identity/state_transition/identity_update_transition/identity_update_transition_state_validator.rs +53 -0
  141. package/src/identity/state_transition/identity_update_transition/mod.rs +9 -0
  142. package/src/identity/state_transition/identity_update_transition/to_object.rs +66 -0
  143. package/src/identity/state_transition/mod.rs +12 -0
  144. package/src/identity/state_transition/validate_public_key_signatures.rs +61 -0
  145. package/src/identity/validation/identity_validator.rs +50 -0
  146. package/src/identity/validation/mod.rs +2 -0
  147. package/src/identity/validation/public_keys_validator.rs +14 -13
  148. package/src/identity_public_key/public_keys_validator.rs +44 -0
  149. package/src/lib.rs +6 -0
  150. package/src/lodash.rs +7 -0
  151. package/src/metadata.rs +54 -10
  152. package/src/state_repository.rs +598 -101
  153. package/src/state_transition/conversion.rs +104 -0
  154. package/src/state_transition/errors/invalid_state_transition_error.rs +32 -0
  155. package/src/state_transition/errors/mod.rs +1 -0
  156. package/src/state_transition/mod.rs +46 -0
  157. package/src/state_transition/state_transition_facade.rs +263 -0
  158. package/src/state_transition/state_transition_factory.rs +216 -0
  159. package/src/state_transition/validation/mod.rs +1 -0
  160. package/src/state_transition/validation/validate_state_transition_key_signature.rs +62 -0
  161. package/src/utils.rs +210 -8
  162. package/src/validation/json_schema_validator.rs +41 -0
  163. package/src/validation/mod.rs +2 -0
  164. package/src/validation/validation_result.rs +29 -5
  165. package/src/version/mod.rs +2 -0
  166. package/src/version/protocol_version.rs +103 -0
  167. package/test/integration/dataContract/DataContractFacade.spec.js +46 -30
  168. package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +45 -127
  169. package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +91 -139
  170. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +577 -503
  171. package/test/integration/document/Document.spec.js +55 -29
  172. package/test/integration/document/DocumentFacade.spec.js +51 -64
  173. package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +38 -16
  174. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +341 -396
  175. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +116 -218
  176. package/test/integration/document/validation/validateDocumentFactory.spec.js +123 -171
  177. package/test/integration/identity/IdentityFacade.spec.js +52 -27
  178. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +185 -164
  179. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +84 -114
  180. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +120 -137
  181. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +106 -91
  182. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +50 -16
  183. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +78 -86
  184. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +74 -30
  185. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -147
  186. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +65 -77
  187. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +60 -23
  188. package/test/integration/identity/validation/validateIdentityFactory.spec.js +46 -114
  189. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +9 -3
  190. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +12 -8
  191. package/test/integration/stateTransition/StateTransitionFacade.spec.js +95 -233
  192. package/test/integration/stateTransition/calculateStateTransitionFeeFromOperationsFactory.spec.js +53 -0
  193. package/test/unit/Identifier.spec.js +36 -36
  194. package/test/unit/Metadata.spec.js +17 -3
  195. package/test/unit/dataContract/DataContract.spec.js +9 -4
  196. package/test/unit/dataContract/createDataContract.spec.js +0 -1
  197. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
  198. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +1 -1
  199. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +2 -2
  200. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +3 -3
  201. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +1 -1
  202. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +25 -31
  203. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +3 -3
  204. package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +2 -0
  205. package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
  206. package/test/unit/document/Document.spec.js +147 -155
  207. package/test/unit/document/DocumentFactory.spec.js +153 -153
  208. package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +59 -14
  209. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +131 -62
  210. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +144 -56
  211. package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +38 -8
  212. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +11 -7
  213. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +29 -18
  214. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +38 -29
  215. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +53 -91
  216. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +357 -493
  217. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +133 -72
  218. package/test/unit/identity/Identity.spec.js +26 -9
  219. package/test/unit/identity/IdentityFactory.spec.js +81 -89
  220. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +73 -30
  221. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +38 -38
  222. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +34 -25
  223. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
  224. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +85 -50
  225. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
  226. package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +44 -22
  227. package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +58 -103
  228. package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
  229. package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
  230. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
  231. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
  232. package/test/unit/stateTransition/StateTransitionFactory.spec.js +49 -101
  233. package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +23 -25
  234. package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +73 -46
  235. package/test/unit/version/validateProtocolVersionFactory.spec.js +45 -27
  236. package/wasm/package.json +5 -0
  237. package/wasm/wasm_dpp.d.ts +3397 -1237
  238. package/wasm/wasm_dpp.js +7158 -1384
  239. package/wasm/wasm_dpp_bg.js +1 -1
  240. package/wasm/wasm_dpp_bg.wasm +0 -0
  241. package/wasm/wasm_dpp_bg.wasm.d.ts +777 -389
  242. package/webpack.config.js +9 -0
  243. package/src/document/state_transition/document_batch_transition/document_transition/document_update_transition.rs +0 -22
  244. package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +0 -135
  245. package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +0 -54
@@ -1,17 +1,49 @@
1
- use std::convert::TryInto;
2
-
1
+ use dpp::dashcore::anyhow::Context;
2
+ use dpp::prelude::{DataContract, Identifier};
3
+ use dpp::util::json_schema::JsonSchemaExt;
4
+ use dpp::util::json_value::{JsonValueExt, ReplaceWith};
5
+ use dpp::util::string_encoding::Encoding;
3
6
  use serde::{Deserialize, Serialize};
7
+ use serde_json::Value;
8
+ use std::convert::{self, TryInto};
4
9
  use wasm_bindgen::prelude::*;
5
10
 
6
- use dpp::document::Document;
11
+ use dpp::document::{property_names, Document, IDENTIFIER_FIELDS};
7
12
 
8
- use crate::errors::{from_dpp_err, RustConversionError};
9
- use crate::identifier::IdentifierWrapper;
13
+ use crate::buffer::Buffer;
14
+ use crate::errors::RustConversionError;
15
+ use crate::identifier::{identifier_from_js_value, IdentifierWrapper};
16
+ use crate::lodash::lodash_set;
17
+ use crate::utils::{replace_identifiers_with_bytes_without_failing, Inner, ToSerdeJSONExt};
18
+ use crate::utils::{try_to_u64, WithJsError};
10
19
  use crate::with_js_error;
11
20
  use crate::{DataContractWasm, MetadataWasm};
12
21
 
13
22
  pub mod errors;
23
+ pub use state_transition::*;
24
+ pub mod document_facade;
25
+ mod factory;
26
+ pub mod fetch_and_validate_data_contract;
27
+ pub mod generate_document_id;
14
28
  pub mod state_transition;
29
+ mod validator;
30
+
31
+ pub use document_batch_transition::DocumentsBatchTransitionWasm;
32
+ pub use factory::DocumentFactoryWASM;
33
+ pub use validator::DocumentValidatorWasm;
34
+
35
+ #[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
36
+ #[serde(rename_all = "camelCase")]
37
+ pub(crate) struct ConversionOptions {
38
+ #[serde(default)]
39
+ pub skip_identifiers_conversion: bool,
40
+ }
41
+
42
+ pub(super) enum BinaryType {
43
+ Identifier,
44
+ Buffer,
45
+ None,
46
+ }
15
47
 
16
48
  #[wasm_bindgen(js_name=Document)]
17
49
  #[derive(Debug, Clone, Serialize, Deserialize)]
@@ -19,6 +51,20 @@ pub struct DocumentWasm(Document);
19
51
 
20
52
  #[wasm_bindgen(js_class=Document)]
21
53
  impl DocumentWasm {
54
+ #[wasm_bindgen(constructor)]
55
+ pub fn new(
56
+ js_raw_document: JsValue,
57
+ js_data_contract: &DataContractWasm,
58
+ ) -> Result<DocumentWasm, JsValue> {
59
+ let raw_document = raw_document_from_js_value(&js_raw_document, js_data_contract.inner())?;
60
+
61
+ let document =
62
+ Document::from_raw_document(raw_document, js_data_contract.to_owned().into())
63
+ .with_js_error()?;
64
+
65
+ Ok(document.into())
66
+ }
67
+
22
68
  #[wasm_bindgen(js_name=getProtocolVersion)]
23
69
  pub fn get_protocol_version(&self) -> u32 {
24
70
  self.0.protocol_version
@@ -26,7 +72,12 @@ impl DocumentWasm {
26
72
 
27
73
  #[wasm_bindgen(js_name=getId)]
28
74
  pub fn get_id(&self) -> IdentifierWrapper {
29
- self.0.id.clone().into()
75
+ self.0.id.into()
76
+ }
77
+
78
+ #[wasm_bindgen(js_name=setId)]
79
+ pub fn set_id(&mut self, js_id: IdentifierWrapper) {
80
+ self.0.id = js_id.into_inner();
30
81
  }
31
82
 
32
83
  #[wasm_bindgen(js_name=getType)]
@@ -36,7 +87,14 @@ impl DocumentWasm {
36
87
 
37
88
  #[wasm_bindgen(js_name=getDataContractId)]
38
89
  pub fn get_data_contract_id(&self) -> IdentifierWrapper {
39
- self.0.data_contract_id.clone().into()
90
+ self.0.data_contract_id.into()
91
+ }
92
+
93
+ #[wasm_bindgen(js_name=setDataContractId)]
94
+ pub fn set_data_contract_id(&mut self, js_data_contract_id: &JsValue) -> Result<(), JsValue> {
95
+ let data_contract_id = identifier_from_js_value(js_data_contract_id)?;
96
+ self.0.data_contract_id = data_contract_id;
97
+ Ok(())
40
98
  }
41
99
 
42
100
  #[wasm_bindgen(js_name=getDataContract)]
@@ -44,9 +102,14 @@ impl DocumentWasm {
44
102
  self.0.data_contract.clone().into()
45
103
  }
46
104
 
105
+ #[wasm_bindgen(js_name=setOwnerId)]
106
+ pub fn set_owner_id(&mut self, owner_id: IdentifierWrapper) {
107
+ self.0.owner_id = owner_id.into_inner();
108
+ }
109
+
47
110
  #[wasm_bindgen(js_name=getOwnerId)]
48
111
  pub fn get_owner_id(&self) -> IdentifierWrapper {
49
- self.0.owner_id.clone().into()
112
+ self.0.owner_id.into()
50
113
  }
51
114
 
52
115
  #[wasm_bindgen(js_name=setRevision)]
@@ -72,51 +135,149 @@ impl DocumentWasm {
72
135
  }
73
136
 
74
137
  #[wasm_bindgen(js_name=getEntropy)]
75
- pub fn get_entropy(&mut self) -> Vec<u8> {
76
- self.0.entropy.to_vec()
138
+ pub fn get_entropy(&mut self) -> Buffer {
139
+ Buffer::from_bytes(&self.0.entropy)
77
140
  }
78
141
 
79
142
  #[wasm_bindgen(js_name=setData)]
80
- pub fn set_data(&mut self, d: JsValue) -> Result<(), JsValue> {
81
- self.0.data = with_js_error!(serde_wasm_bindgen::from_value(d))?;
82
- Ok(())
143
+ pub fn set_data(&mut self, document_data: JsValue) -> Result<(), JsValue> {
144
+ self.0.data = document_data.with_serde_to_json_value()?;
145
+ document_data_to_bytes(&mut self.0)
83
146
  }
84
147
 
85
148
  #[wasm_bindgen(js_name=getData)]
86
149
  pub fn get_data(&mut self) -> Result<JsValue, JsValue> {
87
- with_js_error!(serde_wasm_bindgen::to_value(&self.0.data))
150
+ let js_value = self
151
+ .0
152
+ .data
153
+ .serialize(&serde_wasm_bindgen::Serializer::json_compatible())?;
154
+
155
+ let (identifier_paths, binary_paths) = self
156
+ .0
157
+ .data_contract
158
+ .get_identifiers_and_binary_paths(&self.0.document_type)
159
+ .with_js_error()?;
160
+
161
+ for path in identifier_paths {
162
+ if let Ok(value) = self.0.data.get_value(path) {
163
+ let bytes: Vec<u8> = serde_json::from_value(value.to_owned()).with_js_error()?;
164
+ let id = <IdentifierWrapper as convert::From<Identifier>>::from(
165
+ Identifier::from_bytes(&bytes).unwrap(),
166
+ );
167
+ lodash_set(&js_value, path, id.into());
168
+ }
169
+ }
170
+ for path in binary_paths {
171
+ if let Ok(value) = self.0.data.get_value(path) {
172
+ let bytes: Vec<u8> = serde_json::from_value(value.to_owned()).with_js_error()?;
173
+ let buffer = Buffer::from_bytes(&bytes);
174
+ lodash_set(&js_value, path, buffer.into());
175
+ }
176
+ }
177
+
178
+ Ok(js_value)
88
179
  }
89
180
 
90
181
  #[wasm_bindgen(js_name=set)]
91
- pub fn set(&mut self, _path: String, _d: JsValue) {
92
- // TODO use lodash via extern
93
- unimplemented!()
182
+ pub fn set(&mut self, path: String, js_value_to_set: JsValue) -> Result<(), JsValue> {
183
+ let mut value_to_set = if js_value_to_set.is_null() || js_value_to_set.is_undefined() {
184
+ serde_json::Value::Null
185
+ } else {
186
+ js_value_to_set.with_serde_to_json_value()?
187
+ };
188
+
189
+ let (identifier_paths, _) = self.0.get_identifiers_and_binary_paths().with_js_error()?;
190
+ for property_path in identifier_paths {
191
+ if property_path == path {
192
+ let id_string = value_to_set
193
+ .as_str()
194
+ .context("the value must be a string")
195
+ .with_js_error()?;
196
+ let id = Identifier::from_string(id_string, Encoding::Base58).with_js_error()?;
197
+ let new_value = serde_json::to_value(id.as_bytes()).with_js_error()?;
198
+
199
+ return self.0.set(&path, new_value).with_js_error();
200
+ } else if property_path.starts_with(&path) {
201
+ let (_, suffix) = property_path.split_at(path.len() + 1);
202
+
203
+ if value_to_set.get_value(suffix).is_ok() {
204
+ let id_string = value_to_set
205
+ .remove_path_into::<String>(suffix)
206
+ .with_context(|| format!("unable convert `{path}` into string"))
207
+ .map_err(|e| format!("{e:#}"))?;
208
+ let id: IdentifierWrapper =
209
+ Identifier::from_string(&id_string, Encoding::Base58)
210
+ .with_js_error()?
211
+ .into();
212
+ let new_value = serde_json::to_value(id.inner().as_bytes()).with_js_error()?;
213
+ value_to_set
214
+ .insert_with_path(suffix, new_value)
215
+ .with_js_error()?;
216
+
217
+ return self.0.set(&path, value_to_set).with_js_error();
218
+ }
219
+ }
220
+ }
221
+
222
+ self.0.set(&path, value_to_set).with_js_error()
94
223
  }
95
224
 
96
225
  #[wasm_bindgen(js_name=get)]
97
- pub fn get(&mut self, _path: String) -> JsValue {
98
- // TODO use lodash via extern
99
- unimplemented!()
226
+ pub fn get(&mut self, path: String) -> JsValue {
227
+ let binary_type = self.get_binary_type_of_path(&path);
228
+
229
+ if let Some(value) = self.0.get(&path) {
230
+ match binary_type {
231
+ BinaryType::Identifier => {
232
+ if let Ok(bytes) = serde_json::from_value::<Vec<u8>>(value.to_owned()) {
233
+ let id: IdentifierWrapper = Identifier::from_bytes(&bytes).unwrap().into();
234
+
235
+ return id.into();
236
+ }
237
+ }
238
+ BinaryType::Buffer => {
239
+ if let Ok(bytes) = serde_json::from_value::<Vec<u8>>(value.to_owned()) {
240
+ return Buffer::from_bytes(&bytes).into();
241
+ }
242
+ }
243
+ BinaryType::None => {
244
+ let serializer = serde_wasm_bindgen::Serializer::json_compatible();
245
+ if let Ok(js_value) = value.serialize(&serializer) {
246
+ return js_value;
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ JsValue::undefined()
100
253
  }
101
254
 
102
255
  #[wasm_bindgen(js_name=setCreatedAt)]
103
- pub fn set_created_at(&mut self, ts: i64) {
104
- self.0.created_at = Some(ts);
256
+ pub fn set_created_at(&mut self, number: JsValue) -> Result<(), JsValue> {
257
+ let ts = try_to_u64(number)
258
+ .context("setting createdAt in Document")
259
+ .with_js_error()?;
260
+ self.0.created_at = Some(ts as i64);
261
+ Ok(())
105
262
  }
106
263
 
107
264
  #[wasm_bindgen(js_name=setUpdatedAt)]
108
- pub fn set_updated_at(&mut self, ts: i64) {
109
- self.0.updated_at = Some(ts);
265
+ pub fn set_updated_at(&mut self, number: JsValue) -> Result<(), JsValue> {
266
+ let ts = try_to_u64(number)
267
+ .context("setting updatedAt in Document")
268
+ .with_js_error()?;
269
+ self.0.updated_at = Some(ts as i64);
270
+ Ok(())
110
271
  }
111
272
 
112
273
  #[wasm_bindgen(js_name=getCreatedAt)]
113
- pub fn get_created_at(&self) -> Option<i64> {
114
- self.0.created_at
274
+ pub fn get_created_at(&self) -> Option<f64> {
275
+ self.0.created_at.map(|v| v as f64)
115
276
  }
116
277
 
117
278
  #[wasm_bindgen(js_name=getUpdatedAt)]
118
- pub fn get_updated_at(&self) -> Option<i64> {
119
- self.0.updated_at
279
+ pub fn get_updated_at(&self) -> Option<f64> {
280
+ self.0.updated_at.map(|v| v as f64)
120
281
  }
121
282
 
122
283
  #[wasm_bindgen(js_name=getMetadata)]
@@ -125,34 +286,147 @@ impl DocumentWasm {
125
286
  }
126
287
 
127
288
  #[wasm_bindgen(js_name=setMetadata)]
128
- pub fn set_metadata(&mut self, metadata: MetadataWasm) {
289
+ pub fn set_metadata(&mut self, metadata: &MetadataWasm) {
129
290
  self.0.metadata = Some(metadata.into());
130
291
  }
131
292
 
132
293
  #[wasm_bindgen(js_name=toObject)]
133
- pub fn to_object(&self) -> Result<JsValue, JsValue> {
134
- with_js_error!(serde_wasm_bindgen::to_value(&self.0))
294
+ pub fn to_object(&self, options: &JsValue) -> Result<JsValue, JsValue> {
295
+ let options: ConversionOptions = if !options.is_undefined() && options.is_object() {
296
+ let raw_options = options.with_serde_to_json_value()?;
297
+ serde_json::from_value(raw_options).with_js_error()?
298
+ } else {
299
+ Default::default()
300
+ };
301
+ let mut value = self.0.to_object().with_js_error()?;
302
+
303
+ let (identifiers_paths, binary_paths) =
304
+ self.0.get_identifiers_and_binary_paths().with_js_error()?;
305
+ let serializer = serde_wasm_bindgen::Serializer::json_compatible();
306
+ let js_value = value.serialize(&serializer)?;
307
+
308
+ for path in identifiers_paths.into_iter().chain(IDENTIFIER_FIELDS) {
309
+ if let Ok(bytes) = value.remove_path_into::<Vec<u8>>(path) {
310
+ let buffer = Buffer::from_bytes(&bytes);
311
+ if !options.skip_identifiers_conversion {
312
+ lodash_set(&js_value, path, buffer.into());
313
+ } else {
314
+ let id = IdentifierWrapper::new(buffer.into())?;
315
+ lodash_set(&js_value, path, id.into());
316
+ }
317
+ }
318
+ }
319
+
320
+ for path in binary_paths {
321
+ if let Ok(bytes) = value.remove_path_into::<Vec<u8>>(path) {
322
+ let buffer = Buffer::from_bytes(&bytes);
323
+ lodash_set(&js_value, path, buffer.into());
324
+ }
325
+ }
326
+
327
+ Ok(js_value)
135
328
  }
136
329
 
137
330
  #[wasm_bindgen(js_name=toJSON)]
138
331
  pub fn to_json(&self) -> Result<JsValue, JsValue> {
139
- self.to_object()
332
+ let value = self.0.to_json().with_js_error()?;
333
+ let serializer = serde_wasm_bindgen::Serializer::json_compatible();
334
+
335
+ with_js_error!(value.serialize(&serializer))
140
336
  }
141
337
 
142
338
  #[wasm_bindgen(js_name=toBuffer)]
143
- pub fn to_buffer(&self) -> Result<Vec<u8>, JsValue> {
144
- let buffer = self.0.to_buffer().map_err(from_dpp_err)?;
145
- Ok(buffer)
339
+ pub fn to_buffer(&self) -> Result<Buffer, JsValue> {
340
+ let bytes = self.0.to_buffer().with_js_error()?;
341
+
342
+ Ok(Buffer::from_bytes(&bytes))
146
343
  }
147
344
 
148
345
  #[wasm_bindgen(js_name=hash)]
149
- pub fn hash(&self) -> Result<Vec<u8>, JsValue> {
150
- self.0.hash().map_err(from_dpp_err)
346
+ pub fn hash(&self) -> Result<Buffer, JsValue> {
347
+ let bytes = self.0.hash().with_js_error()?;
348
+ Ok(Buffer::from_bytes(&bytes))
349
+ }
350
+
351
+ #[wasm_bindgen(js_name=clone)]
352
+ pub fn deep_clone(&self) -> DocumentWasm {
353
+ self.clone()
354
+ }
355
+ }
356
+
357
+ impl DocumentWasm {
358
+ fn get_binary_type_of_path(&self, path: &String) -> BinaryType {
359
+ let maybe_binary_properties = self
360
+ .0
361
+ .data_contract
362
+ .get_binary_properties(&self.0.document_type);
363
+
364
+ if let Ok(binary_properties) = maybe_binary_properties {
365
+ if let Some(data) = binary_properties.get(path) {
366
+ if data.is_type_of_identifier() {
367
+ return BinaryType::Identifier;
368
+ }
369
+ return BinaryType::Buffer;
370
+ }
371
+ }
372
+ BinaryType::None
151
373
  }
152
374
  }
153
375
 
376
+ /// document's dynamic data, regardless they are identifiers or binary, they should
377
+ /// be stored as arrays of int
378
+ pub(crate) fn document_data_to_bytes(document: &mut Document) -> Result<(), JsValue> {
379
+ let mut document_data = document.data.take();
380
+ let (identifier_paths, binary_paths) = document
381
+ .get_identifiers_and_binary_paths()
382
+ .with_js_error()?;
383
+ document_data
384
+ .replace_identifier_paths(identifier_paths, ReplaceWith::Bytes)
385
+ .with_js_error()?;
386
+ document_data
387
+ .replace_binary_paths(binary_paths, ReplaceWith::Bytes)
388
+ .with_js_error()?;
389
+ document.set_data(document_data);
390
+ Ok(())
391
+ }
392
+
393
+ pub(crate) fn raw_document_from_js_value(
394
+ js_raw_document: &JsValue,
395
+ data_contract: &DataContract,
396
+ ) -> Result<Value, JsValue> {
397
+ let mut raw_document = js_raw_document.with_serde_to_json_value()?;
398
+
399
+ let document_type = raw_document
400
+ .get_string(property_names::DOCUMENT_TYPE)
401
+ .with_js_error()?;
402
+
403
+ let (identifier_paths, _) = data_contract
404
+ .get_identifiers_and_binary_paths(document_type)
405
+ .with_js_error()?;
406
+
407
+ replace_identifiers_with_bytes_without_failing(
408
+ &mut raw_document,
409
+ identifier_paths.into_iter().chain(IDENTIFIER_FIELDS),
410
+ );
411
+
412
+ // The binary paths are not being converted, because they always should be a `Buffer`. `Buffer` is always an Array
413
+ Ok(raw_document)
414
+ }
415
+
154
416
  impl From<Document> for DocumentWasm {
155
417
  fn from(d: Document) -> Self {
156
418
  DocumentWasm(d)
157
419
  }
158
420
  }
421
+
422
+ impl From<DocumentWasm> for Document {
423
+ fn from(d: DocumentWasm) -> Self {
424
+ d.0
425
+ }
426
+ }
427
+
428
+ impl From<&DocumentWasm> for Document {
429
+ fn from(d: &DocumentWasm) -> Self {
430
+ d.0.clone()
431
+ }
432
+ }
@@ -0,0 +1,22 @@
1
+ use dpp::document::state_transition::documents_batch_transition::apply_documents_batch_transition_factory::{apply_documents_batch_transition};
2
+ use wasm_bindgen::prelude::*;
3
+
4
+ use crate::{
5
+ state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper},
6
+ utils::WithJsError,
7
+ DocumentsBatchTransitionWasm,
8
+ };
9
+
10
+ #[wasm_bindgen(js_name=applyDocumentsBatchTransition)]
11
+ pub async fn apply_documents_batch_transition_wasm(
12
+ state_repository: ExternalStateRepositoryLike,
13
+ transition: &DocumentsBatchTransitionWasm,
14
+ ) -> Result<(), JsValue> {
15
+ let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository);
16
+
17
+ let result = apply_documents_batch_transition(&wrapped_state_repository, &transition.0)
18
+ .await
19
+ .with_js_error();
20
+
21
+ result
22
+ }