@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.
- package/.mocharc.yml +1 -1
- package/Cargo.toml +5 -2
- package/README.md +5 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +9 -0
- package/dist/wasm/wasm_dpp.d.ts +3397 -1237
- package/karma.conf.js +5 -0
- package/lib/identifier/patchIdentifier.ts +5 -4
- package/lib/index.ts +1 -1
- package/lib/test/bootstrap.js +5 -0
- package/lib/test/fixtures/getDataContractFixture.js +267 -0
- package/lib/test/fixtures/getDocumentsFixture.js +43 -0
- package/lib/test/mocks/createStateRepositoryMock.js +64 -0
- package/lib/test/mocks/getBlsAdapterMock.js +51 -0
- package/package.json +11 -8
- package/src/bls_adapter.rs +17 -1
- package/src/buffer.rs +3 -0
- package/src/dash_platform_protocol.rs +107 -10
- package/src/data_contract/data_contract.rs +59 -10
- package/src/data_contract/data_contract_facade.rs +128 -0
- package/src/data_contract/errors/invalid_data_contract.rs +16 -16
- package/src/data_contract/errors/invalid_document_type.rs +8 -8
- package/src/data_contract/errors/mod.rs +10 -16
- package/src/data_contract/index.rs +56 -1
- package/src/data_contract/mod.rs +4 -0
- package/src/data_contract/state_transition/data_contract_create_transition/apply.rs +1 -1
- package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +41 -10
- package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +35 -4
- package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +1 -1
- package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +20 -7
- package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +47 -11
- package/src/data_contract_factory/data_contract_factory.rs +19 -17
- package/src/data_trigger/data_trigger_execution_context.rs +95 -0
- package/src/data_trigger/data_trigger_execution_result.rs +48 -0
- package/src/data_trigger/execute_data_triggers_factory.rs +60 -0
- package/src/data_trigger/get_data_triggers_factory.rs +65 -0
- package/src/data_trigger/mod.rs +121 -0
- package/src/document/document_facade.rs +125 -0
- package/src/document/errors/invalid_document_error.rs +10 -9
- package/src/document/errors/invalid_initial_revision_error.rs +1 -1
- package/src/document/errors/mismatch_owners_ids_error.rs +14 -4
- package/src/document/errors/mod.rs +17 -13
- package/src/document/errors/no_documents_supplied_error.rs +4 -4
- package/src/document/factory.rs +257 -0
- package/src/document/fetch_and_validate_data_contract.rs +77 -0
- package/src/document/generate_document_id.rs +17 -0
- package/src/document/mod.rs +311 -37
- package/src/document/state_transition/document_batch_transition/apply_document_batch_transition.rs +22 -0
- package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +253 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +60 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +263 -0
- package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +302 -3
- package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs +40 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs +50 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/mod.rs +8 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +34 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs +39 -0
- package/src/document/state_transition/document_batch_transition/validation/mod.rs +2 -0
- package/src/document/state_transition/document_batch_transition/validation/state/fetch_documents.rs +43 -0
- package/src/document/state_transition/document_batch_transition/validation/state/mod.rs +3 -0
- package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs +27 -0
- package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +47 -0
- package/src/document/validator.rs +52 -0
- package/src/errors/compatible_protocol_version_is_not_defined_error.rs +24 -0
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +1 -1
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +1 -1
- package/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs +2 -2
- package/src/errors/consensus/basic/document/invalid_document_type_error.rs +15 -1
- package/src/errors/consensus/basic/document/missing_data_contract_id_error.rs +16 -2
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +1 -1
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +1 -1
- package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
- package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
- package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
- package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +2 -2
- package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs +29 -0
- package/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs +4 -3
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs +1 -1
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +1 -1
- package/src/errors/consensus/basic/identity/missing_public_key_error.rs +4 -3
- package/src/errors/consensus/basic/identity/mod.rs +2 -0
- package/src/errors/consensus/basic/invalid_identifier_error.rs +1 -1
- package/src/errors/consensus/basic/json_schema_error.rs +8 -2
- package/src/errors/consensus/basic/public_key_is_disabled_error.rs +1 -1
- package/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +9 -9
- package/src/errors/consensus/state/document/invalid_document_revision_error.rs +4 -4
- package/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs +35 -0
- package/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs +34 -0
- package/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +10 -7
- package/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs +2 -3
- package/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs +7 -3
- package/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs +2 -3
- package/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +7 -4
- package/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs +2 -1
- package/src/errors/consensus/state/identity/mod.rs +4 -0
- package/src/errors/consensus_error.rs +218 -268
- package/src/errors/data_contract_not_present_error.rs +23 -0
- package/src/errors/dpp_error.rs +17 -0
- package/src/errors/from.rs +22 -0
- package/src/errors/js_conversion.rs +52 -5
- package/src/errors/mod.rs +6 -0
- package/src/errors/protocol_error.rs +14 -3
- package/src/identifier/errors.rs +30 -0
- package/src/identifier/mod.rs +95 -11
- package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
- package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
- package/src/identity/errors/invalid_identity_error.rs +32 -0
- package/src/identity/errors/mod.rs +9 -0
- package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
- package/src/identity/factory_utils.rs +87 -0
- package/src/identity/identity_facade.rs +194 -20
- package/src/identity/identity_factory.rs +209 -0
- package/src/identity/identity_public_key/mod.rs +51 -40
- package/src/identity/mod.rs +31 -17
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
- package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +337 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_create_transition/to_object.rs +45 -0
- package/src/identity/state_transition/identity_public_key_transitions.rs +207 -0
- package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +278 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
- package/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs +24 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +55 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +448 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition_basic_validator.rs +94 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition_state_validator.rs +53 -0
- package/src/identity/state_transition/identity_update_transition/mod.rs +9 -0
- package/src/identity/state_transition/identity_update_transition/to_object.rs +66 -0
- package/src/identity/state_transition/mod.rs +12 -0
- package/src/identity/state_transition/validate_public_key_signatures.rs +61 -0
- package/src/identity/validation/identity_validator.rs +50 -0
- package/src/identity/validation/mod.rs +2 -0
- package/src/identity/validation/public_keys_validator.rs +14 -13
- package/src/identity_public_key/public_keys_validator.rs +44 -0
- package/src/lib.rs +6 -0
- package/src/lodash.rs +7 -0
- package/src/metadata.rs +54 -10
- package/src/state_repository.rs +598 -101
- package/src/state_transition/conversion.rs +104 -0
- package/src/state_transition/errors/invalid_state_transition_error.rs +32 -0
- package/src/state_transition/errors/mod.rs +1 -0
- package/src/state_transition/mod.rs +46 -0
- package/src/state_transition/state_transition_facade.rs +263 -0
- package/src/state_transition/state_transition_factory.rs +216 -0
- package/src/state_transition/validation/mod.rs +1 -0
- package/src/state_transition/validation/validate_state_transition_key_signature.rs +62 -0
- package/src/utils.rs +210 -8
- package/src/validation/json_schema_validator.rs +41 -0
- package/src/validation/mod.rs +2 -0
- package/src/validation/validation_result.rs +29 -5
- package/src/version/mod.rs +2 -0
- package/src/version/protocol_version.rs +103 -0
- package/test/integration/dataContract/DataContractFacade.spec.js +46 -30
- package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +45 -127
- package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +91 -139
- package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +577 -503
- package/test/integration/document/Document.spec.js +55 -29
- package/test/integration/document/DocumentFacade.spec.js +51 -64
- package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +38 -16
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +341 -396
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +116 -218
- package/test/integration/document/validation/validateDocumentFactory.spec.js +123 -171
- package/test/integration/identity/IdentityFacade.spec.js +52 -27
- package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +185 -164
- package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +84 -114
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +120 -137
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +106 -91
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +50 -16
- package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +78 -86
- package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +74 -30
- package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -147
- package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +65 -77
- package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +60 -23
- package/test/integration/identity/validation/validateIdentityFactory.spec.js +46 -114
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +9 -3
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +12 -8
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +95 -233
- package/test/integration/stateTransition/calculateStateTransitionFeeFromOperationsFactory.spec.js +53 -0
- package/test/unit/Identifier.spec.js +36 -36
- package/test/unit/Metadata.spec.js +17 -3
- package/test/unit/dataContract/DataContract.spec.js +9 -4
- package/test/unit/dataContract/createDataContract.spec.js +0 -1
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +1 -1
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +2 -2
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +3 -3
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +1 -1
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +25 -31
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +3 -3
- package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +2 -0
- package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
- package/test/unit/document/Document.spec.js +147 -155
- package/test/unit/document/DocumentFactory.spec.js +153 -153
- package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +59 -14
- package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +131 -62
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +144 -56
- package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +38 -8
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +11 -7
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +29 -18
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +38 -29
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +53 -91
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +357 -493
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +133 -72
- package/test/unit/identity/Identity.spec.js +26 -9
- package/test/unit/identity/IdentityFactory.spec.js +81 -89
- package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +73 -30
- package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +38 -38
- package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +34 -25
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +85 -50
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +44 -22
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +58 -103
- package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
- package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
- package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
- package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
- package/test/unit/stateTransition/StateTransitionFactory.spec.js +49 -101
- package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +23 -25
- package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +73 -46
- package/test/unit/version/validateProtocolVersionFactory.spec.js +45 -27
- package/wasm/package.json +5 -0
- package/wasm/wasm_dpp.d.ts +3397 -1237
- package/wasm/wasm_dpp.js +7158 -1384
- package/wasm/wasm_dpp_bg.js +1 -1
- package/wasm/wasm_dpp_bg.wasm +0 -0
- package/wasm/wasm_dpp_bg.wasm.d.ts +777 -389
- package/webpack.config.js +9 -0
- package/src/document/state_transition/document_batch_transition/document_transition/document_update_transition.rs +0 -22
- package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +0 -135
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +0 -54
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
use crate::errors::from_dpp_err;
|
|
2
|
+
use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper};
|
|
3
|
+
use crate::validation::ValidationResultWasm;
|
|
4
|
+
use dpp::identity::state_transition::asset_lock_proof::{
|
|
5
|
+
AssetLockPublicKeyHashFetcher, AssetLockTransactionOutputFetcher,
|
|
6
|
+
};
|
|
7
|
+
use dpp::state_transition::validation::validate_state_transition_key_signature::StateTransitionKeySignatureValidator;
|
|
8
|
+
use dpp::validation::AsyncDataValidator;
|
|
9
|
+
use std::sync::Arc;
|
|
10
|
+
use wasm_bindgen::prelude::wasm_bindgen;
|
|
11
|
+
use wasm_bindgen::JsValue;
|
|
12
|
+
|
|
13
|
+
#[wasm_bindgen(js_name=StateTransitionKeySignatureValidator)]
|
|
14
|
+
pub struct StateTransitionKeySignatureValidatorWasm(
|
|
15
|
+
StateTransitionKeySignatureValidator<ExternalStateRepositoryLikeWrapper>,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
impl From<StateTransitionKeySignatureValidator<ExternalStateRepositoryLikeWrapper>>
|
|
19
|
+
for StateTransitionKeySignatureValidatorWasm
|
|
20
|
+
{
|
|
21
|
+
fn from(
|
|
22
|
+
validator: StateTransitionKeySignatureValidator<ExternalStateRepositoryLikeWrapper>,
|
|
23
|
+
) -> Self {
|
|
24
|
+
Self(validator)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
#[wasm_bindgen(js_class=StateTransitionKeySignatureValidator)]
|
|
29
|
+
impl StateTransitionKeySignatureValidatorWasm {
|
|
30
|
+
#[wasm_bindgen(constructor)]
|
|
31
|
+
pub fn new(state_repository: ExternalStateRepositoryLike) -> Self {
|
|
32
|
+
let state_repository_wrapper =
|
|
33
|
+
Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository));
|
|
34
|
+
|
|
35
|
+
let tx_output_fetcher =
|
|
36
|
+
AssetLockTransactionOutputFetcher::new(state_repository_wrapper.clone());
|
|
37
|
+
|
|
38
|
+
let public_key_hash_fetcher =
|
|
39
|
+
AssetLockPublicKeyHashFetcher::new(state_repository_wrapper.clone(), tx_output_fetcher);
|
|
40
|
+
|
|
41
|
+
StateTransitionKeySignatureValidator::new(state_repository_wrapper, public_key_hash_fetcher)
|
|
42
|
+
.into()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[wasm_bindgen]
|
|
46
|
+
pub async fn validate(
|
|
47
|
+
&self,
|
|
48
|
+
state_transition: JsValue,
|
|
49
|
+
) -> Result<ValidationResultWasm, JsValue> {
|
|
50
|
+
let state_transition =
|
|
51
|
+
super::super::conversion::create_state_transition_from_wasm_instance(
|
|
52
|
+
&state_transition,
|
|
53
|
+
)?;
|
|
54
|
+
|
|
55
|
+
let validation_result = self
|
|
56
|
+
.0
|
|
57
|
+
.validate(&state_transition)
|
|
58
|
+
.await
|
|
59
|
+
.map_err(from_dpp_err)?;
|
|
60
|
+
Ok(validation_result.map(|_| JsValue::undefined()).into())
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/utils.rs
CHANGED
|
@@ -1,15 +1,40 @@
|
|
|
1
|
-
use
|
|
1
|
+
use std::convert::TryInto;
|
|
2
|
+
|
|
3
|
+
use anyhow::{anyhow, bail};
|
|
4
|
+
use dpp::{
|
|
5
|
+
dashcore::{anyhow, anyhow::Context},
|
|
6
|
+
util::json_value::{JsonValueExt, ReplaceWith},
|
|
7
|
+
ProtocolError,
|
|
8
|
+
};
|
|
9
|
+
|
|
2
10
|
use js_sys::Function;
|
|
11
|
+
use serde::de::DeserializeOwned;
|
|
3
12
|
use serde_json::Value;
|
|
4
|
-
use wasm_bindgen::prelude
|
|
13
|
+
use wasm_bindgen::{convert::RefFromWasmAbi, prelude::*};
|
|
14
|
+
|
|
15
|
+
use crate::errors::{from_dpp_err, RustConversionError};
|
|
5
16
|
|
|
6
17
|
pub trait ToSerdeJSONExt {
|
|
7
|
-
fn
|
|
18
|
+
fn with_serde_to_json_value(&self) -> Result<Value, JsValue>;
|
|
19
|
+
fn with_serde_into<D: DeserializeOwned>(&self) -> Result<D, JsValue>
|
|
20
|
+
where
|
|
21
|
+
D: for<'de> serde::de::Deserialize<'de> + 'static;
|
|
8
22
|
}
|
|
9
23
|
|
|
10
24
|
impl ToSerdeJSONExt for JsValue {
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
/// Converts the `JsValue` into `serde_json::Value`. It's an expensive conversion,
|
|
26
|
+
/// as `JsValue` must be stringified first
|
|
27
|
+
fn with_serde_to_json_value(&self) -> Result<Value, JsValue> {
|
|
28
|
+
with_serde_to_json_value(self)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// converts the `JsValue` into any type that is supported by serde. It's an expensive conversion
|
|
32
|
+
/// as the `jsValue` must be stringified first
|
|
33
|
+
fn with_serde_into<D>(&self) -> Result<D, JsValue>
|
|
34
|
+
where
|
|
35
|
+
D: for<'de> serde::de::Deserialize<'de> + 'static,
|
|
36
|
+
{
|
|
37
|
+
with_serde_into(self)
|
|
13
38
|
}
|
|
14
39
|
}
|
|
15
40
|
|
|
@@ -25,7 +50,7 @@ pub fn to_vec_of_serde_values(
|
|
|
25
50
|
) -> Result<Vec<Value>, JsValue> {
|
|
26
51
|
values
|
|
27
52
|
.into_iter()
|
|
28
|
-
.map(|v| v.as_ref().
|
|
53
|
+
.map(|v| v.as_ref().with_serde_to_json_value())
|
|
29
54
|
.collect()
|
|
30
55
|
}
|
|
31
56
|
|
|
@@ -38,7 +63,7 @@ where
|
|
|
38
63
|
.collect()
|
|
39
64
|
}
|
|
40
65
|
|
|
41
|
-
pub fn
|
|
66
|
+
pub fn with_serde_to_json_value(data: &JsValue) -> Result<Value, JsValue> {
|
|
42
67
|
let data = stringify(data)?;
|
|
43
68
|
let value: Value = serde_json::from_str(&data)
|
|
44
69
|
.with_context(|| format!("cant convert {data:#?} to serde json value"))
|
|
@@ -46,10 +71,21 @@ pub fn to_serde_json_value(data: &JsValue) -> Result<Value, JsValue> {
|
|
|
46
71
|
Ok(value)
|
|
47
72
|
}
|
|
48
73
|
|
|
74
|
+
pub fn with_serde_into<D>(data: &JsValue) -> Result<D, JsValue>
|
|
75
|
+
where
|
|
76
|
+
D: for<'de> serde::de::Deserialize<'de> + 'static,
|
|
77
|
+
{
|
|
78
|
+
let data = stringify(data)?;
|
|
79
|
+
let value: D = serde_json::from_str(&data)
|
|
80
|
+
.with_context(|| format!("cant convert {:#?} to serde json value", data))
|
|
81
|
+
.map_err(|e| format!("{:#}", e))?;
|
|
82
|
+
Ok(value)
|
|
83
|
+
}
|
|
84
|
+
|
|
49
85
|
pub fn stringify(data: &JsValue) -> Result<String, JsValue> {
|
|
50
86
|
let replacer_func = Function::new_with_args(
|
|
51
87
|
"key, value",
|
|
52
|
-
"return value.type=='Buffer'
|
|
88
|
+
"return (value != undefined && value.type=='Buffer') ? value.data : value ",
|
|
53
89
|
);
|
|
54
90
|
|
|
55
91
|
let data_string: String =
|
|
@@ -57,3 +93,169 @@ pub fn stringify(data: &JsValue) -> Result<String, JsValue> {
|
|
|
57
93
|
|
|
58
94
|
Ok(data_string)
|
|
59
95
|
}
|
|
96
|
+
|
|
97
|
+
pub trait WithJsError<T> {
|
|
98
|
+
/// Converts the error into JsValue
|
|
99
|
+
fn with_js_error(self) -> Result<T, JsValue>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
impl<T> WithJsError<T> for Result<T, anyhow::Error> {
|
|
103
|
+
fn with_js_error(self) -> Result<T, JsValue> {
|
|
104
|
+
match self {
|
|
105
|
+
Ok(ok) => Ok(ok),
|
|
106
|
+
Err(error) => Err(format!("{error:#}").into()),
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
impl<T> WithJsError<T> for Result<T, ProtocolError> {
|
|
112
|
+
fn with_js_error(self) -> Result<T, JsValue> {
|
|
113
|
+
match self {
|
|
114
|
+
Ok(ok) => Ok(ok),
|
|
115
|
+
Err(error) => Err(from_dpp_err(error)),
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
impl<T> WithJsError<T> for Result<T, serde_json::Error> {
|
|
121
|
+
fn with_js_error(self) -> Result<T, JsValue> {
|
|
122
|
+
match self {
|
|
123
|
+
Ok(ok) => Ok(ok),
|
|
124
|
+
Err(error) => Err(RustConversionError::from(error).to_js_value()),
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
pub trait IntoWasm {
|
|
130
|
+
fn to_wasm<T: RefFromWasmAbi<Abi = u32>>(&self, class_name: &str)
|
|
131
|
+
-> Result<T::Anchor, JsValue>;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
impl IntoWasm for JsValue {
|
|
135
|
+
fn to_wasm<T: RefFromWasmAbi<Abi = u32>>(
|
|
136
|
+
&self,
|
|
137
|
+
class_name: &str,
|
|
138
|
+
) -> Result<T::Anchor, JsValue> {
|
|
139
|
+
generic_of_js_val::<T>(self, class_name)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
pub fn generic_of_js_val<T: RefFromWasmAbi<Abi = u32>>(
|
|
144
|
+
js_value: &JsValue,
|
|
145
|
+
class_name: &str,
|
|
146
|
+
) -> Result<T::Anchor, JsValue> {
|
|
147
|
+
if !js_value.is_object() {
|
|
148
|
+
return Err(JsError::new(
|
|
149
|
+
format!("Value supplied as {} is not an object", class_name).as_str(),
|
|
150
|
+
)
|
|
151
|
+
.into());
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
let ctor_name = js_sys::Object::get_prototype_of(js_value)
|
|
155
|
+
.constructor()
|
|
156
|
+
.name();
|
|
157
|
+
|
|
158
|
+
if ctor_name == class_name {
|
|
159
|
+
let ptr = js_sys::Reflect::get(js_value, &JsValue::from_str("ptr"))?;
|
|
160
|
+
let ptr_u32: u32 = ptr
|
|
161
|
+
.as_f64()
|
|
162
|
+
.ok_or_else(|| JsValue::from(JsError::new("Invalid JS object pointer")))?
|
|
163
|
+
as u32;
|
|
164
|
+
let reference = unsafe { T::ref_from_abi(ptr_u32) };
|
|
165
|
+
Ok(reference)
|
|
166
|
+
} else {
|
|
167
|
+
let error_string = format!(
|
|
168
|
+
"JS object constructor name mismatch. Expected {}, provided {}.",
|
|
169
|
+
class_name, ctor_name
|
|
170
|
+
);
|
|
171
|
+
Err(JsError::new(&error_string).into())
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
pub const SKIP_VALIDATION_PROPERTY_NAME: &str = "skipValidation";
|
|
176
|
+
|
|
177
|
+
pub fn get_bool_from_options(
|
|
178
|
+
options: JsValue,
|
|
179
|
+
property: &str,
|
|
180
|
+
default: bool,
|
|
181
|
+
) -> Result<bool, JsValue> {
|
|
182
|
+
if options.is_object() {
|
|
183
|
+
let val2 = options.with_serde_to_json_value()?;
|
|
184
|
+
let kek = val2
|
|
185
|
+
.as_object()
|
|
186
|
+
.ok_or_else(|| JsError::new("Can't parse options"))?;
|
|
187
|
+
let kek2 = kek
|
|
188
|
+
.get(property)
|
|
189
|
+
.ok_or_else(|| JsError::new(&format!("Can't get property {} of options", property)))?;
|
|
190
|
+
Ok(kek2
|
|
191
|
+
.as_bool()
|
|
192
|
+
.ok_or_else(|| JsError::new(&format!("Option {} is not a boolean", property)))?)
|
|
193
|
+
} else {
|
|
194
|
+
Ok(default)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
pub fn get_class_name(value: &JsValue) -> String {
|
|
199
|
+
js_sys::Object::get_prototype_of(value)
|
|
200
|
+
.constructor()
|
|
201
|
+
.name()
|
|
202
|
+
.into()
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
pub fn try_to_u64(value: JsValue) -> Result<u64, anyhow::Error> {
|
|
206
|
+
let result = if value.is_bigint() {
|
|
207
|
+
js_sys::BigInt::new(&value)
|
|
208
|
+
.map_err(|e| anyhow!("unable to create bigInt: {}", e.to_string()))?
|
|
209
|
+
.try_into()
|
|
210
|
+
.map_err(|e| anyhow!("conversion of BigInt to u64 failed: {:#}", e))
|
|
211
|
+
} else if value.as_f64().is_some() {
|
|
212
|
+
let number = js_sys::Number::from(value);
|
|
213
|
+
convert_number_to_u64(number)
|
|
214
|
+
} else {
|
|
215
|
+
bail!("supported types are Number or BigInt")
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
result
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
pub fn convert_number_to_u64(js_number: js_sys::Number) -> Result<u64, anyhow::Error> {
|
|
222
|
+
if let Some(float_number) = js_number.as_f64() {
|
|
223
|
+
if float_number.is_nan() || float_number.is_infinite() {
|
|
224
|
+
bail!("received an invalid timestamp: the number is either NaN or Inf")
|
|
225
|
+
}
|
|
226
|
+
if float_number < 0. {
|
|
227
|
+
bail!("received an invalid timestamp: the number is negative");
|
|
228
|
+
}
|
|
229
|
+
if float_number.fract() != 0. {
|
|
230
|
+
bail!("received an invalid timestamp: the number is fractional")
|
|
231
|
+
}
|
|
232
|
+
if float_number > u64::MAX as f64 {
|
|
233
|
+
bail!("received an invalid timestamp: the number is > u64::max")
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return Ok(float_number as u64);
|
|
237
|
+
}
|
|
238
|
+
bail!("the value is not a number")
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
pub(crate) fn replace_identifiers_with_bytes_without_failing<'a>(
|
|
242
|
+
value: &mut Value,
|
|
243
|
+
paths: impl IntoIterator<Item = &'a str>,
|
|
244
|
+
) {
|
|
245
|
+
// Errors are ignored. When `Buffer` crosses the WASM boundary it becomes an Array.
|
|
246
|
+
// When `Identifier` crosses the WASM boundary it becomes a String. From perspective of JS
|
|
247
|
+
// `Identifier` and `Buffer` are used interchangeably, so we we can expect the replacing may fail when `Buffer` is provided
|
|
248
|
+
let _ = value
|
|
249
|
+
.replace_identifier_paths(paths, ReplaceWith::Bytes)
|
|
250
|
+
.with_js_error();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// The trait `Inner` provides better flexibility and visibility when you need to switch
|
|
254
|
+
// between WASM structure and original structure.
|
|
255
|
+
pub(crate) trait Inner {
|
|
256
|
+
type InnerItem;
|
|
257
|
+
|
|
258
|
+
fn into_inner(self) -> Self::InnerItem;
|
|
259
|
+
fn inner(&self) -> &Self::InnerItem;
|
|
260
|
+
fn inner_mut(&mut self) -> &mut Self::InnerItem;
|
|
261
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
use anyhow::Context;
|
|
2
|
+
use dpp::validation::JsonSchemaValidator;
|
|
3
|
+
use serde_json::Value;
|
|
4
|
+
use wasm_bindgen::prelude::*;
|
|
5
|
+
|
|
6
|
+
use crate::utils::{ToSerdeJSONExt, WithJsError};
|
|
7
|
+
|
|
8
|
+
#[wasm_bindgen(js_name=JsonSchemaValidator)]
|
|
9
|
+
pub struct JsonSchemaValidatorWasm(JsonSchemaValidator);
|
|
10
|
+
|
|
11
|
+
#[wasm_bindgen(js_class=JsonSchemaValidator)]
|
|
12
|
+
impl JsonSchemaValidatorWasm {
|
|
13
|
+
#[wasm_bindgen(constructor)]
|
|
14
|
+
pub fn new(
|
|
15
|
+
schema_js: &JsValue,
|
|
16
|
+
definitions: &JsValue,
|
|
17
|
+
) -> Result<JsonSchemaValidatorWasm, JsValue> {
|
|
18
|
+
let schema = schema_js.with_serde_to_json_value()?;
|
|
19
|
+
let maybe_defs: Option<Value> = if definitions.is_object() {
|
|
20
|
+
Some(definitions.with_serde_to_json_value()?)
|
|
21
|
+
} else {
|
|
22
|
+
None
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let validator = if let Some(defs) = maybe_defs {
|
|
26
|
+
let map = defs
|
|
27
|
+
.as_object()
|
|
28
|
+
.context("definitions are not a map")
|
|
29
|
+
.with_js_error()?;
|
|
30
|
+
JsonSchemaValidator::new_with_definitions(schema, map)
|
|
31
|
+
.context("Schema Validator creation with definitions failed")
|
|
32
|
+
.with_js_error()?
|
|
33
|
+
} else {
|
|
34
|
+
JsonSchemaValidator::new(schema)
|
|
35
|
+
.context("Schema Validator creation failed")
|
|
36
|
+
.with_js_error()?
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
Ok(JsonSchemaValidatorWasm(validator))
|
|
40
|
+
}
|
|
41
|
+
}
|
package/src/validation/mod.rs
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
use crate::errors::consensus_error::from_consensus_error_ref;
|
|
2
|
-
use dpp::validation::ValidationResult;
|
|
2
|
+
use dpp::{consensus::ConsensusError, validation::ValidationResult};
|
|
3
3
|
use js_sys::JsString;
|
|
4
4
|
use wasm_bindgen::prelude::*;
|
|
5
5
|
|
|
6
6
|
#[wasm_bindgen(js_name=ValidationResult)]
|
|
7
|
-
|
|
7
|
+
#[derive(Debug)]
|
|
8
|
+
pub struct ValidationResultWasm(ValidationResult<JsValue>);
|
|
9
|
+
|
|
10
|
+
impl<T> From<ValidationResult<T>> for ValidationResultWasm
|
|
11
|
+
where
|
|
12
|
+
T: Into<JsValue> + Clone,
|
|
13
|
+
{
|
|
14
|
+
fn from(validation_result: ValidationResult<T>) -> Self {
|
|
15
|
+
ValidationResultWasm(validation_result.map(Into::into))
|
|
16
|
+
}
|
|
17
|
+
}
|
|
8
18
|
|
|
9
19
|
#[wasm_bindgen(js_class=ValidationResult)]
|
|
10
20
|
impl ValidationResultWasm {
|
|
@@ -32,10 +42,24 @@ impl ValidationResultWasm {
|
|
|
32
42
|
.map(from_consensus_error_ref)
|
|
33
43
|
.collect()
|
|
34
44
|
}
|
|
45
|
+
|
|
46
|
+
#[wasm_bindgen(js_name=getData)]
|
|
47
|
+
pub fn get_data(&self) -> JsValue {
|
|
48
|
+
self.0.data().unwrap_or(&JsValue::undefined()).to_owned()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#[wasm_bindgen(js_name=getFirstError)]
|
|
52
|
+
pub fn get_first_error(&self) -> JsValue {
|
|
53
|
+
if !self.0.errors.is_empty() {
|
|
54
|
+
from_consensus_error_ref(&self.0.errors[0])
|
|
55
|
+
} else {
|
|
56
|
+
JsValue::undefined()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
35
59
|
}
|
|
36
60
|
|
|
37
|
-
impl
|
|
38
|
-
fn
|
|
39
|
-
|
|
61
|
+
impl ValidationResultWasm {
|
|
62
|
+
pub fn add_error(&mut self, error: impl Into<ConsensusError>) {
|
|
63
|
+
self.0.add_error(error)
|
|
40
64
|
}
|
|
41
65
|
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
use crate::errors::CompatibleProtocolVersionIsNotDefinedErrorWasm;
|
|
2
|
+
use crate::utils::ToSerdeJSONExt;
|
|
3
|
+
use crate::validation::ValidationResultWasm;
|
|
4
|
+
use dpp::util::json_value::JsonValueExt;
|
|
5
|
+
use dpp::version::ProtocolVersionValidator;
|
|
6
|
+
use std::collections::HashMap;
|
|
7
|
+
use std::convert::TryFrom;
|
|
8
|
+
use wasm_bindgen::prelude::*;
|
|
9
|
+
|
|
10
|
+
#[wasm_bindgen(js_name=ProtocolVersionValidator)]
|
|
11
|
+
pub struct ProtocolVersionValidatorWasm(ProtocolVersionValidator);
|
|
12
|
+
|
|
13
|
+
#[wasm_bindgen(js_class=ProtocolVersionValidator)]
|
|
14
|
+
impl ProtocolVersionValidatorWasm {
|
|
15
|
+
// TODO should the constructor be without parameters?
|
|
16
|
+
#[wasm_bindgen(constructor)]
|
|
17
|
+
pub fn new(options: JsValue) -> Result<ProtocolVersionValidatorWasm, JsValue> {
|
|
18
|
+
if options.is_undefined() {
|
|
19
|
+
Ok(ProtocolVersionValidatorWasm(
|
|
20
|
+
ProtocolVersionValidator::default(),
|
|
21
|
+
))
|
|
22
|
+
} else {
|
|
23
|
+
let metadata_options = options.with_serde_to_json_value()?;
|
|
24
|
+
let current_protocol_version: u32 = metadata_options
|
|
25
|
+
.get_u32("currentProtocolVersion")
|
|
26
|
+
.map_err(|e| JsError::new(&e.to_string()))?;
|
|
27
|
+
let latest_protocol_version: u32 = metadata_options
|
|
28
|
+
.get_u32("latestProtocolVersion")
|
|
29
|
+
.map_err(|e| JsError::new(&e.to_string()))?;
|
|
30
|
+
let compatibility_map_value: serde_json::Value = metadata_options
|
|
31
|
+
.get_value("versionCompatibilityMap")
|
|
32
|
+
.map(|v| v.clone())
|
|
33
|
+
.map_err(|e| JsError::new(&e.to_string()))?;
|
|
34
|
+
|
|
35
|
+
let hash_map = compatibility_map_value
|
|
36
|
+
.as_object()
|
|
37
|
+
.ok_or_else(|| {
|
|
38
|
+
JsValue::from(JsError::new("Expected compatibility map to be an object"))
|
|
39
|
+
})?
|
|
40
|
+
.into_iter()
|
|
41
|
+
.map(|(key, value)| {
|
|
42
|
+
let new_key = key
|
|
43
|
+
.parse::<u32>()
|
|
44
|
+
.map_err(|e| JsError::new(&*e.to_string()))?;
|
|
45
|
+
|
|
46
|
+
let new_value_64 = value.as_u64().ok_or_else(|| {
|
|
47
|
+
JsError::new("Expect values in compatibility map to contain only numbers")
|
|
48
|
+
})?;
|
|
49
|
+
let new_value =
|
|
50
|
+
u32::try_from(new_value_64).map_err(|e| JsError::new(&*e.to_string()))?;
|
|
51
|
+
|
|
52
|
+
Ok((new_key, new_value))
|
|
53
|
+
})
|
|
54
|
+
.collect::<Result<HashMap<u32, u32>, JsError>>()?;
|
|
55
|
+
|
|
56
|
+
Ok(ProtocolVersionValidatorWasm(ProtocolVersionValidator::new(
|
|
57
|
+
current_protocol_version,
|
|
58
|
+
latest_protocol_version,
|
|
59
|
+
hash_map,
|
|
60
|
+
)))
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#[wasm_bindgen]
|
|
65
|
+
pub fn validate(&self, version: u32) -> Result<ValidationResultWasm, JsValue> {
|
|
66
|
+
self.0
|
|
67
|
+
.validate(version)
|
|
68
|
+
.map(|v| v.map(|_| JsValue::undefined()))
|
|
69
|
+
.map(ValidationResultWasm::from)
|
|
70
|
+
.map_err(|e| CompatibleProtocolVersionIsNotDefinedErrorWasm::new(e).into())
|
|
71
|
+
.into()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
impl ProtocolVersionValidatorWasm {
|
|
76
|
+
pub fn protocol_version(&self) -> u32 {
|
|
77
|
+
self.0.protocol_version()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
impl From<ProtocolVersionValidator> for ProtocolVersionValidatorWasm {
|
|
82
|
+
fn from(doc_validator: ProtocolVersionValidator) -> Self {
|
|
83
|
+
ProtocolVersionValidatorWasm(doc_validator)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
impl From<&ProtocolVersionValidator> for ProtocolVersionValidatorWasm {
|
|
88
|
+
fn from(doc_validator: &ProtocolVersionValidator) -> Self {
|
|
89
|
+
ProtocolVersionValidatorWasm(doc_validator.clone())
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
impl From<ProtocolVersionValidatorWasm> for ProtocolVersionValidator {
|
|
94
|
+
fn from(val: ProtocolVersionValidatorWasm) -> Self {
|
|
95
|
+
val.0
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
impl From<&ProtocolVersionValidatorWasm> for ProtocolVersionValidator {
|
|
100
|
+
fn from(val: &ProtocolVersionValidatorWasm) -> Self {
|
|
101
|
+
val.0.clone()
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -1,72 +1,87 @@
|
|
|
1
|
-
const
|
|
1
|
+
const getDataContractJSFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
2
|
+
const getBlsAdapterMock = require('../../../lib/test/mocks/getBlsAdapterMock');
|
|
2
3
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
10
|
-
|
|
11
|
-
const DataContractFactory = require('@dashevo/dpp/lib/dataContract/DataContractFactory');
|
|
4
|
+
const { default: loadWasmDpp } = require('../../..');
|
|
5
|
+
let {
|
|
6
|
+
DashPlatformProtocol, DataContract, ValidationResult, DataContractValidator,
|
|
7
|
+
DataContractFactory, DataContractCreateTransition,
|
|
8
|
+
} = require('../../..');
|
|
12
9
|
|
|
13
10
|
describe('DataContractFacade', () => {
|
|
14
11
|
let dpp;
|
|
15
|
-
let
|
|
12
|
+
let dataContractJs;
|
|
16
13
|
let dataContractFactory;
|
|
14
|
+
let blsAdapter;
|
|
15
|
+
let rawDataContract;
|
|
16
|
+
let dataContractWasm;
|
|
17
|
+
|
|
18
|
+
before(async () => {
|
|
19
|
+
({
|
|
20
|
+
DashPlatformProtocol, DataContract, ValidationResult,
|
|
21
|
+
DataContractValidator, DataContractFactory, DataContractCreateTransition,
|
|
22
|
+
} = await loadWasmDpp());
|
|
23
|
+
});
|
|
17
24
|
|
|
18
25
|
beforeEach(async () => {
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
blsAdapter = await getBlsAdapterMock();
|
|
27
|
+
dpp = new DashPlatformProtocol(blsAdapter);
|
|
21
28
|
|
|
22
|
-
|
|
29
|
+
dataContractJs = await getDataContractJSFixture();
|
|
30
|
+
rawDataContract = dataContractJs.toObject();
|
|
23
31
|
|
|
32
|
+
const dataContractValidator = new DataContractValidator();
|
|
24
33
|
dataContractFactory = new DataContractFactory(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
undefined,
|
|
34
|
+
1,
|
|
35
|
+
dataContractValidator,
|
|
28
36
|
);
|
|
37
|
+
|
|
38
|
+
dataContractWasm = await dataContractFactory.createFromObject(rawDataContract);
|
|
29
39
|
});
|
|
30
40
|
|
|
31
41
|
describe('create', () => {
|
|
32
42
|
it('should create DataContract', () => {
|
|
33
43
|
const result = dpp.dataContract.create(
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
dataContractJs.getOwnerId(),
|
|
45
|
+
dataContractJs.getDocuments(),
|
|
36
46
|
);
|
|
37
47
|
|
|
38
48
|
expect(result).to.be.an.instanceOf(DataContract);
|
|
39
49
|
|
|
40
|
-
expect(result.getOwnerId()).to.deep.equal(
|
|
41
|
-
expect(result.getDocuments()).to.equal(
|
|
50
|
+
expect(result.getOwnerId().toBuffer()).to.deep.equal(dataContractJs.getOwnerId().toBuffer());
|
|
51
|
+
expect(result.getDocuments()).to.deep.equal(dataContractJs.getDocuments());
|
|
42
52
|
});
|
|
43
53
|
});
|
|
44
54
|
|
|
45
55
|
describe('createFromObject', () => {
|
|
46
56
|
it('should create DataContract from plain object', async () => {
|
|
47
|
-
const result = await dpp.dataContract.createFromObject(
|
|
57
|
+
const result = await dpp.dataContract.createFromObject(rawDataContract);
|
|
48
58
|
|
|
49
59
|
expect(result).to.be.an.instanceOf(DataContract);
|
|
50
60
|
|
|
51
|
-
expect(result.toObject()).to.deep.equal(
|
|
61
|
+
expect(result.toObject()).to.deep.equal(dataContractJs.toObject());
|
|
52
62
|
});
|
|
53
63
|
});
|
|
54
64
|
|
|
55
65
|
describe('createFromBuffer', () => {
|
|
56
66
|
it('should create DataContract from string', async () => {
|
|
57
|
-
const
|
|
67
|
+
const contract = dpp.dataContract.create(
|
|
68
|
+
dataContractJs.getOwnerId(),
|
|
69
|
+
dataContractJs.getDocuments(),
|
|
70
|
+
);
|
|
58
71
|
|
|
59
|
-
|
|
72
|
+
const result = await dpp.dataContract.createFromBuffer(contract.toBuffer());
|
|
60
73
|
|
|
61
|
-
expect(result
|
|
74
|
+
expect(result).to.be.an.instanceOf(DataContract);
|
|
75
|
+
expect(result.toObject()).to.deep.equal(contract.toObject());
|
|
62
76
|
});
|
|
63
77
|
});
|
|
64
78
|
|
|
65
79
|
describe('createDataContractCreateTransition', () => {
|
|
66
|
-
it('should create DataContractCreateTransition from DataContract', () => {
|
|
67
|
-
const stateTransition = dataContractFactory
|
|
80
|
+
it('should create DataContractCreateTransition from DataContract', async () => {
|
|
81
|
+
const stateTransition = await dataContractFactory
|
|
82
|
+
.createDataContractCreateTransition(dataContractWasm);
|
|
68
83
|
|
|
69
|
-
const result = dpp.dataContract.createDataContractCreateTransition(
|
|
84
|
+
const result = dpp.dataContract.createDataContractCreateTransition(dataContractWasm);
|
|
70
85
|
|
|
71
86
|
expect(result).to.be.an.instanceOf(DataContractCreateTransition);
|
|
72
87
|
|
|
@@ -76,9 +91,10 @@ describe('DataContractFacade', () => {
|
|
|
76
91
|
|
|
77
92
|
describe('validate', () => {
|
|
78
93
|
it('should validate DataContract', async () => {
|
|
79
|
-
const result = await dpp.dataContract.validate(
|
|
94
|
+
const result = await dpp.dataContract.validate(rawDataContract);
|
|
80
95
|
|
|
81
96
|
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
97
|
+
expect(result.getErrors().length).to.be.equal(0);
|
|
82
98
|
});
|
|
83
99
|
});
|
|
84
100
|
});
|