@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,73 +1,301 @@
1
1
  //! Bindings for state repository -like objects coming from JS.
2
2
 
3
- use std::{convert::Infallible, pin::Pin, sync::Mutex};
3
+ use serde::{Deserialize, Serialize};
4
+ use std::convert::Infallible;
5
+ use std::sync::Arc;
4
6
 
7
+ use anyhow::{anyhow, bail};
5
8
  use async_trait::async_trait;
9
+ use dpp::dashcore::consensus;
10
+ use dpp::identity::{IdentityPublicKey, KeyID};
11
+ use dpp::prelude::{Revision, TimestampMillis};
6
12
  use dpp::{
7
13
  dashcore::InstantLock,
8
14
  data_contract::DataContract,
9
15
  document::Document,
10
16
  prelude::{Identifier, Identity},
11
- state_repository::StateRepositoryLike,
17
+ state_repository::{
18
+ FetchTransactionResponse as FetchTransactionResponseDPP, StateRepositoryLike,
19
+ },
12
20
  state_transition::state_transition_execution_context::StateTransitionExecutionContext,
13
21
  };
22
+ use js_sys::Uint8Array;
23
+ use js_sys::{Array, Number};
24
+ use wasm_bindgen::__rt::Ref;
25
+
14
26
  use wasm_bindgen::prelude::*;
15
27
 
16
- use crate::{identifier::IdentifierWrapper, DataContractWasm, StateTransitionExecutionContextWasm};
28
+ use crate::buffer::Buffer;
29
+ use crate::errors::from_js_error;
30
+ use crate::utils::generic_of_js_val;
31
+ use crate::IdentityPublicKeyWasm;
32
+ use crate::{
33
+ identifier::IdentifierWrapper, utils::IntoWasm, DataContractWasm, DocumentWasm, IdentityWasm,
34
+ StateTransitionExecutionContextWasm,
35
+ };
17
36
 
18
37
  #[wasm_bindgen]
