@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,50 +1,77 @@
1
+ const identitySchema = require('@dashevo/dpp/schema/identity/identity.json');
1
2
  const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
2
- const validateIdentityUpdateTransitionStateFactory = require('@dashevo/dpp/lib/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory');
3
3
  const getIdentityUpdateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityUpdateTransitionFixture');
4
- const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey');
5
4
  const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture');
6
5
  const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
7
- const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
8
- const InvalidIdentityRevisionError = require('@dashevo/dpp/lib/errors/consensus/state/identity/InvalidIdentityRevisionError');
9
- const IdentityPublicKeyIsReadOnlyError = require('@dashevo/dpp/lib/errors/consensus/state/identity/IdentityPublicKeyIsReadOnlyError');
10
- const IdentityPublicKeyDisabledAtWindowViolationError = require('@dashevo/dpp/lib/errors/consensus/state/identity/IdentityPublicKeyDisabledAtWindowViolationError');
11
- const InvalidIdentityPublicKeyIdError = require('@dashevo/dpp/lib/errors/consensus/state/identity/InvalidIdentityPublicKeyIdError');
12
6
  const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError');
13
- const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
14
- const IdentityPublicKeyIsDisabledError = require('@dashevo/dpp/lib/errors/consensus/state/identity/IdentityPublicKeyIsDisabledError');
7
+
8
+ const { default: loadWasmDpp } = require('../../../../../../../dist');
9
+ const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
10
+ const generateRandomIdentifierAsync = require('../../../../../../../lib/test/utils/generateRandomIdentifierAsync');
11
+ const getBlsAdapterMock = require('../../../../../../../lib/test/mocks/getBlsAdapterMock');
15
12
 
