@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
@@ -0,0 +1,23 @@
1
+ use dpp::prelude::Identifier;
2
+ use wasm_bindgen::prelude::*;
3
+
4
+ use crate::buffer::Buffer;
5
+
6
+ #[wasm_bindgen(js_name=DataContractNotPresentNotConsensusError)]
7
+ pub struct DataContractNotPresentNotConsensusErrorWasm {
8
+ data_contract_id: Identifier,
9
+ }
10
+
11
+ impl DataContractNotPresentNotConsensusErrorWasm {
12
+ pub fn new(data_contract_id: Identifier) -> Self {
13
+ Self { data_contract_id }
14
+ }
15
+ }
16
+
17
+ #[wasm_bindgen(js_class=DataContractNotPresentNotConsensusError)]
18
+ impl DataContractNotPresentNotConsensusErrorWasm {
19
+ #[wasm_bindgen(js_name=getDataContractId)]
20
+ pub fn get_data_contract_id(&self) -> Buffer {
21
+ Buffer::from_bytes(self.data_contract_id.as_bytes())
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ use crate::identity::errors::{
2
+ AssetLockOutputNotFoundErrorWasm, AssetLockTransactionIsNotFoundErrorWasm,
3
+ };
4
+ use dpp::DPPError;
5
+ use wasm_bindgen::JsValue;
6
+
7
+ pub fn from_dpp_error_ref(e: &DPPError) -> JsValue {
8
+ match e {
9
+ DPPError::AssetLockOutputNotFoundError(e) => {
10
+ AssetLockOutputNotFoundErrorWasm::from(e).into()
11
+ }
12
+ DPPError::AssetLockTransactionIsNotFoundError(e) => {
13
+ AssetLockTransactionIsNotFoundErrorWasm::from(e).into()
14
+ }
15
+ _ => unimplemented!(),
16
+ }
17
+ }
@@ -1,12 +1,21 @@
1
+ use dpp::DashPlatformProtocolInitError;
2
+
1
3
  use wasm_bindgen::JsValue;
2
4
 
3
5
  use dpp::errors::ProtocolError;
4
6
 
5
7
  use crate::data_contract::errors::from_data_contract_to_js_error;
6
8
  use crate::document::errors::from_document_to_js_error;
9
+ use crate::identifier::errors::IdentifierErrorWasm;
10
+
11
+ use super::consensus_error::from_consensus_error;
12
+ use super::data_contract_not_present_error::DataContractNotPresentNotConsensusErrorWasm;
7
13
 
8
14
  pub fn from_dpp_err(pe: ProtocolError) -> JsValue {
9
15
  match pe {
16
+ ProtocolError::AbstractConsensusError(consensus_error) => {
17
+ from_consensus_error(*consensus_error)
18
+ }
10
19
  ProtocolError::DataContractError(e) => from_data_contract_to_js_error(e),
11
20
 
12
21
  ProtocolError::Document(e) => from_document_to_js_error(*e),
@@ -19,6 +28,19 @@ pub fn from_dpp_err(pe: ProtocolError) -> JsValue {
19
28
  )
20
29
  .into(),
21
30
 
31
+ ProtocolError::DataContractNotPresentError(err) => {
32
+ DataContractNotPresentNotConsensusErrorWasm::new(err.data_contract_id()).into()
33
+ }
34
+
35
+ ProtocolError::IdentifierError(err) => IdentifierErrorWasm::new(err).into(),
22
36
  _ => JsValue::from_str(&format!("Error conversion not implemented: {pe:#}",)),
23
37
  }
24
38
  }
39
+
40
+ pub fn from_dpp_init_error(e: DashPlatformProtocolInitError) -> JsValue {
41
+ match e {
42
+ DashPlatformProtocolInitError::SchemaDeserializationError(e) => e.to_string().into(),
43
+ DashPlatformProtocolInitError::ValidationError(e) => e.to_string().into(),
44
+ DashPlatformProtocolInitError::InvalidSchemaError(e) => e.to_string().into(),
45
+ }
46
+ }
@@ -1,7 +1,8 @@
1
+ use anyhow::anyhow;
1
2
  use serde_json;
2
3
  use serde_wasm_bindgen::Error;
3
4
  use thiserror::Error;
4
- use wasm_bindgen::JsValue;
5
+ use wasm_bindgen::{JsCast, JsValue};
5
6
 
6
7
  /// This is a rust-specific errors. In addition to all errors defined in `js-dpp`, the
7
8
  /// error might be triggered when using JS bindings
@@ -41,23 +42,69 @@ impl From<serde_wasm_bindgen::Error> for RustConversionError {
41
42
  #[macro_export]
42
43
  macro_rules! with_js_error {
43
44
  ($o:expr) => {
44
- $o.map_err(|e| RustConversionError::from(e).to_js_value())
45
+ $o.map_err(|e| $crate::errors::RustConversionError::from(e).to_js_value())
45
46
  };
46
47
  }
47
48
 
48
49
  #[macro_export]
49
50
  macro_rules! bail_js {
50
51
  ($msg:literal) => ({
51
- return Err(RustConversionError::from(String::from($msg)).to_js_value())
52
+ return Err($crate::errors::RustConversionError::from(String::from($msg)).to_js_value())
52
53
  });
53
54
 
54
55
  ($err:expr $(,)?) => ({
55
56
  use $crate::private::kind::*;
56
- return Err(RustConversionError::from($err).to_js_value())
57
+ return Err($crate::errors::RustConversionError::from($err).to_js_value())
57
58
  });
58
59
 
59
60
  ($fmt:expr, $($arg:tt)*) => {
60
- return Err(RustConversionError::from(format!($fmt, $($arg)*)).to_js_value())
61
+ return Err($crate::errors::RustConversionError::from(format!($fmt, $($arg)*)).to_js_value())
61
62
  };
62
63
 
63
64
  }
65
+
66
+ #[macro_export]
67
+ macro_rules! console_log {
68
+ ($msg:literal) => {{
69
+ web_sys::console::log_1(&format!($msg).into())
70
+ }};
71
+
72
+ ($msg:expr $(,)?) => {{
73
+ web_sys::console::log_1(&format!("{}", $msg).into())
74
+ }};
75
+
76
+ ($fmt:expr, $($arg:tt)*) => {
77
+ web_sys::console::log_1(&format!($fmt, $($arg)*).into())
78
+ };
79
+ }
80
+
81
+ pub fn from_js_error(e: JsValue) -> anyhow::Error {
82
+ let message = if e.is_instance_of::<js_sys::Error>() {
83
+ js_sys::Reflect::get(&e, &"message".into())
84
+ .map(|e| {
85
+ e.as_string()
86
+ .unwrap_or_else(|| String::from("Unknown JS Error: empty error message."))
87
+ })
88
+ .unwrap_or_else(|_| String::from("Unknown JS Error: unable to access error message"))
89
+ } else {
90
+ // TODO: is there a simpler way to to call `toString()`?
91
+ let to_string_value = js_sys::Reflect::get(&e, &JsValue::from_str("toString"))
92
+ .unwrap_or_else(|_| JsValue::undefined());
93
+
94
+ let message = if let Some(to_string_function) =
95
+ to_string_value.dyn_ref::<js_sys::Function>()
96
+ {
97
+ to_string_function
98
+ .call0(&e)
99
+ .unwrap_or_else(|_| JsValue::from_str("Unknown JS Error: call toString() failed"))
100
+ .as_string()
101
+ .unwrap()
102
+ } else {
103
+ String::from("Unknown Error: toString() is not a function")
104
+ };
105
+
106
+ message
107
+ };
108
+
109
+ anyhow!(message)
110
+ }
package/src/errors/mod.rs CHANGED
@@ -3,9 +3,15 @@ pub use js_conversion::*;
3
3
 
4
4
  pub mod consensus;
5
5
  pub mod consensus_error;
6
+
6
7
  mod from;
7
8
  mod js_conversion;
8
9
  pub mod protocol_error;
9
10
  mod public_key_validation_error;
10
11
 
11
12
  pub use public_key_validation_error::*;
13
+
14
+ mod compatible_protocol_version_is_not_defined_error;
15
+ pub mod data_contract_not_present_error;
16
+ pub mod dpp_error;
17
+ pub use compatible_protocol_version_is_not_defined_error::*;
@@ -1,12 +1,23 @@
1
+ use crate::data_contract::errors::InvalidDataContractError;
1
2
  use wasm_bindgen::JsValue;
2
3
 
3
4
  use super::consensus_error::from_consensus_error;
4
5
 
5
- pub fn from_protocol_error(e: dpp::ProtocolError) -> JsValue {
6
- match e {
6
+ pub fn from_protocol_error(protocol_error: dpp::ProtocolError) -> JsValue {
7
+ match protocol_error {
7
8
  dpp::ProtocolError::AbstractConsensusError(consensus_error) => {
8
9
  from_consensus_error(*consensus_error)
9
10
  }
10
- _ => unimplemented!(),
11
+ dpp::ProtocolError::InvalidDataContractError(err) => {
12
+ let raw_data_contract = err.raw_data_contract();
13
+ let protocol = serde_wasm_bindgen::to_value(&raw_data_contract);
14
+ protocol.map_or_else(JsValue::from, |raw_contract| {
15
+ InvalidDataContractError::new(err.errors, raw_contract).into()
16
+ })
17
+ }
18
+ dpp::ProtocolError::Error(anyhow_error) => {
19
+ format!("Non-protocol error: {}", anyhow_error).into()
20
+ }
21
+ _ => todo!("Implement protocol error conversions"),
11
22
  }
12
23
  }
@@ -0,0 +1,30 @@
1
+ use thiserror::Error;
2
+ use wasm_bindgen::prelude::*;
3
+
4
+ #[derive(Error, Debug)]
5
+ #[wasm_bindgen(js_name=IdentifierError)]
6
+ #[error("{message}")]
7
+ pub struct IdentifierErrorWasm {
8
+ message: String,
9
+ }
10
+
11
+ impl IdentifierErrorWasm {
12
+ pub fn new(message: impl Into<String>) -> Self {
13
+ Self {
14
+ message: message.into(),
15
+ }
16
+ }
17
+ }
18
+
19
+ #[wasm_bindgen(js_class=IdentifierError)]
20
+ impl IdentifierErrorWasm {
21
+ #[wasm_bindgen(js_name=getDataContractId)]
22
+ pub fn get_message(&self) -> String {
23
+ self.message.clone()
24
+ }
25
+
26
+ #[wasm_bindgen(js_name=toString)]
27
+ pub fn print(&self) -> String {
28
+ format!("IdentifierError: {0}", { &self.message })
29
+ }
30
+ }
@@ -1,9 +1,20 @@
1
+ pub mod errors;
2
+
3
+ use dpp::prelude::Identifier;
4
+ use dpp::util::string_encoding::Encoding;
5
+ use itertools::Itertools;
1
6
  pub use serde::{Deserialize, Serialize};
7
+ use serde_json::Value;
2
8
  use wasm_bindgen::prelude::*;
3
9
  use wasm_bindgen::JsCast;
4
10
 
11
+ use crate::bail_js;
5
12
  use crate::buffer::Buffer;
6
13
  use crate::errors::from_dpp_err;
14
+ use crate::identifier::errors::IdentifierErrorWasm;
15
+ use crate::utils::Inner;
16
+ use crate::utils::ToSerdeJSONExt;
17
+ use crate::utils::WithJsError;
7
18
  use dpp::identifier;
8
19
 
9
20
  #[derive(Serialize, Deserialize, PartialEq, Eq)]
@@ -20,6 +31,7 @@ extern "C" {
20
31
  fn log(a: &str);
21
32
  }
22
33
 
34
+ #[derive(Clone, Debug)]
23
35
  #[wasm_bindgen(js_name=Identifier, inspectable)]
24
36
  pub struct IdentifierWrapper {
25
37
  wrapped: identifier::Identifier,
@@ -31,12 +43,32 @@ impl std::convert::From<identifier::Identifier> for IdentifierWrapper {
31
43
  }
32
44
  }
33
45
 
46
+ impl std::convert::From<&IdentifierWrapper> for identifier::Identifier {
47
+ fn from(s: &IdentifierWrapper) -> Self {
48
+ s.wrapped
49
+ }
50
+ }
51
+
52
+ impl std::convert::From<IdentifierWrapper> for Identifier {
53
+ fn from(s: IdentifierWrapper) -> Self {
54
+ s.wrapped
55
+ }
56
+ }
57
+
34
58
  #[wasm_bindgen(js_class=Identifier)]
35
59
  impl IdentifierWrapper {
36
60
  #[wasm_bindgen(constructor)]
37
- pub fn new(buffer: Vec<u8>) -> Result<IdentifierWrapper, JsValue> {
38
- // TODO: remove unwrap
39
- let identifier = identifier::Identifier::from_bytes(&buffer).map_err(from_dpp_err)?;
61
+ pub fn new(js_value: JsValue) -> Result<IdentifierWrapper, JsValue> {
62
+ // Can be possible reworked with Buffer::is_buffer(&js_value)
63
+ // but until we use Buffer shim for both Node and Web,
64
+ // it will return false negative in Node.JS environment
65
+ if !js_value.has_type::<js_sys::Uint8Array>() {
66
+ return Err(IdentifierErrorWasm::new("Identifier expects Buffer").into());
67
+ }
68
+
69
+ let vec = js_value.dyn_into::<js_sys::Uint8Array>()?.to_vec();
70
+
71
+ let identifier = identifier::Identifier::from_bytes(&vec).map_err(from_dpp_err)?;
40
72
 
41
73
  Ok(IdentifierWrapper {
42
74
  wrapped: identifier,
@@ -47,13 +79,12 @@ impl IdentifierWrapper {
47
79
  if value.is_string() {
48
80
  let string = value.as_string().unwrap();
49
81
  Ok(IdentifierWrapper::from_string(string, encoding))
50
- } else if value.has_type::<js_sys::Uint8Array>() {
51
- let vec = value.dyn_into::<js_sys::Uint8Array>()?.to_vec();
52
- IdentifierWrapper::new(vec)
82
+ } else if value.has_type::<js_sys::Uint8Array>() && encoding.is_none() {
83
+ IdentifierWrapper::new(value)
84
+ } else if value.has_type::<js_sys::Uint8Array>() && encoding.is_some() {
85
+ Err(IdentifierErrorWasm::new("encoding accepted only with type string").into())
53
86
  } else {
54
- Err(JsValue::from(
55
- "Identifier.from received an unexpected value",
56
- ))
87
+ Err(IdentifierErrorWasm::new("Identifier.from received an unexpected value").into())
57
88
  }
58
89
  }
59
90
 
@@ -73,7 +104,7 @@ impl IdentifierWrapper {
73
104
 
74
105
  #[wasm_bindgen(js_name=toBuffer)]
75
106
  pub fn to_buffer(&self) -> Buffer {
76
- Buffer::from_bytes(self.wrapped.buffer.as_slice())
107
+ Buffer::from_bytes(&self.wrapped.buffer)
77
108
  }
78
109
 
79
110
  #[wasm_bindgen(js_name=toJSON)]
@@ -97,7 +128,60 @@ impl IdentifierWrapper {
97
128
  self.wrapped.buffer.len()
98
129
  }
99
130
 
100
- pub fn inner(&self) -> Vec<u8> {
131
+ #[wasm_bindgen(js_name=toBytes)]
132
+ pub fn to_bytes(&self) -> Vec<u8> {
101
133
  self.wrapped.buffer.to_vec()
102
134
  }
135
+
136
+ #[wasm_bindgen(js_name=clone)]
137
+ pub fn deep_clone(&self) -> IdentifierWrapper {
138
+ IdentifierWrapper {
139
+ wrapped: self.wrapped,
140
+ }
141
+ }
142
+ }
143
+
144
+ impl Inner for IdentifierWrapper {
145
+ type InnerItem = Identifier;
146
+
147
+ fn into_inner(self) -> Identifier {
148
+ self.wrapped
149
+ }
150
+
151
+ fn inner(&self) -> &Identifier {
152
+ &self.wrapped
153
+ }
154
+
155
+ fn inner_mut(&mut self) -> &mut Identifier {
156
+ &mut self.wrapped
157
+ }
158
+ }
159
+
160
+ // Try to extract Identifier from **stringified** identifier.
161
+ // The `js_value` can be a stringified instance of: `Identifier`, `Buffer` or `Array`
162
+ pub(crate) fn identifier_from_js_value(js_value: &JsValue) -> Result<Identifier, JsValue> {
163
+ if js_value.is_undefined() || js_value.is_null() {
164
+ bail_js!("the identifier cannot be null or undefined")
165
+ }
166
+ let value = js_value.with_serde_to_json_value()?;
167
+ match value {
168
+ Value::Array(arr) => {
169
+ let bytes: Vec<u8> = arr.into_iter().map(value_to_u8).try_collect()?;
170
+ Identifier::from_bytes(&bytes).with_js_error()
171
+ }
172
+ Value::String(string) => Identifier::from_string(&string, Encoding::Base58).with_js_error(),
173
+ _ => {
174
+ bail_js!("Invalid ID. Expected array or string")
175
+ }
176
+ }
177
+ }
178
+
179
+ fn value_to_u8(v: Value) -> Result<u8, JsValue> {
180
+ let number = v
181
+ .as_u64()
182
+ .ok_or_else(|| format!("failed converting {} into u64", v))?;
183
+ if number > u8::MAX as u64 {
184
+ bail_js!("the integer in the array isn't a byte: {}", number);
185
+ }
186
+ Ok(number as u8)
103
187
  }
@@ -0,0 +1,11 @@
1
+ use dpp::identity::errors::AssetLockOutputNotFoundError;
2
+ use wasm_bindgen::prelude::*;
3
+
4
+ #[wasm_bindgen(js_name=AssetLockOutputNotFoundError)]
5
+ pub struct AssetLockOutputNotFoundErrorWasm(AssetLockOutputNotFoundError);
6
+
7
+ impl From<&AssetLockOutputNotFoundError> for AssetLockOutputNotFoundErrorWasm {
8
+ fn from(e: &AssetLockOutputNotFoundError) -> Self {
9
+ Self(e.clone())
10
+ }
11
+ }
@@ -0,0 +1,20 @@
1
+ use dpp::dashcore::hashes::hex::ToHex;
2
+ use dpp::identity::errors::AssetLockTransactionIsNotFoundError;
3
+ use wasm_bindgen::prelude::*;
4
+
5
+ #[wasm_bindgen(js_name=AssetLockTransactionIsNotFoundError)]
6
+ pub struct AssetLockTransactionIsNotFoundErrorWasm(AssetLockTransactionIsNotFoundError);
7
+
8
+ impl From<&AssetLockTransactionIsNotFoundError> for AssetLockTransactionIsNotFoundErrorWasm {
9
+ fn from(e: &AssetLockTransactionIsNotFoundError) -> Self {
10
+ Self(e.clone())
11
+ }
12
+ }
13
+
14
+ #[wasm_bindgen(js_class=AssetLockTransactionIsNotFoundError)]
15
+ impl AssetLockTransactionIsNotFoundErrorWasm {
16
+ #[wasm_bindgen(js_name=getTransactionId)]
17
+ pub fn transaction_id(&self) -> JsValue {
18
+ self.0.transaction_id().to_hex().into()
19
+ }
20
+ }
@@ -0,0 +1,32 @@
1
+ use crate::errors::consensus_error::from_consensus_error_ref;
2
+ use dpp::consensus::ConsensusError;
3
+ use wasm_bindgen::prelude::wasm_bindgen;
4
+ use wasm_bindgen::JsValue;
5
+
6
+ #[wasm_bindgen(js_name=InvalidIdentityError)]
7
+ pub struct InvalidIdentityError {
8
+ errors: Vec<ConsensusError>,
9
+ raw_identity: JsValue,
10
+ }
11
+
12
+ impl InvalidIdentityError {
13
+ pub fn new(errors: Vec<ConsensusError>, raw_identity: JsValue) -> Self {
14
+ InvalidIdentityError {
15
+ errors,
16
+ raw_identity,
17
+ }
18
+ }
19
+ }
20
+
21
+ #[wasm_bindgen(js_class=InvalidIdentityError)]
22
+ impl InvalidIdentityError {
23
+ #[wasm_bindgen(js_name=getErrors)]
24
+ pub fn get_errors(&self) -> Vec<JsValue> {
25
+ self.errors.iter().map(from_consensus_error_ref).collect()
26
+ }
27
+
28
+ #[wasm_bindgen(js_name=getRawIdentity)]
29
+ pub fn get_raw_identity(&self) -> JsValue {
30
+ self.raw_identity.clone()
31
+ }
32
+ }
@@ -0,0 +1,9 @@
1
+ pub use asset_lock_output_not_found_error::*;
2
+ pub use asset_lock_transaction_is_not_found_error::*;
3
+ pub use invalid_identity_error::*;
4
+ pub use unknown_asset_lock_proof_type_error::*;
5
+
6
+ mod asset_lock_output_not_found_error;
7
+ mod asset_lock_transaction_is_not_found_error;
8
+ mod invalid_identity_error;
9
+ mod unknown_asset_lock_proof_type_error;
@@ -0,0 +1,26 @@
1
+ use dpp::identity::errors::UnknownAssetLockProofTypeError;
2
+ use wasm_bindgen::prelude::*;
3
+
4
+ #[derive(Clone)]
5
+ #[wasm_bindgen(js_name=UnknownAssetLockProofTypeError)]
6
+ pub struct UnknownAssetLockProofTypeErrorWasm(UnknownAssetLockProofTypeError);
7
+
8
+ impl From<&UnknownAssetLockProofTypeError> for UnknownAssetLockProofTypeErrorWasm {
9
+ fn from(e: &UnknownAssetLockProofTypeError) -> Self {
10
+ Self(e.clone())
11
+ }
12
+ }
13
+
14
+ impl From<UnknownAssetLockProofTypeError> for UnknownAssetLockProofTypeErrorWasm {
15
+ fn from(e: UnknownAssetLockProofTypeError) -> Self {
16
+ Self(e)
17
+ }
18
+ }
19
+
20
+ #[wasm_bindgen(js_class=UnknownAssetLockProofTypeError)]
21
+ impl UnknownAssetLockProofTypeErrorWasm {
22
+ #[wasm_bindgen(js_name=getType)]
23
+ pub fn get_type(&self) -> Option<u8> {
24
+ self.0.asset_lock_type()
25
+ }
26
+ }
@@ -0,0 +1,87 @@
1
+ use crate::errors::RustConversionError;
2
+ use crate::identity::identity_public_key_transitions::IdentityPublicKeyCreateTransitionWasm;
3
+ use crate::utils::{generic_of_js_val, to_vec_of_serde_values};
4
+ use crate::{create_asset_lock_proof_from_wasm_instance, IdentityPublicKeyWasm};
5
+ use dpp::identity::state_transition::asset_lock_proof::AssetLockProof;
6
+ use dpp::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyCreateTransition;
7
+ use dpp::identity::{IdentityPublicKey, KeyID};
8
+ use std::collections::BTreeMap;
9
+ use wasm_bindgen::__rt::Ref;
10
+ use wasm_bindgen::{JsCast, JsValue};
11
+
12
+ pub fn parse_create_args(
13
+ asset_lock_proof: JsValue,
14
+ public_keys: js_sys::Array,
15
+ ) -> Result<(AssetLockProof, BTreeMap<KeyID, IdentityPublicKey>), JsValue> {
16
+ let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?;
17
+
18
+ let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?;
19
+
20
+ let public_keys = raw_public_keys
21
+ .into_iter()
22
+ .map(|v| IdentityPublicKey::from_raw_object(v).map(|key| (key.id, key)))
23
+ .collect::<Result<_, _>>()
24
+ .map_err(|e| format!("converting to collection of IdentityPublicKeys failed: {e:#}"))?;
25
+
26
+ Ok((asset_lock_proof, public_keys))
27
+ }
28
+
29
+ type AddPublicKeys = Option<Vec<IdentityPublicKeyCreateTransition>>;
30
+ type DisablePublicKeys = Option<Vec<KeyID>>;
31
+
32
+ pub fn parse_create_identity_update_transition_keys(
33
+ public_keys: &JsValue,
34
+ ) -> Result<(AddPublicKeys, DisablePublicKeys), JsValue> {
35
+ let mut add_public_keys = None;
36
+
37
+ if js_sys::Reflect::has(public_keys, &"add".into()).unwrap_or(false) {
38
+ let raw_add_public_keys = js_sys::Reflect::get(public_keys, &"add".into()).unwrap();
39
+
40
+ let add_public_keys_array: &js_sys::Array = raw_add_public_keys
41
+ .dyn_ref::<js_sys::Array>()
42
+ .ok_or_else(|| {
43
+ RustConversionError::Error(String::from("public keys to add must be array"))
44
+ .to_js_value()
45
+ })?;
46
+
47
+ let keys: Vec<IdentityPublicKeyCreateTransition> = add_public_keys_array
48
+ .iter()
49
+ .map(|key| {
50
+ let public_key: Ref<IdentityPublicKeyCreateTransitionWasm> =
51
+ generic_of_js_val::<IdentityPublicKeyCreateTransitionWasm>(
52
+ &key,
53
+ "IdentityPublicKeyCreateTransition",
54
+ )?;
55
+
56
+ Ok(public_key.clone().into())
57
+ })
58
+ .collect::<Result<Vec<IdentityPublicKeyCreateTransition>, JsValue>>()?;
59
+
60
+ add_public_keys = Some(keys)
61
+ }
62
+
63
+ let mut disable_public_keys = None;
64
+
65
+ if js_sys::Reflect::has(public_keys, &"disable".into()).unwrap_or(false) {
66
+ let raw_disable_public_keys = js_sys::Reflect::get(public_keys, &"disable".into()).unwrap();
67
+ let disable_public_keys_array: &js_sys::Array = raw_disable_public_keys
68
+ .dyn_ref::<js_sys::Array>()
69
+ .ok_or_else(|| {
70
+ RustConversionError::Error(String::from("public keys to disable must be array"))
71
+ .to_js_value()
72
+ })?;
73
+
74
+ let keys: Vec<KeyID> = disable_public_keys_array
75
+ .iter()
76
+ .map(|key| {
77
+ let public_key_wasm: Ref<IdentityPublicKeyWasm> =
78
+ generic_of_js_val::<IdentityPublicKeyWasm>(&key, "IdentityPublicKey")?;
79
+ Ok(public_key_wasm.get_id())
80
+ })
81
+ .collect::<Result<Vec<KeyID>, JsValue>>()?;
82
+
83
+ disable_public_keys = Some(keys)
84
+ }
85
+
86
+ Ok((add_public_keys, disable_public_keys))
87
+ }