19
38
  extern "C" {
39
+ #[derive(Clone)]
20
40
  pub type ExternalStateRepositoryLike;
21
41
 
22
- #[wasm_bindgen(structural, method, js_name=fetchDataContract)]
23
- pub fn fetch_data_contract(
42
+ #[wasm_bindgen(catch, structural, method, js_name=fetchDataContract)]
43
+ pub async fn fetch_data_contract(
24
44
  this: &ExternalStateRepositoryLike,
25
45
  data_contract_id: IdentifierWrapper,
26
46
  execution_context: StateTransitionExecutionContextWasm,
27
- ) -> Option<DataContractWasm>;
47
+ ) -> Result<JsValue, JsValue>;
48
+
49
+ #[wasm_bindgen(catch, structural, method, js_name=storeDataContract)]
50
+ pub async fn store_data_contract(
51
+ this: &ExternalStateRepositoryLike,
52
+ data_contract: DataContractWasm,
53
+ execution_context: StateTransitionExecutionContextWasm,
54
+ ) -> Result<(), JsValue>;
55
+
56
+ #[wasm_bindgen(catch, structural, method, js_name=createDocument)]
57
+ pub async fn create_document(
58
+ this: &ExternalStateRepositoryLike,
59
+ document: DocumentWasm,
60
+ execution_context: StateTransitionExecutionContextWasm,
61
+ ) -> Result<(), JsValue>;
62
+
63
+ #[wasm_bindgen(catch, structural, method, js_name=updateDocument)]
64
+ pub async fn update_document(
65
+ this: &ExternalStateRepositoryLike,
66
+ document: DocumentWasm,
67
+ execution_context: StateTransitionExecutionContextWasm,
68
+ ) -> Result<(), JsValue>;
28
69
 
29
- #[wasm_bindgen(structural, method, js_name=storeDataContract)]
30
- pub fn store_data_contract(
70
+ #[wasm_bindgen(catch, structural, method, js_name=removeDocument)]
71
+ pub async fn remove_document(
31
72
  this: &ExternalStateRepositoryLike,
32
73
  data_contract: DataContractWasm,
74
+ data_contract_type: String,
75
+ document_id: IdentifierWrapper,
76
+ execution_context: StateTransitionExecutionContextWasm,
77
+ ) -> Result<(), JsValue>;
78
+
79
+ #[wasm_bindgen(catch, structural, method, js_name=fetchDocuments)]
80
+ pub async fn fetch_documents(
81
+ this: &ExternalStateRepositoryLike,
82
+ data_contract_id: IdentifierWrapper,
83
+ data_contract_type: String,
84
+ where_query: JsValue,
85
+ execution_context: StateTransitionExecutionContextWasm,
86
+ ) -> Result<JsValue, JsValue>;
87
+
88
+ #[wasm_bindgen(catch, structural, method, js_name=fetchIdentity)]
89
+ pub async fn fetch_identity(
90
+ this: &ExternalStateRepositoryLike,
91
+ id: IdentifierWrapper,
92
+ execution_context: StateTransitionExecutionContextWasm,
93
+ ) -> Result<JsValue, JsValue>;
94
+
95
+ #[wasm_bindgen(catch, structural, method, js_name=createIdentity)]
96
+ pub async fn create_identity(
97
+ this: &ExternalStateRepositoryLike,
98
+ identity: IdentityWasm,
99
+ execution_context: StateTransitionExecutionContextWasm,
100
+ ) -> Result<(), JsValue>;
101
+
102
+ #[wasm_bindgen(catch, structural, method, js_name=addKeysToIdentity)]
103
+ pub async fn add_keys_to_identity(
104
+ this: &ExternalStateRepositoryLike,
105
+ identity_id: IdentifierWrapper,
106
+ keys: js_sys::Array,
107
+ execution_context: StateTransitionExecutionContextWasm,
108
+ ) -> Result<(), JsValue>;
109
+
110
+ #[wasm_bindgen(catch, structural, method, js_name=disableIdentityKeys)]
111
+ pub async fn disable_identity_keys(
112
+ this: &ExternalStateRepositoryLike,
113
+ identity_id: IdentifierWrapper,
114
+ keys: js_sys::Array,
115
+ disable_at: Number,
116
+ execution_context: StateTransitionExecutionContextWasm,
117
+ ) -> Result<(), JsValue>;
118
+
119
+ #[wasm_bindgen(catch, structural, method, js_name=updateIdentityRevision)]
120
+ pub async fn update_identity_revision(
121
+ this: &ExternalStateRepositoryLike,
122
+ identity_id: IdentifierWrapper,
123
+ revision: Number,
124
+ execution_context: StateTransitionExecutionContextWasm,
125
+ ) -> Result<(), JsValue>;
126
+
127
+ #[wasm_bindgen(catch, structural, method, js_name=fetchIdentityBalance)]
128
+ pub async fn fetch_identity_balance(
129
+ this: &ExternalStateRepositoryLike,
130
+ identity_id: IdentifierWrapper,
131
+ execution_context: StateTransitionExecutionContextWasm,
132
+ ) -> Result<JsValue, JsValue>;
133
+
134
+ #[wasm_bindgen(catch, structural, method, js_name=fetchIdentityBalanceWithDebt)]
135
+ pub async fn fetch_identity_balance_with_debt(
136
+ this: &ExternalStateRepositoryLike,
137
+ identity_id: IdentifierWrapper,
138
+ execution_context: StateTransitionExecutionContextWasm,
139
+ ) -> Result<JsValue, JsValue>;
140
+
141
+ #[wasm_bindgen(catch, structural, method, js_name=addToIdentityBalance)]
142
+ pub async fn add_to_identity_balance(
143
+ this: &ExternalStateRepositoryLike,
144
+ identity_id: IdentifierWrapper,
145
+ amount: Number,
146
+ execution_context: StateTransitionExecutionContextWasm,
147
+ ) -> Result<(), JsValue>;
148
+
149
+ #[wasm_bindgen(catch, structural, method, js_name=removeFromIdentityBalance)]
150
+ pub async fn remove_from_identity_balance(
151
+ this: &ExternalStateRepositoryLike,
152
+ identity_id: IdentifierWrapper,
153
+ amount: Number,
154
+ execution_context: StateTransitionExecutionContextWasm,
155
+ ) -> Result<(), JsValue>;
156
+
157
+ #[wasm_bindgen(catch, structural, method, js_name=addToSystemCredits)]
158
+ pub async fn add_to_system_credits(
159
+ this: &ExternalStateRepositoryLike,
160
+ amount: Number,
161
+ execution_context: StateTransitionExecutionContextWasm,
162
+ ) -> Result<(), JsValue>;
163
+
164
+ #[wasm_bindgen(catch, structural, method, js_name=removeFromSystemCredits)]
165
+ pub async fn remove_from_system_credits(
166
+ this: &ExternalStateRepositoryLike,
167
+ amount: Number,
168
+ execution_context: StateTransitionExecutionContextWasm,
169
+ ) -> Result<JsValue, JsValue>;
170
+
171
+ #[wasm_bindgen(catch, structural, method, js_name=fetchLatestPlatformCoreChainLockedHeight)]
172
+ pub async fn fetch_latest_platform_core_chain_locked_height(
173
+ this: &ExternalStateRepositoryLike,
174
+ ) -> Result<JsValue, JsValue>;
175
+
176
+ #[wasm_bindgen(catch, structural, method, js_name=fetchLatestPlatformBlockHeight)]
177
+ pub async fn fetch_latest_platform_block_height(
178
+ this: &ExternalStateRepositoryLike,
179
+ ) -> Result<JsValue, JsValue>;
180
+
181
+ #[wasm_bindgen(catch, structural, method, js_name=fetchTransaction)]
182
+ pub async fn fetch_transaction(
183
+ this: &ExternalStateRepositoryLike,
184
+ id: JsValue,
185
+ execution_context: StateTransitionExecutionContextWasm,
186
+ ) -> Result<JsValue, JsValue>;
187
+
188
+ #[wasm_bindgen(catch, structural, method, js_name=isAssetLockTransactionOutPointAlreadyUsed)]
189
+ pub async fn is_asset_lock_transaction_out_point_already_used(
190
+ this: &ExternalStateRepositoryLike,
191
+ out_point_buffer: Buffer,
192
+ execution_context: StateTransitionExecutionContextWasm,
193
+ ) -> Result<JsValue, JsValue>;
194
+
195
+ #[wasm_bindgen(catch, structural, method, js_name=verifyInstantLock)]
196
+ pub async fn verify_instant_lock(
197
+ this: &ExternalStateRepositoryLike,
198
+ instant_lock: Vec<u8>,
199
+ execution_context: StateTransitionExecutionContextWasm,
200
+ ) -> Result<JsValue, JsValue>;
201
+
202
+ #[wasm_bindgen(catch, structural, method, js_name=markAssetLockTransactionOutPointAsUsed)]
203
+ pub async fn mark_asset_lock_transaction_out_point_as_used(
204
+ this: &ExternalStateRepositoryLike,
205
+ out_point_buffer: Buffer,
33
206
  execution_context: StateTransitionExecutionContextWasm,
34
- ) -> JsValue;
207
+ ) -> Result<(), JsValue>;
208
+
209
+ #[wasm_bindgen(catch, structural, method, js_name=fetchLatestPlatformBlockHeader)]
210
+ pub async fn fetch_latest_platform_block_header(
211
+ this: &ExternalStateRepositoryLike,
212
+ ) -> Result<JsValue, JsValue>;
213
+
214
+ #[wasm_bindgen(catch, structural, method, js_name=fetchLatestPlatformBlockTime)]
215
+ pub async fn fetch_latest_platform_block_time(
216
+ this: &ExternalStateRepositoryLike,
217
+ ) -> Result<JsValue, JsValue>;
35
218
 
36
219
  // TODO add missing declarations
37
220
  }