16
13
  describe('validateIdentityUpdateTransitionStateFactory', () => {
17
14
  let validateIdentityUpdateTransitionState;
18
15
  let stateRepositoryMock;
19
16
  let stateTransition;
20
17
  let identity;
18
+ let rawIdentity;
21
19
  let validatePublicKeysMock;
22
- let fakeTime;
23
20
  let blockTime;
24
- let validateRequiredPurposeAndSecurityLevelMock;
25
21
  let executionContext;
26
22
 
23
+ let Identity;
24
+ let IdentityPublicKey;
25
+ let IdentityUpdateTransition;
26
+ let InvalidIdentityRevisionError;
27
+ let IdentityPublicKeyIsReadOnlyError;
28
+ let IdentityPublicKeyIsDisabledError;
29
+ let InvalidIdentityPublicKeyIdError;
30
+ let MissingMasterPublicKeyError;
31
+ let IdentityPublicKeyDisabledAtWindowViolationError;
32
+ let MaxIdentityPublicKeyLimitReachedError;
33
+ let StateTransitionExecutionContext;
34
+ let IdentityUpdateTransitionStateValidator;
35
+
36
+ before(async () => {
37
+ ({
38
+ Identity,
39
+ IdentityPublicKey,
40
+ IdentityUpdateTransition,
41
+ InvalidIdentityRevisionError,
42
+ IdentityPublicKeyIsReadOnlyError,
43
+ IdentityPublicKeyIsDisabledError,
44
+ InvalidIdentityPublicKeyIdError,
45
+ IdentityPublicKeyDisabledAtWindowViolationError,
46
+ MaxIdentityPublicKeyLimitReachedError,
47
+ StateTransitionExecutionContext,
48
+ IdentityUpdateTransitionStateValidator,
49
+ MissingMasterPublicKeyError,
50
+ } = await loadWasmDpp());
51
+ });
52
+
27
53
  beforeEach(async function beforeEach() {
28
- identity = getIdentityFixture();
29
- validatePublicKeysMock = this.sinonSandbox.stub()
30
- .returns(new ValidationResult());
31
- validateRequiredPurposeAndSecurityLevelMock = this.sinonSandbox.stub()
32
- .returns(new ValidationResult());
54
+ rawIdentity = getIdentityFixture().toObject();
55
+ // Patch identity id to be acceptable by wasm-dpp
56
+ rawIdentity.id = await generateRandomIdentifierAsync();
57
+ identity = new Identity(rawIdentity);
33
58
 
34
59
  stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
35
60
  stateRepositoryMock.fetchIdentity.resolves(identity);
36
61
 
37
62
  blockTime = Date.now();
63
+ const blsAdapter = await getBlsAdapterMock();
38
64
 
65
+ stateRepositoryMock.fetchLatestPlatformBlockTime = this.sinonSandbox.stub();
39
66
  stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTime);
40
67
 
41
- validateIdentityUpdateTransitionState = validateIdentityUpdateTransitionStateFactory(
42
- stateRepositoryMock,
43
- validatePublicKeysMock,
44
- validateRequiredPurposeAndSecurityLevelMock,
68
+ const validator = new IdentityUpdateTransitionStateValidator(stateRepositoryMock, blsAdapter);
69
+ validateIdentityUpdateTransitionState = (st) => validator.validate(st);
70
+
71
+ stateTransition = new IdentityUpdateTransition(
72
+ getIdentityUpdateTransitionFixture().toObject(),
45
73
  );
46
74
 
47
- stateTransition = getIdentityUpdateTransitionFixture();
48
75
  stateTransition.setRevision(identity.getRevision() + 1);
49
76
  stateTransition.setPublicKeyIdsToDisable(undefined);
50
77
  stateTransition.setPublicKeysDisabledAt(undefined);
@@ -55,46 +82,47 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
55
82
 
56
83
  const privateKey = '9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2';
57
84
 
58
- await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1);
59
-
60
- fakeTime = this.sinonSandbox.useFakeTimers(new Date());
61
- });
62
-
63
- afterEach(() => {
64
- fakeTime.reset();
85
+ await stateTransition.signByPrivateKey(
86
+ Buffer.from(privateKey, 'hex'), IdentityPublicKey.TYPES.ECDSA_SECP256K1,
87
+ );
65
88
  });
66
89
 
67
90
  it('should return InvalidIdentityRevisionError if new revision is not incremented by 1', async () => {
68
- stateTransition.setRevision(identity.getRevision() + 2);
91
+ stateTransition.setRevision(rawIdentity.revision + 2);
69
92
 
70
93
  const result = await validateIdentityUpdateTransitionState(stateTransition);
71
94
 
72
- expectValidationError(result, InvalidIdentityRevisionError);
95
+ await expectValidationError(result, InvalidIdentityRevisionError);
73
96
 
74
97
  const [error] = result.getErrors();
75
- expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId());
76
- expect(error.getCurrentRevision()).to.equal(identity.getRevision());
98
+ expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId().toBuffer());
99
+ expect(error.getCurrentRevision()).to.equal(rawIdentity.revision);
77
100
  });
78
101
 
79
102
  it('should return IdentityPublicKeyIsReadOnlyError if disabling public key is readOnly', async () => {
80
- identity.getPublicKeyById(0).setReadOnly(true);
103
+ const keys = identity.getPublicKeys();
104
+ keys[0].setReadOnly(true);
105
+ identity.setPublicKeys(keys);
106
+
81
107
  stateTransition.setPublicKeyIdsToDisable([0]);
82
108
 
83
109
  const result = await validateIdentityUpdateTransitionState(stateTransition);
84
110
 
85
- expectValidationError(result, IdentityPublicKeyIsReadOnlyError);
111
+ await expectValidationError(result, IdentityPublicKeyIsReadOnlyError);
86
112
 
87
113
  const [error] = result.getErrors();
88
114
  expect(error.getPublicKeyIndex()).to.equal(0);
89
115
  });
90
116
 
