@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,159 +1,107 @@
1
- const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
2
-
3
- const DataContractCreateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition');
1
+ const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion');
4
2
 
5
- const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
3
+ const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
6
4
 
7
- const InvalidStateTransitionError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionError');
5
+ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
8
6
 
9
- const SerializedObjectParsingError = require('@dashevo/dpp/lib/errors/consensus/basic/decode/SerializedObjectParsingError');
7
+ const { default: loadWasmDpp } = require('../../../dist');
8
+ const getBlsAdapterMock = require('../../../lib/test/mocks/getBlsAdapterMock');
10
9
 
11
- const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock');
12
- const StateTransitionFactory = require('@dashevo/dpp/lib/stateTransition/StateTransitionFactory');
13
- const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError');
10
+ describe('StateTransitionFactory', function main() {
11
+ this.timeout(100000);
14
12
 
15
- describe('StateTransitionFactory', () => {
16
- let validateStateTransitionBasicMock;
17
- let createStateTransitionMock;
18
13
  let factory;
19
14
  let stateTransition;
20
15
  let rawStateTransition;
21
- let decodeProtocolEntityMock;
22
- let dppMock;
16
+ let stateRepositoryMock;
17
+ let StateTransitionFactory;
18
+ let DataContractCreateTransition;
19
+ let InvalidStateTransitionError;
20
+ let MissingStateTransitionTypeError;
21
+
22
+ before(async () => {
23
+ ({
24
+ DataContractCreateTransition,
25
+ StateTransitionFactory,
26
+ InvalidStateTransitionError,
27
+ MissingStateTransitionTypeError,
28
+ } = await loadWasmDpp());
29
+ });
23
30
 
24
- beforeEach(function beforeEach() {
31
+ beforeEach(async function beforeEach() {
25
32
  const dataContract = getDataContractFixture();
26
33
 
34
+ const rawDataContract = dataContract.toObject();
35
+
27
36
  stateTransition = new DataContractCreateTransition({
28
- dataContract: dataContract.toObject(),
37
+ protocolVersion: protocolVersion.latestVersion,
38
+ dataContract: rawDataContract,
29
39
  entropy: dataContract.getEntropy(),
40
+ signature: Buffer.alloc(65),
41
+ signaturePublicKeyId: 0,
30
42
  });
31
43
  rawStateTransition = stateTransition.toObject();
32
44
 
33
- decodeProtocolEntityMock = this.sinonSandbox.stub();
45
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
34
46
 
35
- validateStateTransitionBasicMock = this.sinonSandbox.stub();
36
- createStateTransitionMock = this.sinonSandbox.stub().returns(stateTransition);
37
-
38
- dppMock = createDPPMock();
47
+ const blsAdapter = await getBlsAdapterMock();
39
48
 
40
49
  factory = new StateTransitionFactory(
41
- validateStateTransitionBasicMock,
42
- createStateTransitionMock,
43
- dppMock,
44
- decodeProtocolEntityMock,
50
+ stateRepositoryMock,
51
+ blsAdapter,
45
52
  );
46
53
  });
47
54
 
48
55
  describe('createFromObject', () => {
49
56
  it('should return new State Transition with data from passed object', async () => {
50
- validateStateTransitionBasicMock.returns(new ValidationResult());
51
-
52
57
  const result = await factory.createFromObject(rawStateTransition);
53
58
 
54
- expect(result).to.equal(stateTransition);
55
-
56
- expect(validateStateTransitionBasicMock).to.have.been.calledOnceWith(rawStateTransition);
57
-
58
- expect(createStateTransitionMock).to.have.been.calledOnceWith(rawStateTransition);
59
+ expect(result.toObject()).to.deep.equal(stateTransition.toObject());
59
60
  });
60
61
 
61
62
  it('should return new State Transition without validation if "skipValidation" option is passed', async () => {
62
63
  const result = await factory.createFromObject(rawStateTransition, { skipValidation: true });
63
64
 
64
- expect(result).to.equal(stateTransition);
65
-
66
- expect(validateStateTransitionBasicMock).to.have.not.been.called();
67
-
68
- expect(createStateTransitionMock).to.have.been.calledOnceWith(rawStateTransition);
65
+ expect(result.toObject()).to.deep.equal(stateTransition.toObject());
69
66
  });
70
67
 
71
- it('should throw InvalidStateTransitionError if passed object is not valid', async () => {
72
- const validationError = new SomeConsensusError('test');
73
-
74
- validateStateTransitionBasicMock.returns(new ValidationResult([validationError]));
68
+ it('should throw InvalidStateTransition error in case validation failed', async () => {
69
+ rawStateTransition.type = undefined;
75
70
 
76
71
  try {
77
72
  await factory.createFromObject(rawStateTransition);
78
-
79
- expect.fail('InvalidStateTransitionError is not thrown');
73
+ expect.fail('should throw an error');
80
74
  } catch (e) {
81
75
  expect(e).to.be.an.instanceOf(InvalidStateTransitionError);
82
- expect(e.getRawStateTransition()).to.equal(rawStateTransition);
83
-
84
- expect(e.getErrors()).to.have.length(1);
85
76
 
86
- const [consensusError] = e.getErrors();
77
+ const [error] = e.getErrors();
87
78
 
88
- expect(consensusError).to.equal(validationError);
89
-
90
- expect(validateStateTransitionBasicMock).to.have.been.calledOnceWith(
91
- rawStateTransition,
92
- );
79
+ expect(error).to.be.an.instanceOf(MissingStateTransitionTypeError);
93
80
  }
94
81
  });
95
82
  });
96
83
 
97
84
  describe('createFromBuffer', () => {
98
- let serializedStateTransition;
99
-
100
- beforeEach(function beforeEach() {
101
- this.sinonSandbox.stub(factory, 'createFromObject');
102
-
103
- serializedStateTransition = stateTransition.toBuffer();
104
- });
105
-
106
- afterEach(() => {
107
- factory.createFromObject.restore();
108
- });
109
-
110
85
  it('should return new State Transition from serialized contract', async () => {
111
- decodeProtocolEntityMock.returns([rawStateTransition.protocolVersion, rawStateTransition]);
112
-
113
- factory.createFromObject.resolves(stateTransition);
114
-
115
- const result = await factory.createFromBuffer(serializedStateTransition);
86
+ const result = await factory.createFromBuffer(stateTransition.toBuffer());
116
87
 
117
- expect(result).to.equal(stateTransition);
118
-
119
- expect(factory.createFromObject).to.have.been.calledOnceWith(rawStateTransition);
120
-
121
- expect(decodeProtocolEntityMock).to.have.been.calledOnceWith(
122
- serializedStateTransition,
123
- );
88
+ expect(result.toObject()).to.deep.equal(stateTransition.toObject());
124
89
  });
125
90
 
126
- it('should throw InvalidStateTransitionError if the decoding fails with consensus error', async () => {
127
- const parsingError = new SerializedObjectParsingError(
128
- serializedStateTransition,
129
- new Error(),
130
- );
131
-
132
- decodeProtocolEntityMock.throws(parsingError);
91
+ it('should throw InvalidStateTransition error in case validation failed', async () => {
92
+ // CBOR that have invalid "type" property
93
+ const stateTransitionHex = '01a56c64617461436f6e7472616374a66f70726f746f636f6c56657273696f6e0163246964982018a318b611186f184718781848187d186318441830182c185518fe18e318ff188b18eb185918490218ac1831187b1873184a182c18d9189b1886182418bf6724736368656d61783468747470733a2f2f736368656d612e646173682e6f72672f6470702d302d342d302f6d6574612f646174612d636f6e74726163746776657273696f6e01676f776e657249649820187618a6185c189e18651833183d18aa02189e0d18a61869182818c107183e188908184f183818d018220418c01839161860187418ae18dd189969646f63756d656e7473a76f696e6465786564446f63756d656e74a56474797065666f626a65637467696e646963657386a3646e616d6566696e646578316a70726f7065727469657382a168246f776e6572496463617363a16966697273744e616d656361736366756e69717565f5a3646e616d6566696e646578326a70726f7065727469657382a168246f776e6572496463617363a1686c6173744e616d656361736366756e69717565f5a3646e616d6566696e646578336a70726f7065727469657381a1686c6173744e616d656361736366756e69717565f4a2646e616d6566696e646578346a70726f7065727469657382a16a2463726561746564417463617363a16a2475706461746564417463617363a2646e616d6566696e646578356a70726f7065727469657381a16a2475706461746564417463617363a2646e616d6566696e646578366a70726f7065727469657381a16a24637265617465644174636173636a70726f70657274696573a36966697273744e616d65a2647479706566737472696e67696d61784c656e677468183f686c6173744e616d65a2647479706566737472696e67696d61784c656e677468183f6d6f7468657250726f7065727479a2647479706566737472696e67696d61784c656e677468182a687265717569726564846966697273744e616d656a246372656174656441746a24757064617465644174686c6173744e616d65746164646974696f6e616c50726f70657274696573f46c6e696365446f63756d656e74a46474797065666f626a6563746a70726f70657274696573a1646e616d65a1647479706566737472696e67687265717569726564816a24637265617465644174746164646974696f6e616c50726f70657274696573f46e6e6f54696d65446f63756d656e74a36474797065666f626a6563746a70726f70657274696573a1646e616d65a1647479706566737472696e67746164646974696f6e616c50726f70657274696573f4781d6f7074696f6e616c556e69717565496e6465786564446f63756d656e74a56474797065666f626a6563746a70726f70657274696573a46966697273744e616d65a2647479706566737472696e67696d61784c656e677468183f686c6173744e616d65a2647479706566737472696e67696d61784c656e677468183f67636f756e747279a2647479706566737472696e67696d61784c656e677468183f6463697479a2647479706566737472696e67696d61784c656e677468183f67696e646963657383a3646e616d6566696e646578316a70726f7065727469657381a16966697273744e616d656361736366756e69717565f5a3646e616d6566696e646578326a70726f7065727469657383a168246f776e6572496463617363a16966697273744e616d6563617363a1686c6173744e616d656361736366756e69717565f5a3646e616d6566696e646578336a70726f7065727469657382a167636f756e74727963617363a164636974796361736366756e69717565f5687265717569726564826966697273744e616d65686c6173744e616d65746164646974696f6e616c50726f70657274696573f46e707265747479446f63756d656e74a46474797065666f626a6563746a70726f70657274696573a1686c6173744e616d65a1647479706566737472696e6768726571756972656482686c6173744e616d656a24757064617465644174746164646974696f6e616c50726f70657274696573f46b756e697175654461746573a56474797065666f626a65637467696e646963657382a3646e616d6566696e646578316a70726f7065727469657382a16a2463726561746564417463617363a16a247570646174656441746361736366756e69717565f5a2646e616d6566696e646578326a70726f7065727469657381a16a24757064617465644174636173636a70726f70657274696573a26966697273744e616d65a1647479706566737472696e67686c6173744e616d65a1647479706566737472696e67687265717569726564836966697273744e616d656a246372656174656441746a24757064617465644174746164646974696f6e616c50726f70657274696573f46e7769746842797465417272617973a56474797065666f626a65637467696e646963657381a2646e616d6566696e646578316a70726f7065727469657381a16e6279746541727261794669656c64636173636a70726f70657274696573a26e6279746541727261794669656c64a3647479706565617272617969627974654172726179f5686d61784974656d73106f6964656e7469666965724669656c64a5647479706565617272617969627974654172726179f570636f6e74656e744d656469615479706578216170706c69636174696f6e2f782e646173682e6470702e6964656e746966696572686d696e4974656d731820686d61784974656d731820687265717569726564816e6279746541727261794669656c64746164646974696f6e616c50726f70657274696573f464747970652267656e74726f70799820189618d10418b2071882188e188818fc18b7189818dd185c18811881189b1867187912183d184d187118ff1866181d185f1839188718ea1824185113747369676e61747572655075626c69634b6579496400697369676e617475726598410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
94
+ const stateTransitionBuffer = Buffer.from(stateTransitionHex, 'hex');
133
95
 
134
96
  try {
135
- await factory.createFromBuffer(serializedStateTransition);
136
-
137
- expect.fail('should throw InvalidStateTransitionError');
97
+ await factory.createFromBuffer(stateTransitionBuffer);
98
+ expect.fail('should throw an error');
138
99
  } catch (e) {
139
100
  expect(e).to.be.an.instanceOf(InvalidStateTransitionError);
140
101
 
141
- const [innerError] = e.getErrors();
142
- expect(innerError).to.be.equal(parsingError);
143
- }
144
- });
145
-
146
- it('should throw an error if decoding fails with any other error', async () => {
147
- const otherParsingError = new Error();
148
-
149
- decodeProtocolEntityMock.throws(otherParsingError);
102
+ const [error] = e.getErrors();
150
103
 
151
- try {
152
- await factory.createFromBuffer(serializedStateTransition);
153
-
154
- expect.fail('should throw an error');
155
- } catch (e) {
156
- expect(e).to.be.equal(otherParsingError);
104
+ expect(error).to.be.an.instanceOf(MissingStateTransitionTypeError);
157
105
  }
158
106
  });
159
107
  });
@@ -2,7 +2,6 @@ const validateStateTransitionFeeFactory = require('@dashevo/dpp/lib/stateTransit
2
2
 
3
3
  const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
4
4
 
5
- const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture');
6
5
  const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
7
6
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
8
7
  const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture');
@@ -23,20 +22,19 @@ const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransitio
23
22
  describe('validateStateTransitionFeeFactory', () => {
24
23
  let stateRepositoryMock;
25
24
  let validateStateTransitionFee;
26
- let identity;
27
25
  let dataContract;
28
26
  let calculateStateTransitionFeeMock;
29
27
  let fetchAssetLockTransactionOutputMock;
30
28
 
31
29
  beforeEach(function beforeEach() {
32
- identity = getIdentityFixture();
33
-
34
30
  stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
35
- stateRepositoryMock.fetchIdentity.resolves(identity);
36
31
 
37
32
  const output = getIdentityCreateTransitionFixture().getAssetLockProof().getOutput();
38
33
 
39
- calculateStateTransitionFeeMock = this.sinonSandbox.stub().returns(42);
34
+ calculateStateTransitionFeeMock = this.sinonSandbox.stub().returns({
35
+ desiredAmount: 42,
36
+ });
37
+
40
38
  fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output);
41
39
 
42
40
  validateStateTransitionFee = validateStateTransitionFeeFactory(
@@ -59,7 +57,7 @@ describe('validateStateTransitionFeeFactory', () => {
59
57
  });
60
58
 
61
59
  it('should return invalid result if balance is not enough', async () => {
62
- identity.balance = 1;
60
+ stateRepositoryMock.fetchIdentityBalance.resolves(1);
63
61
 
64
62
  const result = await validateStateTransitionFee(dataContractCreateTransition);
65
63
 
@@ -68,9 +66,9 @@ describe('validateStateTransitionFeeFactory', () => {
68
66
  const [error] = result.getErrors();
69
67
 
70
68
  expect(error.getCode()).to.equal(3000);
71
- expect(error.getBalance()).to.equal(identity.balance);
69
+ expect(error.getBalance()).to.equal(1);
72
70
 
73
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
71
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
74
72
  dataContract.getOwnerId(),
75
73
  dataContractCreateTransition.getExecutionContext(),
76
74
  );
@@ -83,13 +81,13 @@ describe('validateStateTransitionFeeFactory', () => {
83
81
  });
84
82
 
85
83
  it('should return valid result', async () => {
86
- identity.balance = 42;
84
+ stateRepositoryMock.fetchIdentityBalance.resolves(42);
87
85
 
88
86
  const result = await validateStateTransitionFee(dataContractCreateTransition);
89
87
 
90
88
  expect(result.isValid()).to.be.true();
91
89
 
92
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
90
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
93
91
  dataContract.getOwnerId(),
94
92
  dataContractCreateTransition.getExecutionContext(),
95
93
  );
@@ -120,7 +118,7 @@ describe('validateStateTransitionFeeFactory', () => {
120
118
  });
121
119
 
122
120
  it('should return invalid result if balance is not enough', async () => {
123
- identity.balance = 1;
121
+ stateRepositoryMock.fetchIdentityBalance.resolves(1);
124
122
 
125
123
  const result = await validateStateTransitionFee(documentsBatchTransition);
126
124
 
@@ -129,9 +127,9 @@ describe('validateStateTransitionFeeFactory', () => {
129
127
  const [error] = result.getErrors();
130
128
 
131
129
  expect(error.getCode()).to.equal(3000);
132
- expect(error.getBalance()).to.equal(identity.balance);
130
+ expect(error.getBalance()).to.equal(1);
133
131
 
134
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
132
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
135
133
  getDocumentsFixture.ownerId,
136
134
  documentsBatchTransition.getExecutionContext(),
137
135
  );
@@ -144,13 +142,13 @@ describe('validateStateTransitionFeeFactory', () => {
144
142
  });
145
143
 
146
144
  it('should return valid result', async () => {
147
- identity.balance = 42;
145
+ stateRepositoryMock.fetchIdentityBalance.resolves(42);
148
146
 
149
147
  const result = await validateStateTransitionFee(documentsBatchTransition);
150
148
 
151
149
  expect(result.isValid()).to.be.true();
152
150
 
153
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
151
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
154
152
  getDocumentsFixture.ownerId,
155
153
  documentsBatchTransition.getExecutionContext(),
156
154
  );
@@ -172,7 +170,7 @@ describe('validateStateTransitionFeeFactory', () => {
172
170
  expect(result.isValid()).to.be.true();
173
171
 
174
172
  expect(calculateStateTransitionFeeMock).to.be.not.called();
175
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
173
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
176
174
  getDocumentsFixture.ownerId,
177
175
  documentsBatchTransition.getExecutionContext(),
178
176
  );
@@ -195,7 +193,7 @@ describe('validateStateTransitionFeeFactory', () => {
195
193
  });
196
194
 
197
195
  it('should return invalid result if asset lock output amount is not enough', async () => {
198
- calculateStateTransitionFeeMock.returns(outputAmount + 1);
196
+ calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 1 });
199
197
 
200
198
  const result = await validateStateTransitionFee(identityCreateTransition);
201
199
 
@@ -269,9 +267,9 @@ describe('validateStateTransitionFeeFactory', () => {
269
267
  });
270
268
 
271
269
  it('should return invalid result if sum of balance and asset lock output amount is not enough', async () => {
272
- identity.balance = 1;
270
+ stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(1);
273
271
 
274
- calculateStateTransitionFeeMock.returns(outputAmount + 2);
272
+ calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 2 });
275
273
 
276
274
  const result = await validateStateTransitionFee(identityTopUpTransition);
277
275
 
@@ -280,9 +278,9 @@ describe('validateStateTransitionFeeFactory', () => {
280
278
  const [error] = result.getErrors();
281
279
 
282
280
  expect(error.getCode()).to.equal(3000);
283
- expect(error.getBalance()).to.equal(outputAmount + identity.balance);
281
+ expect(error.getBalance()).to.equal(outputAmount + 1);
284
282
 
285
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
283
+ expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly(
286
284
  identityTopUpTransition.getIdentityId(),
287
285
  identityTopUpTransition.getExecutionContext(),
288
286
  );
@@ -298,7 +296,7 @@ describe('validateStateTransitionFeeFactory', () => {
298
296
  });
299
297
 
300
298
  it('should return valid result', async () => {
301
- identity.balance = 41;
299
+ stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(41);
302
300
 
303
301
  calculateStateTransitionFeeMock.returns(outputAmount - 1);
304
302
 
@@ -306,7 +304,7 @@ describe('validateStateTransitionFeeFactory', () => {
306
304
 
307
305
  expect(result.isValid()).to.be.true();
308
306
 
309
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
307
+ expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly(
310
308
  identityTopUpTransition.getIdentityId(),
311
309
  identityTopUpTransition.getExecutionContext(),
312
310
  );
@@ -335,7 +333,7 @@ describe('validateStateTransitionFeeFactory', () => {
335
333
  identityTopUpTransition.getAssetLockProof(),
336
334
  identityTopUpTransition.getExecutionContext(),
337
335
  );
338
- expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
336
+ expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly(
339
337
  identityTopUpTransition.getIdentityId(),
340
338
  identityTopUpTransition.getExecutionContext(),
341
339
  );
@@ -1,69 +1,84 @@
1
- const validateStateTransitionKeySignatureFactory = require('@dashevo/dpp/lib/stateTransition/validation/validateStateTransitionKeySignatureFactory');
1
+ const { Transaction, PrivateKey, Script } = require('@dashevo/dashcore-lib');
2
2
 
3
3
  const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture');
4
- const InvalidStateTransitionSignatureError = require('@dashevo/dpp/lib/errors/consensus/signature/InvalidStateTransitionSignatureError');
4
+ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
5
+ const getIdentityTopUpTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture');
6
+ const { expectValidationError } = require('../../../../lib/test/expect/expectError');
5
7
 
6
- const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
7
-
8
- const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
9
- const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
8
+ const { default: loadWasmDpp } = require('../../../../dist');
10
9
 
11
10
  describe('validateStateTransitionKeySignatureFactory', () => {
12
- let publicKeyHash;
13
11
  let stateTransition;
14
- let stateTransitionHash;
15
- let verifyHashSignatureMock;
12
+ let stateRepositoryMock;
16
13
  let validateStateTransitionKeySignature;
17
- let fetchAssetLockPublicKeyHashMock;
18
- let executionContext;
19
-
20
- beforeEach(function beforeEach() {
21
- publicKeyHash = Buffer.alloc(20).fill(1);
22
14
 
23
- stateTransition = getIdentityCreateTransitionFixture();
24
- stateTransitionHash = stateTransition.hash({ skipSignature: true });
15
+ let InvalidStateTransitionSignatureError;
16
+ let StateTransitionKeySignatureValidator;
17
+ let StateTransitionExecutionContext;
18
+ let IdentityCreateTransition;
19
+ let IdentityTopUpTransition;
20
+ let IdentityNotFoundError;
21
+ let ValidationResult;
22
+
23
+ before(async () => {
24
+ ({
25
+ InvalidStateTransitionSignatureError,
26
+ StateTransitionKeySignatureValidator,
27
+ StateTransitionExecutionContext,
28
+ IdentityCreateTransition,
29
+ IdentityTopUpTransition,
30
+ IdentityNotFoundError,
31
+ ValidationResult,
32
+ } = await loadWasmDpp());
33
+ });
25
34
 
26
- executionContext = new StateTransitionExecutionContext();
35
+ beforeEach(function beforeEach() {
36
+ const stateTransitionJS = getIdentityCreateTransitionFixture();
37
+ const rawStateTransition = stateTransitionJS.toObject();
27
38
 
28
- stateTransition.setExecutionContext(executionContext);
39
+ stateTransition = new IdentityCreateTransition(rawStateTransition);
29
40
 
30
- verifyHashSignatureMock = this.sinonSandbox.stub();
41
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
31
42
 
32
- fetchAssetLockPublicKeyHashMock = this.sinonSandbox.stub().resolves(publicKeyHash);
43
+ const validator = new StateTransitionKeySignatureValidator(stateRepositoryMock);
33
44
 
34
- validateStateTransitionKeySignature = validateStateTransitionKeySignatureFactory(
35
- verifyHashSignatureMock,
36
- fetchAssetLockPublicKeyHashMock,
37
- );
45
+ validateStateTransitionKeySignature = (st) => validator.validate(st);
38
46
  });
39
47
 
40
48
  it('should return invalid result if signature is not valid', async () => {
41
- verifyHashSignatureMock.returns(false);
42
-
43
49
  const result = await validateStateTransitionKeySignature(
44
50
  stateTransition,
45
51
  );
46
52
 
47
- expectValidationError(result, InvalidStateTransitionSignatureError);
53
+ await expectValidationError(result, InvalidStateTransitionSignatureError);
48
54
 
49
55
  const [error] = result.getErrors();
50
56
 
51
57
  expect(error.getCode()).to.equal(2002);
52
-
53
- expect(fetchAssetLockPublicKeyHashMock).to.be.calledOnceWithExactly(
54
- stateTransition.getAssetLockProof(),
55
- executionContext,
56
- );
57
-
58
- expect(verifyHashSignatureMock).to.be.calledOnceWithExactly(
59
- stateTransitionHash,
60
- stateTransition.getSignature(),
61
- publicKeyHash,
62
- );
63
58
  });
64
59
 
65
60
  it('should return valid result if signature is valid', async () => {
66
- verifyHashSignatureMock.returns(true);
61
+ const rawStateTransition = stateTransition.toObject();
62
+
63
+ // Sign state transition and provide relevant public key to transaction output
64
+ const { transaction: rawTransaction } = rawStateTransition.assetLockProof;
65
+
66
+ const transaction = new Transaction(Buffer.from(rawTransaction));
67
+
68
+ const privateKey = new PrivateKey('9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2');
69
+ const publicKey = privateKey.toPublicKey();
70
+
71
+ transaction.outputs[0]
72
+ .setScript(Script.buildDataOut(publicKey.hash));
73
+
74
+ rawStateTransition.assetLockProof.transaction = transaction.toBuffer();
75
+
76
+ stateTransition = new IdentityCreateTransition(rawStateTransition);
77
+
78
+ await stateTransition.signByPrivateKey(
79
+ privateKey.toBuffer(),
80
+ 0,
81
+ );
67
82
 
68
83
  const result = await validateStateTransitionKeySignature(
69
84
  stateTransition,
@@ -71,16 +86,28 @@ describe('validateStateTransitionKeySignatureFactory', () => {
71
86
 
72
87
  expect(result).to.be.instanceof(ValidationResult);
73
88
  expect(result.isValid()).to.be.true();
89
+ });
90
+
91
+ it('should return IdentityNotFoundError if identity not exist on topup transaction', async function () {
92
+ const stateTransitionJS = getIdentityTopUpTransitionFixture();
93
+ stateTransition = new IdentityTopUpTransition(stateTransitionJS.toObject());
94
+ stateRepositoryMock.fetchIdentityBalance.resolves(undefined);
74
95
 
75
- expect(fetchAssetLockPublicKeyHashMock).to.be.calledOnceWithExactly(
76
- stateTransition.getAssetLockProof(),
77
- executionContext,
96
+ const result = await validateStateTransitionKeySignature(
97
+ stateTransition,
78
98
  );
79
99
 
80
- expect(verifyHashSignatureMock).to.be.calledOnceWithExactly(
81
- stateTransitionHash,
82
- stateTransition.getSignature(),
83
- publicKeyHash,
100
+ await expectValidationError(result, IdentityNotFoundError);
101
+
102
+ const [error] = result.getErrors();
103
+
104
+ expect(error.getCode()).to.equal(2000);
105
+
106
+ const { match } = this.sinonSandbox;
107
+ expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly(
108
+ match((identityId) => Buffer.from(identityId.toBuffer())
109
+ .equals(stateTransition.getIdentityId().toBuffer())),
110
+ match.instanceOf(StateTransitionExecutionContext),
84
111
  );
85
112
  });
86
113
  });
@@ -1,48 +1,54 @@
1
- const UnsupportedProtocolVersionError = require('@dashevo/dpp/lib/errors/consensus/basic/UnsupportedProtocolVersionError');
2
- const CompatibleProtocolVersionIsNotDefinedError = require('@dashevo/dpp/lib/errors/CompatibleProtocolVersionIsNotDefinedError');
3
- const IncompatibleProtocolVersionError = require('@dashevo/dpp/lib/errors/consensus/basic/IncompatibleProtocolVersionError');
1
+ const { expectValidationError } = require('../../../lib/test/expect/expectError');
4
2
 
5
- const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock');
6
- const validateProtocolVersionFactory = require('@dashevo/dpp/lib/version/validateProtocolVersionFactory');
7
-
8
- const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
9
- const { latestVersion } = require('@dashevo/dpp/lib/version/protocolVersion');
3
+ let {
4
+ UnsupportedProtocolVersionError,
5
+ CompatibleProtocolVersionIsNotDefinedError,
6
+ IncompatibleProtocolVersionError,
7
+ ProtocolVersionValidator,
8
+ } = require('../../..');
9
+ const { default: loadWasmDpp } = require('../../..');
10
10
 
11
11
  describe('validateProtocolVersionFactory', () => {
12
- let validateProtocolVersion;
13
- let dppMock;
12
+ let protocolVersionValidator;
14
13
  let versionCompatibilityMap;
15
14
  let currentProtocolVersion;
16
15
  let protocolVersion;
17
16
 
18
- beforeEach(function beforeEach() {
17
+ before(async () => {
18
+ ({
19
+ UnsupportedProtocolVersionError,
20
+ CompatibleProtocolVersionIsNotDefinedError,
21
+ IncompatibleProtocolVersionError,
22
+ ProtocolVersionValidator,
23
+ } = await loadWasmDpp());
24
+ });
25
+
26
+ beforeEach(() => {
19
27
  protocolVersion = 1;
20
28
  currentProtocolVersion = 1;
21
29
 
22
- dppMock = createDPPMock(this.sinonSandbox);
23
- dppMock.getProtocolVersion.returns(currentProtocolVersion);
24
-
25
30
  versionCompatibilityMap = {
26
31
  1: 1,
27
32
  };
28
33
 
29
- validateProtocolVersion = validateProtocolVersionFactory(
30
- dppMock,
34
+ protocolVersionValidator = new ProtocolVersionValidator({
35
+ currentProtocolVersion,
36
+ latestProtocolVersion: protocolVersion,
31
37
  versionCompatibilityMap,
32
- );
38
+ });
33
39
  });
34
40
 
35
- it('should throw UnsupportedProtocolVersionError if protocolVersion is higher than latestVersion', () => {
36
- protocolVersion = latestVersion + 1;
41
+ it('should throw UnsupportedProtocolVersionError if protocolVersion is higher than latestVersion', async () => {
42
+ const highVersion = protocolVersion + 1;
37
43
 
38
- const result = validateProtocolVersion(protocolVersion);
44
+ const result = protocolVersionValidator.validate(highVersion);
39
45
 
40
- expectValidationError(result, UnsupportedProtocolVersionError);
46
+ await expectValidationError(result, UnsupportedProtocolVersionError);
41
47
 
42
48
  const error = result.getFirstError();
43
49
 
44
- expect(error.getParsedProtocolVersion()).to.equal(protocolVersion);
45
- expect(error.getLatestVersion()).to.equal(latestVersion);
50
+ expect(error.getParsedProtocolVersion()).to.equal(highVersion);
51
+ expect(error.getLatestVersion()).to.equal(protocolVersion);
46
52
  expect(error.getCode()).to.equal(1002);
47
53
  });
48
54
 
@@ -50,8 +56,14 @@ describe('validateProtocolVersionFactory', () => {
50
56
  + ' defined for the current protocol version', () => {
51
57
  delete versionCompatibilityMap[currentProtocolVersion.toString()];
52
58
 
59
+ protocolVersionValidator = new ProtocolVersionValidator({
60
+ currentProtocolVersion,
61
+ latestProtocolVersion: protocolVersion,
62
+ versionCompatibilityMap,
63
+ });
64
+
53
65
  try {
54
- validateProtocolVersion(protocolVersion);
66
+ protocolVersionValidator.validate(protocolVersion);
55
67
 
56
68
  expect.fail('should throw CompatibleProtocolVersionIsNotDefinedError');
57
69
  } catch (e) {
@@ -59,7 +71,7 @@ describe('validateProtocolVersionFactory', () => {
59
71
  }
60
72
  });
61
73
 
62
- it('should throw IncompatibleProtocolVersionError if parsed version is lower than compatible one', () => {
74
+ it('should throw IncompatibleProtocolVersionError if parsed version is lower than compatible one', async () => {
63
75
  const minimalProtocolVersion = 1;
64
76
 
65
77
  protocolVersion = 0;
@@ -67,9 +79,15 @@ describe('validateProtocolVersionFactory', () => {
67
79
 
68
80
  versionCompatibilityMap[currentProtocolVersion.toString()] = minimalProtocolVersion;
69
81
 
70
- const result = validateProtocolVersion(protocolVersion);
82
+ protocolVersionValidator = new ProtocolVersionValidator({
83
+ currentProtocolVersion,
84
+ latestProtocolVersion: protocolVersion,
85
+ versionCompatibilityMap,
86
+ });
87
+
88
+ const result = protocolVersionValidator.validate(protocolVersion);
71
89
 
72
- expectValidationError(result, IncompatibleProtocolVersionError);
90
+ await expectValidationError(result, IncompatibleProtocolVersionError);
73
91
 
74
92
  const error = result.getFirstError();
75
93