38
221
 
39
222
  /// Wraps external duck-typed thing into pinned box with mutex to ensure it'll stay at the same
40
223
  /// place in memory and will have synchronized access.
41
- pub(crate) struct ExternalStateRepositoryLikeWrapper(Pin<Box<Mutex<ExternalStateRepositoryLike>>>); // bruh
224
+ #[derive(Clone)]
225
+ pub(crate) struct ExternalStateRepositoryLikeWrapper(Arc<ExternalStateRepositoryLike>);
42
226
 
43
227
  unsafe impl Send for ExternalStateRepositoryLikeWrapper {}
44
228
  unsafe impl Sync for ExternalStateRepositoryLikeWrapper {}
45
229
 
46
230
  impl ExternalStateRepositoryLikeWrapper {
47
231
  pub(crate) fn new(state_repository: ExternalStateRepositoryLike) -> Self {
48
- ExternalStateRepositoryLikeWrapper(Box::pin(Mutex::new(state_repository)))
232
+ ExternalStateRepositoryLikeWrapper(Arc::new(state_repository))
233
+ }
234
+
235
+ pub(crate) fn new_with_arc(state_repository: Arc<ExternalStateRepositoryLike>) -> Self {
236
+ ExternalStateRepositoryLikeWrapper(state_repository)
237
+ }
238
+ }
239
+
240
+ #[derive(Clone, Serialize, Deserialize)]
241
+ pub struct FetchTransactionResponse {
242
+ pub height: Option<u32>,
243
+ pub data: Option<Vec<u8>>,
244
+ }
245
+
246
+ impl From<JsValue> for FetchTransactionResponse {
247
+ fn from(v: JsValue) -> Self {
248
+ if v.is_falsy() {
249
+ FetchTransactionResponse {
250
+ height: Some(0),
251
+ data: None,
252
+ }
253
+ } else {
254
+ serde_wasm_bindgen::from_value(v).unwrap()
255
+ }
49
256
  }
50
257
  }
