@dashevo/wasm-dpp 0.24.0-dev.11 → 0.24.0-dev.13

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 (167) hide show
  1. package/Cargo.toml +3 -0
  2. package/README.md +5 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.LICENSE.txt +9 -0
  5. package/dist/lib/dpp.d.ts +9 -0
  6. package/dist/lib/errors/AbstractConsensusError.d.ts +10 -0
  7. package/dist/lib/errors/DPPError.d.ts +5 -0
  8. package/dist/lib/errors/patchConsensusErrors.d.ts +1 -0
  9. package/dist/lib/{patchIdentifier.d.ts → identifier/patchIdentifier.d.ts} +1 -1
  10. package/dist/{index.d.ts → lib/index.d.ts} +1 -1
  11. package/dist/lib/utils/extend.d.ts +1 -0
  12. package/dist/wasm/wasm_dpp.d.ts +1595 -518
  13. package/karma.conf.js +5 -0
  14. package/lib/dpp.ts +24 -0
  15. package/lib/errors/AbstractConsensusError.ts +13 -0
  16. package/lib/errors/DPPError.ts +15 -0
  17. package/lib/errors/patchConsensusErrors.ts +175 -0
  18. package/lib/{patchIdentifier.ts → identifier/patchIdentifier.ts} +6 -5
  19. package/{index.ts → lib/index.ts} +5 -4
  20. package/lib/test/bootstrap.js +5 -0
  21. package/lib/test/expect/expectError.js +4 -2
  22. package/lib/test/mocks/getBlsAdapterMock.js +36 -0
  23. package/lib/test/utils/newDocumentsContainer.js +36 -0
  24. package/lib/utils/extend.ts +6 -0
  25. package/package.json +9 -6
  26. package/src/bls_adapter.rs +16 -1
  27. package/src/data_contract/data_contract.rs +35 -7
  28. package/src/data_contract/errors/invalid_data_contract.rs +21 -0
  29. package/src/data_contract/errors/invalid_document_type.rs +1 -1
  30. package/src/data_contract/index.rs +56 -1
  31. package/src/data_contract/mod.rs +1 -0
  32. package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +6 -8
  33. package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +4 -4
  34. package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +44 -0
  35. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +145 -0
  36. package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +49 -0
  37. package/src/data_contract/state_transition/mod.rs +2 -0
  38. package/src/data_contract_factory/data_contract_factory.rs +25 -12
  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 +192 -0
  45. package/src/document/mod.rs +222 -30
  46. package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +47 -1
  47. package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +25 -1
  48. package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +65 -0
  49. package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +123 -3
  50. package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
  51. package/src/document/validator.rs +30 -0
  52. package/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +5 -5
  53. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +4 -4
  54. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +36 -0
  55. package/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +20 -0
  56. package/src/errors/consensus/basic/document/mod.rs +4 -0
  57. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +2 -2
  58. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +2 -2
  59. package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
  60. package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
  61. package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
  62. package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +2 -2
  63. package/src/errors/consensus/basic/json_schema_error.rs +1 -1
  64. package/src/errors/consensus_error.rs +15 -8
  65. package/src/errors/dpp_error.rs +17 -0
  66. package/src/errors/from.rs +6 -1
  67. package/src/errors/js_conversion.rs +19 -4
  68. package/src/errors/mod.rs +3 -0
  69. package/src/errors/protocol_error.rs +15 -0
  70. package/src/{identifier.rs → identifier/mod.rs} +48 -3
  71. package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
  72. package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
  73. package/src/identity/errors/mod.rs +7 -0
  74. package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
  75. package/src/{identity_facade.rs → identity/identity_facade.rs} +3 -5
  76. package/src/{identity_public_key → identity/identity_public_key}/key_type.rs +0 -0
  77. package/src/{identity_public_key → identity/identity_public_key}/mod.rs +41 -10
  78. package/src/{identity_public_key → identity/identity_public_key}/purpose.rs +0 -0
  79. package/src/{identity_public_key → identity/identity_public_key}/security_level.rs +0 -0
  80. package/src/{identity.rs → identity/mod.rs} +20 -12
  81. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
  82. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
  83. package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
  84. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
  85. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
  86. package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
  87. package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
  88. package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
  89. package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +335 -0
  90. package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
  91. package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
  92. package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
  93. package/src/identity/state_transition/identity_create_transition/to_object.rs +46 -0
  94. package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
  95. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +280 -0
  96. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
  97. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
  98. package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
  99. package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
  100. package/src/identity/state_transition/mod.rs +9 -0
  101. package/src/identity/state_transition/validate_public_key_signatures.rs +59 -0
  102. package/src/identity/validation/mod.rs +3 -0
  103. package/src/identity/validation/public_keys_validator.rs +76 -0
  104. package/src/identity_public_key/public_keys_validator.rs +1 -1
  105. package/src/lib.rs +3 -6
  106. package/src/lodash.rs +7 -0
  107. package/src/state_repository.rs +188 -36
  108. package/src/state_transition/mod.rs +12 -0
  109. package/src/utils.rs +102 -7
  110. package/src/validation/json_schema_validator.rs +41 -0
  111. package/src/validation/mod.rs +5 -0
  112. package/src/{validation_result.rs → validation/validation_result.rs} +23 -5
  113. package/src/version/mod.rs +2 -0
  114. package/src/version/protocol_version.rs +26 -0
  115. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +579 -502
  116. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +175 -165
  117. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +83 -114
  118. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +1 -1
  119. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +82 -91
  120. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +75 -31
  121. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -148
  122. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +63 -75
  123. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +48 -19
  124. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +79 -114
  125. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +0 -11
  126. package/test/integration/stateTransition/StateTransitionFacade.spec.js +1 -1
  127. package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +135 -0
  128. package/test/unit/dataContract/DataContract.spec.js +5 -9
  129. package/test/unit/dataContract/DataContractFactory.spec.js +13 -6
  130. package/test/unit/dataContract/createDataContract.spec.js +0 -1
  131. package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +11 -3
  132. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
  133. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +20 -16
  134. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +24 -60
  135. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +27 -23
  136. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +29 -12
  137. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +66 -49
  138. package/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +73 -0
  139. package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
  140. package/test/unit/document/Document.spec.js +147 -155
  141. package/test/unit/document/DocumentFactory.spec.js +325 -91
  142. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +142 -64
  143. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +1 -1
  144. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +1 -1
  145. package/test/unit/identity/Identity.spec.js +2 -2
  146. package/test/unit/identity/IdentityPublicKey.spec.js +25 -31
  147. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +69 -30
  148. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +32 -32
  149. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +56 -25
  150. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
  151. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +48 -46
  152. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
  153. package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
  154. package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
  155. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
  156. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
  157. package/tsconfig.json +1 -1
  158. package/wasm/package.json +5 -0
  159. package/wasm/wasm_dpp.d.ts +1595 -518
  160. package/wasm/wasm_dpp.js +5007 -2172
  161. package/wasm/wasm_dpp_bg.js +1 -1
  162. package/wasm/wasm_dpp_bg.wasm +0 -0
  163. package/wasm/wasm_dpp_bg.wasm.d.ts +566 -365
  164. package/webpack.config.js +10 -1
  165. package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +0 -32
  166. package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +0 -93
  167. package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +0 -64