91
117
  it('should return IdentityPublicKeyIsDisabledError if disabling public key is already disabled', async () => {
92
- identity.getPublicKeyById(0).setDisabledAt(new Date().getTime());
118
+ const keys = identity.getPublicKeys();
119
+ keys[0].setDisabledAt(new Date().getTime());
120
+ identity.setPublicKeys(keys);
93
121
  stateTransition.setPublicKeyIdsToDisable([0]);
94
122
 
95
123
  const result = await validateIdentityUpdateTransitionState(stateTransition);
96
124
 
97
- expectValidationError(result, IdentityPublicKeyIsDisabledError);
125
+ await expectValidationError(result, IdentityPublicKeyIsDisabledError);
98
126
 
99
127
  const [error] = result.getErrors();
100
128
  expect(error.getPublicKeyIndex()).to.equal(0);
@@ -103,7 +131,8 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
103
131
  it('should return invalid result if disabledAt has violated time window', async () => {
104
132
  stateTransition.setPublicKeyIdsToDisable([1]);
105
133
  // blockTime - 10 minutes
106
- stateTransition.setPublicKeysDisabledAt(new Date(blockTime - 1000 * 60 * 60 * 10));
134
+ const disabledAt = new Date(blockTime - 1000 * 60 * 60 * 10);
135
+ stateTransition.setPublicKeysDisabledAt(disabledAt);
107
136
 
108
137
  const timeWindowStart = new Date(blockTime);
109
138
  timeWindowStart.setMinutes(
@@ -117,12 +146,12 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
117
146
 
118
147
  const result = await validateIdentityUpdateTransitionState(stateTransition);
119
148
 
120
- expectValidationError(result, IdentityPublicKeyDisabledAtWindowViolationError);
149
+ await expectValidationError(result, IdentityPublicKeyDisabledAtWindowViolationError);
121
150
 
122
151
  const [error] = result.getErrors();
123
- expect(error.getDisabledAt()).to.deep.equal(stateTransition.publicKeysDisabledAt);
124
- expect(error.getTimeWindowStart()).to.deep.equal(timeWindowStart);
125
- expect(error.getTimeWindowEnd()).to.deep.equal(timeWindowEnd);
152
+ expect(error.getDisabledAt()).to.deep.equal(disabledAt);
153
+ expect(error.getTimeWindowStart()).to.be.instanceOf(Date);
154
+ expect(error.getTimeWindowEnd()).to.be.instanceOf(Date);
126
155
  });
127
156
 
128
157
  it('should throw InvalidIdentityPublicKeyIdError if identity does not contain public key with disabling ID', async () => {
@@ -131,13 +160,13 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
131
160
 
132
161
  const result = await validateIdentityUpdateTransitionState(stateTransition);
133
162
 
134
- expectValidationError(result, InvalidIdentityPublicKeyIdError);
163
+ await expectValidationError(result, InvalidIdentityPublicKeyIdError);
135
164
 
136
165
  const [error] = result.getErrors();
137
166
  expect(error.getId()).to.equal(3);
138
167
  });
139
168
 
140
- it('should pass when disabling public key', async () => {
169
+ it('should pass when disabling public key', async function () {
141
170
  stateTransition.setPublicKeyIdsToDisable([1]);
142
171
  stateTransition.setPublicKeysDisabledAt(new Date());
143
172
  stateTransition.setPublicKeysToAdd(undefined);
@@ -146,17 +175,18 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
146
175
 
147
176
  expect(result.isValid()).to.be.true();
148
177
 
178
+ const { match } = this.sinonSandbox;
149
179
  expect(stateRepositoryMock.fetchIdentity)
150
180
  .to.be.calledOnceWithExactly(
151
- stateTransition.getIdentityId(),
152
- executionContext,
181
+ match((val) => val.toBuffer().equals(stateTransition.getIdentityId().toBuffer())),
182
+ match.instanceOf(StateTransitionExecutionContext),
153
183
  );
154
184
 
155
185
  expect(stateRepositoryMock.fetchLatestPlatformBlockTime)
156
186
  .to.be.calledOnce();
157
187
  });
158
188
 
159
- it('should pass when adding public key', async () => {
189
+ it('should pass when adding public key', async function () {
160
190
  stateTransition.setPublicKeyIdsToDisable(undefined);
161
191
  stateTransition.setPublicKeysDisabledAt(undefined);
162
192
 
@@ -164,23 +194,18 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
164
194
 
165
195
  expect(result.isValid()).to.be.true();
166
196
 
197
+ const { match } = this.sinonSandbox;
167
198
  expect(stateRepositoryMock.fetchIdentity)
168
199
  .to.be.calledOnceWithExactly(
169
- stateTransition.getIdentityId(),
170
- executionContext,
200
+ match((val) => val.toBuffer().equals(stateTransition.getIdentityId().toBuffer())),
201
+ match.instanceOf(StateTransitionExecutionContext),
171
202
  );
172
203
 
173
204
  expect(stateRepositoryMock.fetchLatestPlatformBlockTime)
174
205
  .to.not.be.called();
175
-
176
- expect(validatePublicKeysMock).to.be.calledOnceWithExactly(
177
- [...identity.getPublicKeys(), ...stateTransition.getPublicKeysToAdd()].map(
178
- (pk) => pk.toObject(),
179
- ),
180
- );
181
206
  });
182
207
 
183
- it('should pass when both adding and disabling public keys', async () => {
208
+ it('should pass when both adding and disabling public keys', async function () {
184
209
  stateTransition.setPublicKeyIdsToDisable([1]);
185
210
  stateTransition.setPublicKeysDisabledAt(new Date());
186
211
 
@@ -188,10 +213,11 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
188
213
 
189
214
  expect(result.isValid()).to.be.true();
190
215
 
216
+ const { match } = this.sinonSandbox;
191
217
  expect(stateRepositoryMock.fetchIdentity)
192
218
  .to.be.calledOnceWithExactly(
193
- stateTransition.getIdentityId(),
194
- executionContext,
219
+ match((val) => val.toBuffer().equals(stateTransition.getIdentityId().toBuffer())),
220
+ match.instanceOf(StateTransitionExecutionContext),
195
221
  );
196
222
 
197
223
  expect(stateRepositoryMock.fetchLatestPlatformBlockTime)
@@ -199,43 +225,36 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
199
225
  });
200
226
 
201
227
  it('should validate purpose and security level', async () => {
202
- const now = new Date();
203
-
204
- stateTransition.setPublicKeyIdsToDisable([1]);
205
- stateTransition.setPublicKeysDisabledAt(now);
206
-
207
- const publicKeysError = new SomeConsensusError('test');
228
+ const identityKeys = identity.getPublicKeys();
229
+ identityKeys.forEach((key) => key.setSecurityLevel(1));
230
+ identity.setPublicKeys(identityKeys);
208
231
 
209
- validateRequiredPurposeAndSecurityLevelMock.onCall(0)
210
- .returns(new ValidationResult([publicKeysError]));
232
+ const keysToAdd = stateTransition.getPublicKeysToAdd();
233
+ keysToAdd.forEach((key) => key.setSecurityLevel(1));
234
+ stateTransition.setPublicKeysToAdd(keysToAdd);
211
235
 
212
236
  const result = await validateIdentityUpdateTransitionState(stateTransition);
213
237
 
214
- expectValidationError(result, SomeConsensusError);
215
-
216
- expect(validateRequiredPurposeAndSecurityLevelMock).to.be.calledOnceWithExactly([
217
- identity.getPublicKeys()[0].toObject(),
218
- { ...identity.getPublicKeys()[1].toObject(), disabledAt: now.getTime() },
219
- stateTransition.getPublicKeysToAdd()[0].toObject(),
220
- ]);
238
+ await expectValidationError(result, MissingMasterPublicKeyError);
221
239
  });
222
240
 
223
241
  it('should validate public keys to add', async () => {
224
- const publicKeysError = new SomeConsensusError('test');
242
+ // Reach max allowed public keys to fail validation
243
+ const { maxItems } = identitySchema.properties.publicKeys;
225
244
 
226
- validatePublicKeysMock.onCall(0).returns(new ValidationResult([publicKeysError]));
245
+ const firstKey = identity.getPublicKeys()[0].toObject();
246
+ const keys = Array.from({ length: maxItems + 1 })
247
+ .map((_, index) => new IdentityPublicKey({ ...firstKey, id: index }));
248
+ identity.setPublicKeys(keys);
227
249
 
228
250
  const result = await validateIdentityUpdateTransitionState(stateTransition);
229
251
 
230
- expectValidationError(result, SomeConsensusError);
231
-
232
- expect(validatePublicKeysMock).to.be.calledOnceWithExactly(
233
- [...identity.getPublicKeys(), ...stateTransition.getPublicKeysToAdd()]
234
- .map((pk) => pk.toObject()),
235
- );
252
+ await expectValidationError(result, MaxIdentityPublicKeyLimitReachedError);
236
253
  });
237
254
 
238
- it('should validate resulting identity public keys', async () => {
255
+ // TODO: remove?
256
+ // Skipped, because two tests above are seem to be enough
257
+ it.skip('should validate resulting identity public keys', async () => {
239
258
  const publicKeysError = new SomeConsensusError('test');
240
259
 
241
260
  validatePublicKeysMock.returns(new ValidationResult([publicKeysError]));
@@ -253,29 +272,25 @@ describe('validateIdentityUpdateTransitionStateFactory', () => {
253
272
  );
254
273
  });
255
274
 
256
- it('should return valid result on dry run', async () => {
275
+ it('should return valid result on dry run', async function () {
257
276
  stateTransition.setPublicKeyIdsToDisable([3]);
258
277
  stateTransition.setPublicKeysDisabledAt(new Date());
259
278
 
260
- const publicKeysError = new SomeConsensusError('test');
261
-
262
- validateRequiredPurposeAndSecurityLevelMock.onCall(0)
263
- .returns(new ValidationResult([publicKeysError]));
279
+ // Make code that executes after dry run check to fail
280
+ stateRepositoryMock.fetchLatestPlatformBlockTime.resolves({});
264
281
 
265
282
  stateTransition.getExecutionContext().enableDryRun();
266
-
267
283
  const result = await validateIdentityUpdateTransitionState(stateTransition);
268
284
 
269
285
  stateTransition.getExecutionContext().disableDryRun();
270
286
 
271
287
  expect(result.isValid()).to.be.true();
272
288
 
273
- expect(validatePublicKeysMock).to.not.be.called();
274
- expect(validateRequiredPurposeAndSecurityLevelMock).to.not.be.called();
289
+ const { match } = this.sinonSandbox;
275
290
  expect(stateRepositoryMock.fetchIdentity)
276
291
  .to.be.calledOnceWithExactly(
277
- stateTransition.getIdentityId(),
278
- executionContext,
292
+ match((val) => val.toBuffer().equals(stateTransition.getIdentityId().toBuffer())),
293
+ match.instanceOf(StateTransitionExecutionContext),
279
294
  );
280
295
 
281
296
  expect(stateRepositoryMock.fetchLatestPlatformBlockTime)
@@ -1,26 +1,60 @@
1
- const validatePublicKeys = require(
2
- '@dashevo/dpp/lib/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState',
3
- );
4
- const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
5
- const DuplicatedIdentityPublicKeyIdError = require('@dashevo/dpp/lib/errors/consensus/state/identity/DuplicatedIdentityPublicKeyIdError');
6
- const DuplicatedIdentityPublicKeyError = require('@dashevo/dpp/lib/errors/consensus/state/identity/DuplicatedIdentityPublicKeyError');
7
1
  const identitySchema = require('@dashevo/dpp/schema/identity/identity.json');
8
- const MaxIdentityPublicKeyLimitReachedError = require('@dashevo/dpp/lib/errors/consensus/state/identity/MaxIdentityPublicKeyLimitReachedError');
9
- const getIdentityFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityFixture');
2
+ const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
3
+
4
+ const { default: loadWasmDpp } = require('../../../../../../../dist');
10
5
 
11
6
  describe('validatePublicKeysState', () => {
7
+ let IdentityUpdatePublicKeysValidator;
8
+ let DuplicatedIdentityPublicKeyIdStateError;
9
+ let DuplicatedIdentityPublicKeyStateError;
10
+ let IdentityPublicKey;
11
+ let MaxIdentityPublicKeyLimitReachedError;
12
+
13
+ let validatePublicKeys;
12
14
  let rawPublicKeys;
13
15
 
16
+ before(async () => {
17
+ ({
18
+ IdentityPublicKey,
19
+ IdentityUpdatePublicKeysValidator,
20
+ DuplicatedIdentityPublicKeyStateError,
21
+ DuplicatedIdentityPublicKeyIdStateError,
22
+ MaxIdentityPublicKeyLimitReachedError,
23
+ } = await loadWasmDpp());
24
+ });
25
+
14
26
  beforeEach(() => {
15
- ({ publicKeys: rawPublicKeys } = getIdentityFixture().toObject());
27
+ rawPublicKeys = [
28
+ {
29
+ id: 0,
30
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
31
+ data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'),
32
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
33
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
34
+ signature: Buffer.alloc(0),
35
+ readOnly: false,
36
+ },
37
+ {
38
+ id: 1,
39
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
40
+ data: Buffer.from('A8AK95PYMVX5VQKzOhcVQRCUbc9pyg3RiL7jttEMDU+L', 'base64'),
41
+ purpose: IdentityPublicKey.PURPOSES.ENCRYPTION,
42
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MEDIUM,
43
+ signature: Buffer.alloc(0),
44
+ readOnly: false,
45
+ },
46
+ ];
47
+
48
+ const validator = new IdentityUpdatePublicKeysValidator();
49
+ validatePublicKeys = (keys) => validator.validate(keys);
16
50
  });
17
51
 
18
- it('should return invalid result if there are duplicate key ids', () => {
52
+ it('should return invalid result if there are duplicate key ids', async () => {
19
53
  rawPublicKeys[1].id = rawPublicKeys[0].id;
20
54
 
21
55
  const result = validatePublicKeys(rawPublicKeys);
22
56
 
23
- expectValidationError(result, DuplicatedIdentityPublicKeyIdError);
57
+ await expectValidationError(result, DuplicatedIdentityPublicKeyIdStateError);
24
58
 
25
59
  const [error] = result.getErrors();
26
60
 
@@ -28,12 +62,12 @@ describe('validatePublicKeysState', () => {
28
62
  expect(error.getDuplicatedIds()).to.deep.equal([rawPublicKeys[1].id]);
29
63
  });
30
64
 
31
- it('should return invalid result if there are duplicate keys', () => {
65
+ it('should return invalid result if there are duplicate keys', async () => {
32
66
  rawPublicKeys[1].data = rawPublicKeys[0].data;
33
67
 
34
68
  const result = validatePublicKeys(rawPublicKeys);
35
69
 
36
- expectValidationError(result, DuplicatedIdentityPublicKeyError);
70
+ await expectValidationError(result, DuplicatedIdentityPublicKeyStateError);
37
71
 
38
72
  const [error] = result.getErrors();
39
73
 
@@ -47,7 +81,7 @@ describe('validatePublicKeysState', () => {
47
81
  expect(result.isValid()).to.be.true();
48
82
  });
49
83
 
50
- it('should return invalid result if number of public keys is bigger than 32', () => {
84
+ it('should return invalid result if number of public keys is bigger than 32', async () => {
51
85
  const { maxItems } = identitySchema.properties.publicKeys;
52
86
  const numToAdd = maxItems - rawPublicKeys.length;
53
87
 
@@ -57,10 +91,10 @@ describe('validatePublicKeysState', () => {
57
91
 
58
92
  const result = validatePublicKeys(rawPublicKeys);
59
93
 
60
- expectValidationError(result, MaxIdentityPublicKeyLimitReachedError);
94
+ await expectValidationError(result, MaxIdentityPublicKeyLimitReachedError);
61
95
 
62
96
  const [error] = result.getErrors();
63
97
  expect(error.getCode()).to.equal(4020);
64
- expect(error.geMaxItems()).to.equal(maxItems);
98
+ expect(error.getMaxItems()).to.equal(maxItems);
65
99
  });
66
100
  });