51
258
 
52
- #[async_trait]
259
+ impl From<FetchTransactionResponse> for FetchTransactionResponseDPP {
260
+ fn from(v: FetchTransactionResponse) -> Self {
261
+ FetchTransactionResponseDPP {
262
+ data: v.data,
263
+ height: v.height,
264
+ }
265
+ }
266
+ }
267
+
268
+ #[async_trait(?Send)]
53
269
  impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper {
54
270
  type ConversionError = Infallible;
55
271
  type FetchDataContract = DataContractWasm;
272
+ type FetchDocument = DocumentWasm;
273
+ type FetchIdentity = IdentityWasm;
274
+ type FetchTransaction = FetchTransactionResponse;
56
275
 
57
276
  async fn fetch_data_contract(
58
277
  &self,
59
278
  data_contract_id: &Identifier,
60
279
  execution_context: &StateTransitionExecutionContext,
61
280
  ) -> anyhow::Result<Option<Self::FetchDataContract>> {
62
- Ok(self
281
+ let maybe_data_contract: JsValue = self
63
282
  .0
64
- .lock()
65
- .expect("unexpected concurrency issue!")
66
- .fetch_data_contract(
67
- data_contract_id.clone().into(),
68
- execution_context.clone().into(),
69
- )
70
- .map(Into::into))
283
+ .fetch_data_contract((*data_contract_id).into(), execution_context.clone().into())
284
+ .await
285
+ .map_err(from_js_error)?;
286
+
287
+ if maybe_data_contract.is_undefined() || maybe_data_contract.is_null() {
288
+ return Ok(None);
289
+ }
290
+
291
+ let data_contract_conversion_result: Result<Ref<DataContractWasm>, JsValue> =
292
+ generic_of_js_val::<DataContractWasm>(&maybe_data_contract, "DataContract");
293
+
294
+ let data_contract = data_contract_conversion_result
295
+ .map_err(from_js_error)?
296
+ .to_owned();
297
+
298
+ Ok(Some(data_contract))
71
299
  }
72
300
 
73
301
  async fn store_data_contract(
@@ -76,142 +304,384 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper {
76
304
  execution_context: &StateTransitionExecutionContext,
77
305
  ) -> anyhow::Result<()> {
78
306
  self.0
79
- .lock()
80
- .expect("unexpected concurrency issue!")
81
- .store_data_contract(data_contract.into(), execution_context.clone().into());
82
- Ok(())
307
+ .store_data_contract(data_contract.into(), execution_context.clone().into())
308
+ .await
309
+ .map_err(from_js_error)
83
310
  }
84
311
 
85
- async fn fetch_documents<T>(
312
+ async fn fetch_documents(
86
313
  &self,
87
- _contract_id: &Identifier,
88
- _data_contract_type: &str,
89
- _where_query: serde_json::Value,
90
- _execution_context: &StateTransitionExecutionContext,
91
- ) -> anyhow::Result<Vec<T>>
92
- where
93
- T: for<'de> serde::de::Deserialize<'de> + 'static,
94
- {
95
- todo!()
314
+ contract_id: &Identifier,
315
+ data_contract_type: &str,
316
+ where_query: serde_json::Value,
317
+ execution_context: &StateTransitionExecutionContext,
318
+ ) -> anyhow::Result<Vec<Self::FetchDocument>> {
319
+ let js_documents = self
320
+ .0
321
+ .fetch_documents(
322
+ contract_id.to_owned().into(),
323
+ data_contract_type.to_owned(),
324
+ where_query
325
+ .serialize(&serde_wasm_bindgen::Serializer::json_compatible())
326
+ .map_err(|e| anyhow!("serialization error: {}", e))?,
327
+ execution_context.clone().into(),
328
+ )
329
+ .await
330
+ .map_err(from_js_error)?;
331
+ let js_documents_array = js_sys::Array::from(&js_documents);
332
+
333
+ let mut documents: Vec<DocumentWasm> = vec![];
334
+ for js_document in js_documents_array.iter() {
335
+ let document = js_document
336
+ .to_wasm::<DocumentWasm>("Document")
337
+ .map_err(|e| anyhow!("{e:#?}"))?;
338
+ documents.push(document.to_owned());
339
+ }
340
+ Ok(documents)
96
341
  }
97
342
 
98
343
  async fn create_document(
99
344
  &self,
100
- _document: &Document,
101
- _execution_context: &StateTransitionExecutionContext,
345
+ document: &Document,
346
+ execution_context: &StateTransitionExecutionContext,
102
347
  ) -> anyhow::Result<()> {
103
- todo!()
348
+ let document_wasm: DocumentWasm = document.to_owned().into();
349
+ self.0
350
+ .create_document(document_wasm, execution_context.clone().into())
351
+ .await
352
+ .map_err(from_js_error)
104
353
  }
105
354
 
106
355
  async fn update_document(
107
356
  &self,
108
- _document: &Document,
109
- _execution_context: &StateTransitionExecutionContext,
357
+ document: &Document,
358
+ execution_context: &StateTransitionExecutionContext,
110
359
  ) -> anyhow::Result<()> {
111
- todo!()
360
+ let document_wasm: DocumentWasm = document.to_owned().into();
361
+ self.0
362
+ .update_document(document_wasm, execution_context.clone().into())
363
+ .await
364
+ .map_err(from_js_error)
112
365
  }
113
366
 
114
367
  async fn remove_document(
115
368
  &self,
116
- _data_contract: &DataContract,
117
- _data_contract_type: &str,
118
- _document_id: &Identifier,
119
- _execution_context: &StateTransitionExecutionContext,
369
+ data_contract: &DataContract,
370
+ data_contract_type: &str,
371
+ document_id: &Identifier,
372
+ execution_context: &StateTransitionExecutionContext,
120
373
  ) -> anyhow::Result<()> {
121
- todo!()
374
+ let data_contract: DataContractWasm = data_contract.to_owned().into();
375
+ let document_id: IdentifierWrapper = document_id.to_owned().into();
376
+ self.0
377
+ .remove_document(
378
+ data_contract,
379
+ data_contract_type.to_owned(),
380
+ document_id,
381
+ execution_context.clone().into(),
382
+ )
383
+ .await
384
+ .map_err(from_js_error)
122
385
  }
123
386
 
124
- async fn fetch_transaction<T>(
387
+ async fn fetch_transaction(
125
388
  &self,
126
- _id: &str,
127
- _execution_context: &StateTransitionExecutionContext,
128
- ) -> anyhow::Result<Option<T>>
129
- where
130
- T: for<'de> serde::de::Deserialize<'de> + 'static,
131
- {
132
- todo!()
389
+ id: &str,
390
+ execution_context: &StateTransitionExecutionContext,
391
+ ) -> anyhow::Result<Self::FetchTransaction> {
392
+ let transaction_data = self
393
+ .0
394
+ .fetch_transaction(JsValue::from_str(id), execution_context.into())
395
+ .await
396
+ .map_err(from_js_error)?;
397
+
398
+ Ok(FetchTransactionResponse::from(transaction_data))
133
399
  }
134
400
 
135
- async fn fetch_identity<T>(
401
+ async fn fetch_identity(
136
402
  &self,
137
- _id: &Identifier,
138
- _execution_context: &StateTransitionExecutionContext,
139
- ) -> anyhow::Result<Option<T>>
140
- where
141
- T: for<'de> serde::de::Deserialize<'de> + 'static,
142
- {
143
- todo!()
403
+ id: &Identifier,
404
+ execution_context: &StateTransitionExecutionContext,
405
+ ) -> anyhow::Result<Option<Self::FetchIdentity>> {
406
+ let maybe_identity = self
407
+ .0
408
+ .fetch_identity((*id).into(), execution_context.clone().into())
409
+ .await
410
+ .map_err(from_js_error)?;
411
+
412
+ if maybe_identity.is_undefined() {
413
+ return Ok(None);
414
+ }
415
+
416
+ let identity_conversion_result: Result<Ref<IdentityWasm>, JsValue> =
417
+ generic_of_js_val::<IdentityWasm>(&maybe_identity, "Identity");
418
+
419
+ let identity = identity_conversion_result
420
+ .map_err(from_js_error)?
421
+ .to_owned();
422
+
423
+ Ok(Some(identity))
144
424
  }
145
425
 
146
- async fn store_identity_public_key_hashes(
426
+ async fn create_identity(
147
427
  &self,
148
- _identity_id: &Identifier,
149
- _public_key_hashes: Vec<Vec<u8>>,
150
- _execution_context: &StateTransitionExecutionContext,
428
+ identity: &Identity,
429
+ execution_context: &StateTransitionExecutionContext,
151
430
  ) -> anyhow::Result<()> {
152
- todo!()
431
+ self.0
432
+ .create_identity(identity.clone().into(), execution_context.clone().into())
433
+ .await
434
+ .map_err(from_js_error)
153
435
  }
154
436
 
155
- async fn fetch_identity_by_public_key_hashes<T>(
437
+ async fn add_keys_to_identity(
156
438
  &self,
157
- _public_key_hashed: Vec<Vec<u8>>,
158
- ) -> anyhow::Result<Vec<T>>
159
- where
160
- T: for<'de> serde::de::Deserialize<'de> + 'static,
161
- {
162
- todo!()
439
+ identity_id: &Identifier,
440
+ keys: &[IdentityPublicKey],
441
+ execution_context: &StateTransitionExecutionContext,
442
+ ) -> anyhow::Result<()> {
443
+ self.0
444
+ .add_keys_to_identity(
445
+ (*identity_id).into(),
446
+ keys.iter()
447
+ .map(|k| JsValue::from(IdentityPublicKeyWasm::from(k.clone())))
448
+ .collect::<Array>(),
449
+ execution_context.clone().into(),
450
+ )
451
+ .await
452
+ .map_err(from_js_error)
163
453
  }
164
454
 
165
- async fn fetch_latest_platform_block_header<T>(&self) -> anyhow::Result<T>
166
- where
167
- T: for<'de> serde::de::Deserialize<'de> + 'static,
168
- {
169
- todo!()
455
+ async fn disable_identity_keys(
456
+ &self,
457
+ identity_id: &Identifier,
458
+ keys: &[KeyID],
459
+ disable_at: TimestampMillis,
460
+ execution_context: &StateTransitionExecutionContext,
461
+ ) -> anyhow::Result<()> {
462
+ self.0
463
+ .disable_identity_keys(
464
+ (*identity_id).into(),
465
+ keys.iter().map(|&k| JsValue::from(k as f64)).collect(),
466
+ Number::from(disable_at as f64),
467
+ execution_context.clone().into(),
468
+ )
469
+ .await
470
+ .map_err(from_js_error)
170
471
  }
171
472
 
172
- async fn verify_instant_lock(
473
+ async fn update_identity_revision(
173
474
  &self,
174
- _instant_lock: &InstantLock,
175
- _execution_context: &StateTransitionExecutionContext,
176
- ) -> anyhow::Result<bool> {
177
- todo!()
475
+ identity_id: &Identifier,
476
+ revision: Revision,
477
+ execution_context: &StateTransitionExecutionContext,
478
+ ) -> anyhow::Result<()> {
479
+ self.0
480
+ .update_identity_revision(
481
+ (*identity_id).into(),
482
+ Number::from(revision as f64), // TODO: We should use BigInt
483
+ execution_context.clone().into(),
484
+ )
485
+ .await
486
+ .map_err(from_js_error)
178
487
  }
179
488
 
180
- async fn is_asset_lock_transaction_out_point_already_used(
489
+ async fn fetch_identity_balance(
181
490
  &self,
182
- _out_point_buffer: &[u8],
183
- _execution_context: &StateTransitionExecutionContext,
184
- ) -> anyhow::Result<bool> {
185
- todo!()
491
+ identity_id: &Identifier,
492
+ execution_context: &StateTransitionExecutionContext,
493
+ ) -> anyhow::Result<Option<u64>> {
494
+ let maybe_balance = self
495
+ .0
496
+ .fetch_identity_balance((*identity_id).into(), execution_context.clone().into())
497
+ .await
498
+ .map_err(from_js_error)?;
499
+
500
+ if maybe_balance.is_undefined() {
501
+ return Ok(None);
502
+ }
503
+
504
+ let balance = maybe_balance
505
+ .as_f64()
506
+ .ok_or_else(|| anyhow!("Value is not a number"))?;
507
+
508
+ Ok(Some(balance as u64))
186
509
  }
187
510
 
188
- async fn mark_asset_lock_transaction_out_point_as_used(
511
+ async fn fetch_identity_balance_with_debt(
512
+ &self,
513
+ identity_id: &Identifier,
514
+ execution_context: &StateTransitionExecutionContext,
515
+ ) -> anyhow::Result<Option<i64>> {
516
+ let maybe_balance = self
517
+ .0
518
+ .fetch_identity_balance_with_debt(
519
+ (*identity_id).into(),
520
+ execution_context.clone().into(),
521
+ )
522
+ .await
523
+ .map_err(from_js_error)?;
524
+
525
+ if maybe_balance.is_undefined() {
526
+ return Ok(None);
527
+ }
528
+
529
+ let balance = maybe_balance
530
+ .as_f64()
531
+ .ok_or_else(|| anyhow!("Value is not a number"))?;
532
+
533
+ Ok(Some(balance as i64))
534
+ }
535
+
536
+ async fn add_to_identity_balance(
189
537
  &self,
190
- _out_point_buffer: &[u8],
538
+ identity_id: &Identifier,
539
+ amount: u64,
540
+ execution_context: &StateTransitionExecutionContext,
191
541
  ) -> anyhow::Result<()> {
192
- todo!()
542
+ self.0
543
+ .add_to_identity_balance(
544
+ (*identity_id).into(),
545
+ Number::from(amount as f64),
546
+ execution_context.clone().into(),
547
+ )
548
+ .await
549
+ .map_err(from_js_error)
193
550
  }
194
551
 
195
- async fn fetch_sml_store<T>(&self) -> anyhow::Result<T>
196
- where
197
- T: for<'de> serde::de::Deserialize<'de> + 'static,
198
- {
199
- todo!()
552
+ async fn remove_from_identity_balance(
553
+ &self,
554
+ identity_id: &Identifier,
555
+ amount: u64,
556
+ execution_context: &StateTransitionExecutionContext,
557
+ ) -> anyhow::Result<()> {
558
+ self.0
559
+ .remove_from_identity_balance(
560
+ (*identity_id).into(),
561
+ Number::from(amount as f64),
562
+ execution_context.clone().into(),
563
+ )
564
+ .await
565
+ .map_err(from_js_error)
200
566
  }
201
567
 
202
- async fn create_identity(
568
+ async fn add_to_system_credits(
569
+ &self,
570
+ amount: u64,
571
+ execution_context: &StateTransitionExecutionContext,
572
+ ) -> anyhow::Result<()> {
573
+ self.0
574
+ .add_to_system_credits(
575
+ Number::from(amount as f64),
576
+ execution_context.clone().into(),
577
+ )
578
+ .await
579
+ .map_err(from_js_error)
580
+ }
581
+
582
+ async fn remove_from_system_credits(
203
583
  &self,
204
- _identity: &Identity,
584
+ _amount: u64,
205
585
  _execution_context: &StateTransitionExecutionContext,
206
586
  ) -> anyhow::Result<()> {
207
587
  todo!()
208
588
  }
209
589
 
210
- async fn update_identity(
590
+ async fn fetch_latest_platform_block_header(&self) -> anyhow::Result<Vec<u8>> {
591
+ let value: JsValue = self
592
+ .0
593
+ .fetch_latest_platform_block_header()
594
+ .await
595
+ .map_err(from_js_error)?;
596
+
597
+ Ok(Uint8Array::new(&value).to_vec())
598
+ }
599
+
600
+ async fn fetch_latest_platform_core_chain_locked_height(&self) -> anyhow::Result<Option<u32>> {
601
+ let maybe_height = self
602
+ .0
603
+ .fetch_latest_platform_core_chain_locked_height()
604
+ .await
605
+ .map_err(from_js_error)?;
606
+
607
+ if maybe_height.is_undefined() {
608
+ return Ok(None);
609
+ }
610
+
611
+ let height = maybe_height
612
+ .as_f64()
613
+ .ok_or_else(|| anyhow!("Value is not a number"))?;
614
+ Ok(Some(height as u32))
615
+ }
616
+
617
+ async fn fetch_latest_platform_block_height(&self) -> anyhow::Result<u64> {
618
+ let height = self
619
+ .0
620
+ .fetch_latest_platform_block_height()
621
+ .await
622
+ .map_err(from_js_error)?;
623
+
624
+ let height = height
625
+ .as_f64()
626
+ .ok_or_else(|| anyhow!("Value is not a number"))?;
627
+ Ok(height as u64)
628
+ }
629
+
630
+ async fn verify_instant_lock(
211
631
  &self,
212
- _identity: &Identity,
213
- _execution_context: &StateTransitionExecutionContext,
632
+ instant_lock: &InstantLock,
633
+ execution_context: &StateTransitionExecutionContext,
634
+ ) -> anyhow::Result<bool> {
635
+ let raw_instant_lock = consensus::serialize(instant_lock);
636
+
637
+ let verification_result = self
638
+ .0
639
+ .verify_instant_lock(raw_instant_lock, execution_context.clone().into())
640
+ .await
641
+ .map_err(from_js_error)?;
642
+
643
+ verification_result
644
+ .as_bool()
645
+ .ok_or_else(|| anyhow!("Value is not a bool"))
646
+ }
647
+
648
+ async fn is_asset_lock_transaction_out_point_already_used(
649
+ &self,
650
+ out_point_buffer: &[u8],
651
+ execution_context: &StateTransitionExecutionContext,
652
+ ) -> anyhow::Result<bool> {
653
+ let is_used = self
654
+ .0
655
+ .is_asset_lock_transaction_out_point_already_used(
656
+ Buffer::from_bytes(out_point_buffer),
657
+ execution_context.clone().into(),
658
+ )
659
+ .await
660
+ .map_err(from_js_error)?;
661
+
662
+ is_used
663
+ .as_bool()
664
+ .ok_or_else(|| anyhow!("Value is not a bool"))
665
+ }
666
+
667
+ async fn mark_asset_lock_transaction_out_point_as_used(
668
+ &self,
669
+ out_point_buffer: &[u8],
670
+ execution_context: &StateTransitionExecutionContext,
214
671
  ) -> anyhow::Result<()> {
672
+ self.0
673
+ .mark_asset_lock_transaction_out_point_as_used(
674
+ Buffer::from_bytes(out_point_buffer),
675
+ execution_context.clone().into(),
676
+ )
677
+ .await
678
+ .map_err(from_js_error)
679
+ }
680
+
681
+ async fn fetch_sml_store<T>(&self) -> anyhow::Result<T>
682
+ where
683
+ T: for<'de> serde::de::Deserialize<'de> + 'static,
684
+ {
215
685
  todo!()
216
686
  }
217
687
 
@@ -226,4 +696,31 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper {
226
696
  ) -> anyhow::Result<()> {
227
697
  todo!()
228
698
  }
699
+
700
+ async fn fetch_latest_platform_block_time(&self) -> anyhow::Result<u64> {
701
+ let js_number = self
702
+ .0
703
+ .fetch_latest_platform_block_time()
704
+ .await
705
+ .map_err(from_js_error)?;
706
+
707
+ if let Some(float_number) = js_number.as_f64() {
708
+ if float_number.is_nan() || float_number.is_infinite() {
709
+ bail!("received an invalid timestamp: the number is either NaN or Inf")
710
+ }
711
+ if float_number < 0. {
712
+ bail!("received an invalid timestamp: the number is negative");
713
+ }
714
+ if float_number.fract() != 0. {
715
+ bail!("received an invalid timestamp: the number is fractional")
716
+ }
717
+ if float_number > u64::MAX as f64 {
718
+ bail!("received an invalid timestamp: the number is > u64::max")
719
+ }
720
+
721
+ return Ok(float_number as u64);
722
+ }
723
+
724
+ bail!("fetching latest platform block failed: value is not number");
725
+ }
229
726
  }