@@ -194,13 +194,12 @@ describe('DataContract', () => {
194
194
 
195
195
  describe('#getDocumentSchema', () => {
196
196
  it('should throw error if Document is not defined', () => {
197
- let error;
198
197
  try {
199
198
  dataContract.getDocumentSchema('undefinedObject');
199
+ expect.fail('Error was not thrown');
200
200
  } catch (e) {
201
- error = e;
201
+ expect(e.getType()).to.equal('undefinedObject');
202
202
  }
203
- expect(error.getDocType()).to.equal('undefinedObject');
204
203
  });
205
204
 
206
205
  it('should return Document Schema', () => {
@@ -212,13 +211,12 @@ describe('DataContract', () => {
212
211
 
213
212
  describe('#getDocumentSchemaRef', () => {
214
213
  it('should throw error if Document is not defined', () => {
215
- let error;
216
214
  try {
217
215
  dataContract.getDocumentSchemaRef('undefinedObject');
216
+ expect.fail('Error was not thrown');
218
217
  } catch (e) {
219
- error = e;
218
+ expect(e.getType()).to.equal('undefinedObject');
220
219
  }
221
- expect(error.getDocType()).to.equal('undefinedObject');
222
220
  });
223
221
 
224
222
  it('should return schema ref', () => {
@@ -324,14 +322,12 @@ describe('DataContract', () => {
324
322
  });
325
323
 
326
324
  it('should throw an error if document type is not found', () => {
327
- let error;
328
325
  try {
329
326
  dataContract.getBinaryProperties('unknown');
330
327
  expect.fail('Error was not thrown');
331
328
  } catch (e) {
332
- error = e;
329
+ expect(e.getType()).to.equal('unknown');
333
330
  }
334
- expect(error.getDocType()).to.equal('unknown');
335
331
  });
336
332
  });
337
333
 
@@ -9,6 +9,8 @@ describe('DataContractFactory', () => {
9
9
  let DataContractValidator;
10
10
  let DataContract;
11
11
  let InvalidDataContractError;
12
+ let SerializedObjectParsingError;
13
+ let JsonSchemaError;
12
14
 
13
15
  let factory;
14
16
  let jsDataContract;
@@ -17,7 +19,12 @@ describe('DataContractFactory', () => {
17
19
 
18
20
  before(async () => {
19
21
  ({
20
- DataContractFactory, DataContractValidator, DataContract, InvalidDataContractError,
22
+ DataContractFactory,
23
+ DataContractValidator,
24
+ DataContract,
25
+ InvalidDataContractError,
26
+ SerializedObjectParsingError,
27
+ JsonSchemaError,
21
28
  } = await loadWasmDpp());
22
29
  });
23
30
 
@@ -73,8 +80,9 @@ describe('DataContractFactory', () => {
73
80
  expect(e).to.be.an.instanceOf(InvalidDataContractError);
74
81
  expect(e.getRawDataContract()).to.deep.equal(alteredContract);
75
82
  expect(e.getErrors()).to.have.length(1);
76
- // TODO JsonSchemaError binding type required
77
- // const [consensusError] = error.getErrors();
83
+
84
+ const [consensusError] = e.getErrors();
85
+ expect(consensusError).to.be.an.instanceOf(JsonSchemaError);
78
86
  }
79
87
  });
80
88
  });
@@ -99,9 +107,8 @@ describe('DataContractFactory', () => {
99
107
  await factory.createFromBuffer(serializedDataContract);
100
108
  expect.fail('should throw InvalidDataContractError');
101
109
  } catch (e) {
102
- // TODO SerializedObjectParsingError binding type required
103
- // expect(e).to.be.an.instanceOf(SerializedObjectPasingError);
104
- expect(e).to.match(/Parsing of serialized object failed/);
110
+ expect(e).to.be.an.instanceOf(SerializedObjectParsingError);
111
+ expect(e.getParsingError()).to.match(/Decode protocol entity/);
105
112
  }
106
113
  });
107
114
  });
@@ -16,7 +16,6 @@ describe('createDataContract', () => {
16
16
  rawDataContract = {
17
17
  $id: generateRandomIdentifier().toBuffer(),
18
18
  ownerId: generateRandomIdentifier().toBuffer(),
19
- contractId: generateRandomIdentifier().toBuffer(),
20
19
  protocolVersion: 4,
21
20
  version: 20,
22
21
  $schema: 'http://test.com/schema',
@@ -1,9 +1,17 @@
1
- const InvalidDataContractError = require('@dashevo/dpp/lib/dataContract/errors/InvalidDataContractError');
2
1
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
3
2
 
3
+ const { default: loadWasmDpp } = require('../../../../dist');
4
+
4
5
  describe('InvalidDataContractError', () => {
5
6
  let rawDataContract;
6
7
  let error;
8
+ let InvalidDataContractError;
9
+
10
+ before(async () => {
11
+ ({
12
+ InvalidDataContractError,
13
+ } = await loadWasmDpp());
14
+ });
7
15
 
8
16
  beforeEach(() => {
9
17
  error = new Error('Some error');
@@ -33,7 +41,7 @@ describe('InvalidDataContractError', () => {
33
41
 
34
42
  const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
35
43
 
36
- expect(invalidDataContractError.message).to.equal(`Invalid Data Contract: "${error.message}"`);
44
+ expect(invalidDataContractError.getMessage()).to.equal(`Data contract decode error: "${error.message}"`);
37
45
  });
38
46
 
39
47
  it('should contain message for multiple errors', async () => {
@@ -41,6 +49,6 @@ describe('InvalidDataContractError', () => {
41
49
 
42
50
  const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
43
51
 
44
- expect(invalidDataContractError.message).to.equal(`Invalid Data Contract: "${error.message}" and 1 more`);
52
+ expect(invalidDataContractError.getMessage()).to.equal(`Data contract decode error: "${error.message}" and 1 more`);
45
53
  });
46
54
  });
@@ -1,3 +1,4 @@
1
+ const varint = require('varint');
1
2
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
2
3
  const stateTransitionTypes = require('@dashevo/dpp/lib/stateTransition/stateTransitionTypes');
3
4
 
@@ -64,11 +65,10 @@ describe('DataContractCreateTransition', () => {
64
65
 
65
66
  describe('#toBuffer', () => {
66
67
  it('should return serialized State Transition', () => {
67
- const protocolVersionUInt32 = Buffer.alloc(4);
68
- protocolVersionUInt32.writeUInt32LE(stateTransition.getProtocolVersion(), 0);
68
+ const protocolVersionBytes = Buffer.from(varint.encode(stateTransition.getProtocolVersion()));
69
69
 
70
70
  const result = stateTransition.toBuffer();
71
- expect(result.compare(protocolVersionUInt32, 0, 4, 0, 4)).equals(0);
71
+ expect(result.compare(protocolVersionBytes, 0, 1, 0, 1)).equals(0);
72
72
  });
73
73
  });
74
74
 
@@ -13,6 +13,8 @@ describe('validateDataContractCreateTransitionStateFactory', () => {
13
13
  let StateTransitionExecutionContext;
14
14
  let factory;
15
15
  let dataContractFetched;
16
+ let DataContractFactory;
17
+ let DataContractValidator;
16
18
 
17
19
  before(async () => {
18
20
  ({
@@ -20,6 +22,8 @@ describe('validateDataContractCreateTransitionStateFactory', () => {
20
22
  StateTransitionExecutionContext,
21
23
  validateDataContractCreateTransitionState,
22
24
  ValidationResult,
25
+ DataContractFactory,
26
+ DataContractValidator,
23
27
  } = await loadWasmDpp());
24
28
  });
25
29
 
@@ -46,25 +50,25 @@ describe('validateDataContractCreateTransitionStateFactory', () => {
46
50
  factory = (t) => validateDataContractCreateTransitionState(stateRepositoryLike, t);
47
51
  });
48
52
 
49
- // TODO wait for error types
50
- // it('should return invalid result if Data Contract is already exist', async () => {
51
- // stateRepositoryMock.fetchDataContract.resolves(dataContract);
53
+ it('should return invalid result if Data Contract is already exist', async () => {
54
+ // This time our state repository should return a data contract on fetch
55
+ const validator = new DataContractValidator();
56
+ const dataContractFactory = new DataContractFactory(1, validator);
57
+ const wasmDataContract = await dataContractFactory.createFromBuffer(dataContract.toBuffer());
52
58
 
53
- // const result = await validateDataContractCreateTransitionState(stateTransition);
54
-
55
- // expectValidationError(result, DataContractAlreadyPresentError);
56
-
57
- // const [error] = result.getErrors();
59
+ const stateRepositoryLikeWithContract = {
60
+ fetchDataContract: () => wasmDataContract,
61
+ };
58
62
 
59
- // expect(error.getCode()).to.equal(4000);
60
- // expect(Buffer.isBuffer(error.getDataContractId())).to.be.true();
61
- // expect(error.getDataContractId()).to.deep.equal(dataContract.getId().toBuffer());
63
+ const result = await validateDataContractCreateTransitionState(
64
+ stateRepositoryLikeWithContract,
65
+ stateTransition,
66
+ );
67
+ const [error] = result.getErrors();
62
68
 
63
- // expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
64
- // dataContract.getId(),
65
- // executionContext,
66
- // );
67
- // });
69
+ expect(error.getCode()).to.equal(4000);
70
+ expect(error.getDataContractId()).to.deep.equal(dataContract.getId().toBuffer());
71
+ });
68
72
 
69
73
  it('should return valid result', async () => {
70
74
  const result = await factory(stateTransition);
@@ -1,23 +1,25 @@
1
+ const varint = require('varint');
1
2
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
2
3
  const stateTransitionTypes = require('@dashevo/dpp/lib/stateTransition/stateTransitionTypes');
3
-
4
- const Identifier = require('@dashevo/dpp/lib/identifier/Identifier');
5
4
  const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion');
6
- const DataContractUpdateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition');
7
- const hash = require('@dashevo/dpp/lib/util/hash');
8
- const serializer = require('@dashevo/dpp/lib/util/serializer');
5
+ const JsDataContractUpdateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition');
6
+
7
+ const { default: loadWasmDpp } = require('../../../../../dist');
9
8
 
10
9
  describe('DataContractUpdateTransition', () => {
11
10
  let stateTransition;
12
11
  let dataContract;
13
- let hashMock;
14
- let encodeMock;
12
+ let DataContractUpdateTransition;
13
+ let Identifier;
15
14
 
16
- beforeEach(function beforeEach() {
17
- dataContract = getDataContractFixture();
15
+ before(async () => {
16
+ ({
17
+ DataContractUpdateTransition, Identifier,
18
+ } = await loadWasmDpp());
19
+ });
18
20
 
19
- encodeMock = this.sinonSandbox.stub(serializer, 'encode');
20
- hashMock = this.sinonSandbox.stub(hash, 'hash');
21
+ beforeEach(() => {
22
+ dataContract = getDataContractFixture();
21
23
 
22
24
  stateTransition = new DataContractUpdateTransition({
23
25
  protocolVersion: protocolVersion.latestVersion,
@@ -25,11 +27,6 @@ describe('DataContractUpdateTransition', () => {
25
27
  });
26
28
  });
27
29
 
28
- afterEach(() => {
29
- encodeMock.restore();
30
- hashMock.restore();
31
- });
32
-
33
30
  describe('#getProtocolVersion', () => {
34
31
  it('should return the current protocol version', () => {
35
32
  const result = stateTransition.getProtocolVersion();
@@ -56,73 +53,40 @@ describe('DataContractUpdateTransition', () => {
56
53
 
57
54
  describe('#toJSON', () => {
58
55
  it('should return State Transition as plain JS object', () => {
59
- expect(stateTransition.toJSON()).to.deep.equal({
56
+ expect(stateTransition.toJSON(true)).to.deep.equal({
60
57
  protocolVersion: protocolVersion.latestVersion,
61
58
  type: stateTransitionTypes.DATA_CONTRACT_UPDATE,
62
59
  dataContract: dataContract.toJSON(),
63
- signaturePublicKeyId: undefined,
64
- signature: undefined,
65
60
  });
66
61
  });
67
62
  });
68
63
 
69
64
  describe('#toBuffer', () => {
70
- it('should return serialized State Transition', () => {
71
- const serializedStateTransition = Buffer.from('123');
72
-
73
- encodeMock.returns(serializedStateTransition);
74
-
75
- const protocolVersionUInt32 = Buffer.alloc(4);
76
- protocolVersionUInt32.writeUInt32LE(stateTransition.protocolVersion, 0);
65
+ it('should return serialized State Transition that starts with protocol version', () => {
66
+ const protocolVersionBytes = Buffer.from(varint.encode(stateTransition.getProtocolVersion()));
77
67
 
78
68
  const result = stateTransition.toBuffer();
79
-
80
- expect(result).to.deep.equal(
81
- Buffer.concat([protocolVersionUInt32, serializedStateTransition]),
82
- );
83
-
84
- const dataToEncode = stateTransition.toObject();
85
- delete dataToEncode.protocolVersion;
86
-
87
- expect(encodeMock.getCall(0).args).to.have.deep.members([
88
- dataToEncode,
89
- ]);
69
+ expect(result.compare(protocolVersionBytes, 0, 1, 0, 1)).equals(0);
90
70
  });
91
71
  });
92
72
 
93
- describe('#hash', () => {
73
+ describe.skip('#hash', () => {
94
74
  it('should return State Transition hash as hex', () => {
95
- const serializedDocument = Buffer.from('123');
96
- const hashedDocument = '456';
97
-
98
- encodeMock.returns(serializedDocument);
99
- hashMock.returns(hashedDocument);
75
+ const jsStateTransition = new JsDataContractUpdateTransition(stateTransition.toJSON());
100
76
 
101
77
  const result = stateTransition.hash();
78
+ const resultJs = jsStateTransition.hash();
102
79
 
103
- expect(result).to.equal(hashedDocument);
104
-
105
- const dataToEncode = stateTransition.toObject();
106
- delete dataToEncode.protocolVersion;
107
-
108
- expect(encodeMock.getCall(0).args).to.have.deep.members([
109
- dataToEncode,
110
- ]);
111
-
112
- const protocolVersionUInt32 = Buffer.alloc(4);
113
- protocolVersionUInt32.writeUInt32LE(stateTransition.protocolVersion, 0);
114
-
115
- expect(hashMock).to.have.been.calledOnceWith(
116
- Buffer.concat([protocolVersionUInt32, serializedDocument]),
117
- );
80
+ expect(result).to.equal(resultJs);
118
81
  });
119
82
  });
120
83
 
121
84
  describe('#getOwnerId', () => {
122
85
  it('should return owner id', async () => {
123
86
  const result = stateTransition.getOwnerId();
87
+ const reference = stateTransition.getDataContract().getOwnerId();
124
88
 
125
- expect(result).to.equal(stateTransition.getDataContract().getOwnerId());
89
+ expect(result.toBuffer()).to.deep.equal(reference.toBuffer());
126
90
  });
127
91
  });
128
92
 
@@ -134,7 +98,7 @@ describe('DataContractUpdateTransition', () => {
134
98
  const contractId = result[0];
135
99
 
136
100
  expect(contractId).to.be.an.instanceOf(Identifier);
137
- expect(contractId).to.be.deep.equal(dataContract.getId());
101
+ expect(contractId.toBuffer()).to.be.deep.equal(dataContract.getId().toBuffer());
138
102
  });
139
103
  });
140
104
 
@@ -1,47 +1,51 @@
1
- const DataContractUpdateTransition = require(
2
- '@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition',
3
- );
4
-
5
1
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
2
+ const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion');
6
3
 
7
- const applyDataContractUpdateTransitionFactory = require(
8
- '@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory',
9
- );
10
-
11
- const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
12
- const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
4
+ const { default: loadWasmDpp } = require('../../../../../dist');
13
5
 
14
6
  describe('applyDataContractUpdateTransitionFactory', () => {
15
7
  let stateTransition;
16
8
  let dataContract;
17
- let stateRepositoryMock;
18
- let applyDataContractUpdateTransition;
19
9
  let executionContext;
10
+ let dataContractStored;
11
+ let factory;
12
+ let DataContractUpdateTransition;
13
+ let ApplyDataContractUpdateTransition;
14
+ let StateTransitionExecutionContext;
15
+
16
+ before(async () => {
17
+ ({
18
+ DataContractUpdateTransition,
19
+ ApplyDataContractUpdateTransition,
20
+ StateTransitionExecutionContext,
21
+ } = await loadWasmDpp());
22
+ });
20
23
 
21
- beforeEach(function beforeEach() {
24
+ beforeEach(() => {
22
25
  dataContract = getDataContractFixture();
23
26
 
24
27
  stateTransition = new DataContractUpdateTransition({
25
28
  dataContract: dataContract.toObject(),
29
+ protocolVersion: protocolVersion.latestVersion,
26
30
  });
27
31
 
28
32
  executionContext = new StateTransitionExecutionContext();
29
33
 
30
34
  stateTransition.setExecutionContext(executionContext);
31
35
 
32
- stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
36
+ const stateRepositoryLike = {
37
+ storeDataContract: () => {
38
+ dataContractStored = true;
39
+ },
40
+ };
33
41
 
34
- applyDataContractUpdateTransition = applyDataContractUpdateTransitionFactory(
35
- stateRepositoryMock,
36
- );
42
+ factory = new ApplyDataContractUpdateTransition(stateRepositoryLike);
43
+
44
+ dataContractStored = false;
37
45
  });
38
46
 
39
47
  it('should store a data contract from state transition in the repository', async () => {
40
- await applyDataContractUpdateTransition(stateTransition);
41
-
42
- expect(stateRepositoryMock.updateDataContract).to.have.been.calledOnceWithExactly(
43
- stateTransition.getDataContract(),
44
- executionContext,
45
- );
48
+ await factory.applyDataContractUpdateTransition(stateTransition);
49
+ expect(dataContractStored).to.be.true();
46
50
  });
47
51
  });
@@ -1,13 +1,23 @@
1
- const validateIndicesAreBackwardCompatible = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible');
2
- const DataContractHaveNewIndexWithOldPropertiesError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractInvalidIndexDefinitionUpdateError');
3
- const DataContractHaveNewUniqueIndexError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractHaveNewUniqueIndexError');
4
- const DataContractIndicesChangedError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractUniqueIndicesChangedError');
5
1
  const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
6
- const DataContractInvalidIndexDefinitionUpdateError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractInvalidIndexDefinitionUpdateError');
2
+
3
+ const { default: loadWasmDpp } = require('../../../../../../../dist');
7
4
 
8
5
  describe('validateIndicesAreBackwardCompatible', () => {
9
6
  let oldDocumentsSchema;
10
7
  let newDocumentsSchema;
8
+ let validateIndicesAreBackwardCompatible;
9
+ let DataContractUniqueIndicesChangedError;
10
+ let DataContractInvalidIndexDefinitionUpdateError;
11
+ let DataContractHaveNewUniqueIndexError;
12
+
13
+ before(async () => {
14
+ ({
15
+ validateIndicesAreBackwardCompatible,
16
+ DataContractUniqueIndicesChangedError,
17
+ DataContractInvalidIndexDefinitionUpdateError,
18
+ DataContractHaveNewUniqueIndexError,
19
+ } = await loadWasmDpp());
20
+ });
11
21
 
12
22
  beforeEach(() => {
13
23
  const oldDataContract = getDataContractFixture();
@@ -37,20 +47,19 @@ describe('validateIndicesAreBackwardCompatible', () => {
37
47
  });
38
48
 
39
49
  it('should return invalid result if some of unique indices have changed', async () => {
40
- newDocumentsSchema.indexedDocument.indices[0].properties[0].lastName = 'asc';
41
-
50
+ newDocumentsSchema.indexedDocument.indices[0].properties[1].firstName = 'desc';
42
51
  const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
43
52
 
44
53
  expect(result.isValid()).to.be.false();
45
54
 
46
55
  const error = result.getErrors()[0];
47
56
 
48
- expect(error).to.be.an.instanceOf(DataContractIndicesChangedError);
57
+ expect(error).to.be.an.instanceOf(DataContractUniqueIndicesChangedError);
49
58
  expect(error.getIndexName()).to.equal(newDocumentsSchema.indexedDocument.indices[0].name);
50
59
  });
51
60
 
52
61
  it('should return invalid result if non-unique index update failed due to changed old properties', async () => {
53
- newDocumentsSchema.indexedDocument.indices[2].properties[0].$id = 'asc';
62
+ newDocumentsSchema.indexedDocument.indices[2].properties[0].lastName = 'desc';
54
63
 
55
64
  const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
56
65
 
@@ -63,7 +72,14 @@ describe('validateIndicesAreBackwardCompatible', () => {
63
72
  });
64
73
 
65
74
  it('should return invalid result if non-unique index update failed due old properties used', async () => {
66
- newDocumentsSchema.indexedDocument.indices[2].properties.push({ firstName: 'asc' });
75
+ newDocumentsSchema.indexedDocument.indices.push({
76
+ name: 'oldFieldIndex',
77
+ properties: [
78
+ {
79
+ otherProperty: 'asc',
80
+ },
81
+ ],
82
+ });
67
83
 
68
84
  const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
69
85
 
@@ -72,7 +88,7 @@ describe('validateIndicesAreBackwardCompatible', () => {
72
88
  const error = result.getErrors()[0];
73
89
 
74
90
  expect(error).to.be.an.instanceOf(DataContractInvalidIndexDefinitionUpdateError);
75
- expect(error.getIndexName()).to.equal(newDocumentsSchema.indexedDocument.indices[2].name);
91
+ expect(error.getIndexName()).to.equal('oldFieldIndex');
76
92
  });
77
93
 
78
94
  it('should return invalid result if one of new indices contains old properties in the wrong order', async () => {
@@ -90,7 +106,8 @@ describe('validateIndicesAreBackwardCompatible', () => {
90
106
 
91
107
  const error = result.getErrors()[0];
92
108
 
93
- expect(error).to.be.an.instanceOf(DataContractHaveNewIndexWithOldPropertiesError);
109
+ // TODO
110
+ // expect(error).to.be.an.instanceOf(DataContractHaveNewIndexWithOldPropertiesError);
94
111
  expect(error.getIndexName()).to.equal('index_other');
95
112
  });
96
113