@dashevo/wasm-dpp 0.23.0-dev.10

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 (110) hide show
  1. package/.babelrc +5 -0
  2. package/.editorconfig +13 -0
  3. package/.eslintignore +1 -0
  4. package/.eslintrc +15 -0
  5. package/.mocharc.yml +4 -0
  6. package/CHANGELOG.md +397 -0
  7. package/LICENSE +20 -0
  8. package/README.md +37 -0
  9. package/karma.conf.js +53 -0
  10. package/package.json +107 -0
  11. package/test/.eslintrc +12 -0
  12. package/test/integration/DashPlatformProtocol.spec.js +53 -0
  13. package/test/integration/ajv/keywords/byteArray/addByteArrayKeyword.spec.js +148 -0
  14. package/test/integration/dataContract/DataContractFacade.spec.js +84 -0
  15. package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +357 -0
  16. package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +444 -0
  17. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +2191 -0
  18. package/test/integration/document/Document.spec.js +90 -0
  19. package/test/integration/document/DocumentFacade.spec.js +155 -0
  20. package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +83 -0
  21. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +1146 -0
  22. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +294 -0
  23. package/test/integration/document/validation/validateDocumentFactory.spec.js +447 -0
  24. package/test/integration/error/consensus/createConsensusError.spec.js +21 -0
  25. package/test/integration/identity/IdentityFacade.spec.js +187 -0
  26. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +422 -0
  27. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +361 -0
  28. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +595 -0
  29. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +299 -0
  30. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +66 -0
  31. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +415 -0
  32. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +134 -0
  33. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +401 -0
  34. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +205 -0
  35. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +127 -0
  36. package/test/integration/identity/validation/validateIdentityFactory.spec.js +370 -0
  37. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +497 -0
  38. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +507 -0
  39. package/test/integration/stateTransition/StateTransitionFacade.spec.js +418 -0
  40. package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +35 -0
  41. package/test/integration/util/generateEntropy.spec.js +17 -0
  42. package/test/integration/util/serializer.spec.js +24 -0
  43. package/test/unit/DashPlatformProtocol.spec.js +79 -0
  44. package/test/unit/Identifier.spec.js +123 -0
  45. package/test/unit/Metadata.spec.js +37 -0
  46. package/test/unit/dataContract/DataContract.spec.js +407 -0
  47. package/test/unit/dataContract/DataContractFactory.spec.js +178 -0
  48. package/test/unit/dataContract/createDataContract.spec.js +57 -0
  49. package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +46 -0
  50. package/test/unit/dataContract/generateDataContractId.spec.js +19 -0
  51. package/test/unit/dataContract/getBinaryPropertiesFromSchema.spec.js +103 -0
  52. package/test/unit/dataContract/getPropertyDefinitionByPath.spec.js +84 -0
  53. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +160 -0
  54. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +48 -0
  55. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +85 -0
  56. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +158 -0
  57. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +47 -0
  58. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +121 -0
  59. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +111 -0
  60. package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +93 -0
  61. package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +64 -0
  62. package/test/unit/dataTrigger/DataTrigger.spec.js +132 -0
  63. package/test/unit/dataTrigger/DataTriggerExecutionContext.spec.js +29 -0
  64. package/test/unit/dataTrigger/dashpayDataTriggers/createContactRequestDataTrigger.spec.js +109 -0
  65. package/test/unit/dataTrigger/dpnsTriggers/createDomainDataTrigger.spec.js +382 -0
  66. package/test/unit/dataTrigger/featureFlagDataTriggers/createFeatureFlagDataTrigger.spec.js +101 -0
  67. package/test/unit/dataTrigger/getDataTriggersFactory.spec.js +113 -0
  68. package/test/unit/dataTrigger/rejectDataTrigger.spec.js +51 -0
  69. package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +200 -0
  70. package/test/unit/decodeProtocolEntityFactory.spec.js +75 -0
  71. package/test/unit/document/Document.spec.js +444 -0
  72. package/test/unit/document/DocumentFactory.spec.js +376 -0
  73. package/test/unit/document/errors/InvalidDocumentError.spec.js +46 -0
  74. package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +66 -0
  75. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +168 -0
  76. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +171 -0
  77. package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +25 -0
  78. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +31 -0
  79. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +122 -0
  80. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +75 -0
  81. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +128 -0
  82. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +811 -0
  83. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +279 -0
  84. package/test/unit/errors/consensus/codes.spec.js +102 -0
  85. package/test/unit/identity/Identity.spec.js +243 -0
  86. package/test/unit/identity/IdentityFactory.spec.js +274 -0
  87. package/test/unit/identity/IdentityPublicKey.spec.js +273 -0
  88. package/test/unit/identity/creditsConverter.spec.js +34 -0
  89. package/test/unit/identity/errors/InvalidIdentityError.spec.js +46 -0
  90. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +184 -0
  91. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +90 -0
  92. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +71 -0
  93. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +137 -0
  94. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +108 -0
  95. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +22 -0
  96. package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +219 -0
  97. package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +149 -0
  98. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +21 -0
  99. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +36 -0
  100. package/test/unit/identity/validation/validateRequiredPurposeAndSecurityLevelFactory.spec.js +47 -0
  101. package/test/unit/stateTransition/StateTransitionFactory.spec.js +160 -0
  102. package/test/unit/stateTransition/createStateTransitionFactory.spec.js +72 -0
  103. package/test/unit/stateTransition/errors/InvalidStateTransitionError.spec.js +51 -0
  104. package/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js +138 -0
  105. package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +372 -0
  106. package/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js +339 -0
  107. package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +86 -0
  108. package/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js +89 -0
  109. package/test/unit/version/validateProtocolVersionFactory.spec.js +80 -0
  110. package/webpack.config.js +49 -0
@@ -0,0 +1,447 @@
1
+ const { getRE2Class } = require('@dashevo/wasm-re2');
2
+
3
+ const createAjv = require('../../../../lib/ajv/createAjv');
4
+
5
+ const JsonSchemaValidator = require('../../../../lib/validation/JsonSchemaValidator');
6
+ const ValidationResult = require('../../../../lib/validation/ValidationResult');
7
+
8
+ const DataContract = require('../../../../lib/dataContract/DataContract');
9
+
10
+ const validateDocumentFactory = require('../../../../lib/document/validation/validateDocumentFactory');
11
+ const enrichDataContractWithBaseSchema = require('../../../../lib/dataContract/enrichDataContractWithBaseSchema');
12
+
13
+ const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture');
14
+ const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture');
15
+
16
+ const MissingDocumentTypeError = require('../../../../lib/errors/consensus/basic/document/MissingDocumentTypeError');
17
+ const InvalidDocumentTypeError = require('../../../../lib/errors/consensus/basic/document/InvalidDocumentTypeError');
18
+
19
+ const {
20
+ expectValidationError,
21
+ expectJsonSchemaError,
22
+ } = require('../../../../lib/test/expect/expectError');
23
+ const SomeConsensusError = require('../../../../lib/test/mocks/SomeConsensusError');
24
+
25
+ describe('validateDocumentFactory', () => {
26
+ let dataContract;
27
+ let rawDocuments;
28
+ let rawDocument;
29
+ let documents;
30
+ let validateDocument;
31
+ let validator;
32
+ let validateProtocolVersionMock;
33
+
34
+ beforeEach(async function beforeEach() {
35
+ const RE2 = await getRE2Class();
36
+ const ajv = createAjv(RE2);
37
+
38
+ validator = new JsonSchemaValidator(ajv);
39
+
40
+ this.sinonSandbox.spy(validator, 'validate');
41
+
42
+ dataContract = getDataContractFixture();
43
+
44
+ validateProtocolVersionMock = this.sinonSandbox.stub().returns(new ValidationResult());
45
+
46
+ validateDocument = validateDocumentFactory(
47
+ validator,
48
+ enrichDataContractWithBaseSchema,
49
+ validateProtocolVersionMock,
50
+ );
51
+
52
+ documents = getDocumentsFixture(dataContract);
53
+ rawDocuments = documents.map((o) => o.toObject());
54
+ [rawDocument] = rawDocuments;
55
+ });
56
+
57
+ describe('Base schema', () => {
58
+ describe('$protocolVersion', () => {
59
+ it('should be present', () => {
60
+ delete rawDocument.$protocolVersion;
61
+
62
+ const result = validateDocument(rawDocument, dataContract);
63
+
64
+ expectJsonSchemaError(result);
65
+
66
+ const [error] = result.getErrors();
67
+
68
+ expect(error.getInstancePath()).to.equal('');
69
+ expect(error.getKeyword()).to.equal('required');
70
+ expect(error.getParams().missingProperty).to.equal('$protocolVersion');
71
+ });
72
+
73
+ it('should be an integer', () => {
74
+ rawDocument.$protocolVersion = '1';
75
+
76
+ const result = validateDocument(rawDocument, dataContract);
77
+
78
+ expectJsonSchemaError(result);
79
+
80
+ const [error] = result.getErrors();
81
+
82
+ expect(error.getInstancePath()).to.equal('/$protocolVersion');
83
+ expect(error.getKeyword()).to.equal('type');
84
+ });
85
+
86
+ it('should be valid', async () => {
87
+ rawDocument.$protocolVersion = -1;
88
+
89
+ const protocolVersionError = new SomeConsensusError('test');
90
+ const protocolVersionResult = new ValidationResult([
91
+ protocolVersionError,
92
+ ]);
93
+
94
+ validateProtocolVersionMock.returns(protocolVersionResult);
95
+
96
+ const result = await validateDocument(rawDocument, dataContract);
97
+
98
+ expectValidationError(result, SomeConsensusError);
99
+
100
+ const [error] = result.getErrors();
101
+
102
+ expect(error).to.equal(protocolVersionError);
103
+
104
+ expect(validateProtocolVersionMock).to.be.calledOnceWith(
105
+ rawDocument.$protocolVersion,
106
+ );
107
+ });
108
+ });
109
+
110
+ describe('$id', () => {
111
+ it('should be present', () => {
112
+ delete rawDocument.$id;
113
+
114
+ const result = validateDocument(rawDocument, dataContract);
115
+
116
+ expectJsonSchemaError(result);
117
+
118
+ const [error] = result.getErrors();
119
+
120
+ expect(error.getInstancePath()).to.equal('');
121
+ expect(error.getKeyword()).to.equal('required');
122
+ expect(error.getParams().missingProperty).to.equal('$id');
123
+ });
124
+
125
+ it('should be a byte array', () => {
126
+ rawDocument.$id = new Array(32).fill('string');
127
+
128
+ const result = validateDocument(rawDocument, dataContract);
129
+
130
+ expectJsonSchemaError(result, 2);
131
+
132
+ const [error, byteArrayError] = result.getErrors();
133
+
134
+ expect(error.getInstancePath()).to.equal('/$id/0');
135
+ expect(error.getKeyword()).to.equal('type');
136
+
137
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
138
+ });
139
+
140
+ it('should be no less than 32 bytes', () => {
141
+ rawDocument.$id = Buffer.alloc(31);
142
+
143
+ const result = validateDocument(rawDocument, dataContract);
144
+
145
+ expectJsonSchemaError(result);
146
+
147
+ const [error] = result.getErrors();
148
+
149
+ expect(error.getInstancePath()).to.equal('/$id');
150
+ expect(error.getKeyword()).to.equal('minItems');
151
+ });
152
+
153
+ it('should be no longer than 32 bytes', () => {
154
+ rawDocument.$id = Buffer.alloc(33);
155
+
156
+ const result = validateDocument(rawDocument, dataContract);
157
+
158
+ expectJsonSchemaError(result);
159
+
160
+ const [error] = result.getErrors();
161
+
162
+ expect(error.getInstancePath()).to.equal('/$id');
163
+ expect(error.getKeyword()).to.equal('maxItems');
164
+ });
165
+ });
166
+
167
+ describe('$type', () => {
168
+ let DataContractMock;
169
+
170
+ afterEach(() => {
171
+ if (DataContractMock) {
172
+ DataContractMock.restore();
173
+ }
174
+ });
175
+
176
+ it('should be present', () => {
177
+ delete rawDocument.$type;
178
+
179
+ const result = validateDocument(rawDocument, dataContract);
180
+
181
+ expectValidationError(
182
+ result,
183
+ MissingDocumentTypeError,
184
+ );
185
+
186
+ const [error] = result.getErrors();
187
+
188
+ expect(error.getCode()).to.equal(1028);
189
+ });
190
+
191
+ it('should be defined in Data Contract', () => {
192
+ rawDocument.$type = 'undefinedDocument';
193
+
194
+ const result = validateDocument(rawDocument, dataContract);
195
+
196
+ expectValidationError(
197
+ result,
198
+ InvalidDocumentTypeError,
199
+ );
200
+
201
+ const [error] = result.getErrors();
202
+
203
+ expect(error.getCode()).to.equal(1024);
204
+ expect(error.getType()).to.equal('undefinedDocument');
205
+ });
206
+
207
+ it('should throw an error if getDocumentSchemaRef throws error', function it() {
208
+ const someError = new Error();
209
+
210
+ DataContractMock = this.sinonSandbox.stub(DataContract.prototype, 'getDocumentSchemaRef').throws(someError);
211
+
212
+ let error;
213
+ try {
214
+ validateDocument(rawDocument, dataContract);
215
+ } catch (e) {
216
+ error = e;
217
+ }
218
+
219
+ expect(error).to.equal(someError);
220
+
221
+ expect(dataContract.getDocumentSchemaRef).to.have.been.calledOnce();
222
+ });
223
+ });
224
+
225
+ describe('$revision', () => {
226
+ it('should be present', () => {
227
+ delete rawDocument.$revision;
228
+
229
+ const result = validateDocument(rawDocument, dataContract);
230
+
231
+ expectJsonSchemaError(result);
232
+
233
+ const [error] = result.getErrors();
234
+
235
+ expect(error.getInstancePath()).to.equal('');
236
+ expect(error.getKeyword()).to.equal('required');
237
+ expect(error.getParams().missingProperty).to.equal('$revision');
238
+ });
239
+
240
+ it('should be a number', () => {
241
+ rawDocument.$revision = 'string';
242
+
243
+ const result = validateDocument(rawDocument, dataContract);
244
+
245
+ expectJsonSchemaError(result);
246
+
247
+ const [error] = result.getErrors();
248
+
249
+ expect(error.getInstancePath()).to.equal('/$revision');
250
+ expect(error.getKeyword()).to.equal('type');
251
+ });
252
+
253
+ it('should be an integer', () => {
254
+ rawDocument.$revision = 1.1;
255
+
256
+ const result = validateDocument(rawDocument, dataContract);
257
+
258
+ expectJsonSchemaError(result);
259
+
260
+ const [error] = result.getErrors();
261
+
262
+ expect(error.getInstancePath()).to.equal('/$revision');
263
+ expect(error.getKeyword()).to.equal('type');
264
+ });
265
+
266
+ it('should be greater or equal to one', () => {
267
+ rawDocument.$revision = -1;
268
+
269
+ const result = validateDocument(rawDocument, dataContract);
270
+
271
+ expectJsonSchemaError(result);
272
+
273
+ const [error] = result.getErrors();
274
+
275
+ expect(error.getInstancePath()).to.equal('/$revision');
276
+ expect(error.getKeyword()).to.equal('minimum');
277
+ });
278
+ });
279
+
280
+ describe('$dataContractId', () => {
281
+ it('should be present', () => {
282
+ delete rawDocument.$dataContractId;
283
+
284
+ const result = validateDocument(rawDocument, dataContract);
285
+
286
+ expectJsonSchemaError(result);
287
+
288
+ const [error] = result.getErrors();
289
+
290
+ expect(error.getInstancePath()).to.equal('');
291
+ expect(error.getKeyword()).to.equal('required');
292
+ expect(error.getParams().missingProperty).to.equal('$dataContractId');
293
+ });
294
+
295
+ it('should be a byte array', () => {
296
+ rawDocument.$dataContractId = new Array(32).fill('string');
297
+
298
+ const result = validateDocument(rawDocument, dataContract);
299
+
300
+ expectJsonSchemaError(result, 2);
301
+
302
+ const [error, byteArrayError] = result.getErrors();
303
+
304
+ expect(error.getInstancePath()).to.equal('/$dataContractId/0');
305
+ expect(error.getKeyword()).to.equal('type');
306
+
307
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
308
+ });
309
+
310
+ it('should be no less than 32 bytes', () => {
311
+ rawDocument.$dataContractId = Buffer.alloc(31);
312
+
313
+ const result = validateDocument(rawDocument, dataContract);
314
+
315
+ expectJsonSchemaError(result);
316
+
317
+ const [error] = result.getErrors();
318
+
319
+ expect(error.getInstancePath()).to.equal('/$dataContractId');
320
+ expect(error.getKeyword()).to.equal('minItems');
321
+ });
322
+
323
+ it('should be no longer than 32 bytes', () => {
324
+ rawDocument.$dataContractId = Buffer.alloc(33);
325
+
326
+ const result = validateDocument(rawDocument, dataContract);
327
+
328
+ expectJsonSchemaError(result);
329
+
330
+ const [error] = result.getErrors();
331
+
332
+ expect(error.getInstancePath()).to.equal('/$dataContractId');
333
+ expect(error.getKeyword()).to.equal('maxItems');
334
+ });
335
+ });
336
+
337
+ describe('$ownerId', () => {
338
+ it('should be present', () => {
339
+ delete rawDocument.$ownerId;
340
+
341
+ const result = validateDocument(rawDocument, dataContract);
342
+
343
+ expectJsonSchemaError(result);
344
+
345
+ const [error] = result.getErrors();
346
+
347
+ expect(error.getInstancePath()).to.equal('');
348
+ expect(error.getKeyword()).to.equal('required');
349
+ expect(error.getParams().missingProperty).to.equal('$ownerId');
350
+ });
351
+
352
+ it('should be a byte array', () => {
353
+ rawDocument.$ownerId = new Array(32).fill('string');
354
+
355
+ const result = validateDocument(rawDocument, dataContract);
356
+
357
+ expectJsonSchemaError(result, 2);
358
+
359
+ const [error, byteArrayError] = result.getErrors();
360
+
361
+ expect(error.instancePath).to.equal('/$ownerId/0');
362
+ expect(error.getKeyword()).to.equal('type');
363
+
364
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
365
+ });
366
+
367
+ it('should be no less than 32 bytes', () => {
368
+ rawDocument.$ownerId = Buffer.alloc(31);
369
+
370
+ const result = validateDocument(rawDocument, dataContract);
371
+
372
+ expectJsonSchemaError(result);
373
+
374
+ const [error] = result.getErrors();
375
+
376
+ expect(error.instancePath).to.equal('/$ownerId');
377
+ expect(error.getKeyword()).to.equal('minItems');
378
+ });
379
+
380
+ it('should be no longer than 32 bytes', () => {
381
+ rawDocument.$ownerId = Buffer.alloc(33);
382
+
383
+ const result = validateDocument(rawDocument, dataContract);
384
+
385
+ expectJsonSchemaError(result);
386
+
387
+ const [error] = result.getErrors();
388
+
389
+ expect(error.instancePath).to.equal('/$ownerId');
390
+ expect(error.getKeyword()).to.equal('maxItems');
391
+ });
392
+ });
393
+ });
394
+
395
+ describe('Data Contract schema', () => {
396
+ it('should return an error if the first document is not valid against Data Contract', () => {
397
+ rawDocument.name = 1;
398
+
399
+ const result = validateDocument(rawDocument, dataContract);
400
+
401
+ expectJsonSchemaError(result);
402
+
403
+ const [error] = result.getErrors();
404
+
405
+ expect(error.instancePath).to.equal('/name');
406
+ expect(error.getKeyword()).to.equal('type');
407
+ });
408
+
409
+ it('should return an error if the second document is not valid against Data Contract', () => {
410
+ // eslint-disable-next-line prefer-destructuring
411
+ rawDocument = rawDocuments[1];
412
+ rawDocument.undefined = 1;
413
+
414
+ const result = validateDocument(rawDocument, dataContract);
415
+
416
+ expectJsonSchemaError(result);
417
+
418
+ const [error] = result.getErrors();
419
+
420
+ expect(error.instancePath).to.equal('');
421
+ expect(error.getKeyword()).to.equal('additionalProperties');
422
+ });
423
+ });
424
+
425
+ it('return invalid result if a byte array exceeds `maxItems`', () => {
426
+ // eslint-disable-next-line prefer-destructuring
427
+ rawDocument = getDocumentsFixture(dataContract)[8].toObject();
428
+
429
+ rawDocument.byteArrayField = Buffer.alloc(32);
430
+
431
+ const result = validateDocument(rawDocument, dataContract);
432
+
433
+ expectJsonSchemaError(result);
434
+
435
+ const [error] = result.getErrors();
436
+
437
+ expect(error.instancePath).to.equal('/byteArrayField');
438
+ expect(error.getKeyword()).to.equal('maxItems');
439
+ });
440
+
441
+ it('should return valid result is a document is valid', () => {
442
+ const result = validateDocument(rawDocument, dataContract);
443
+
444
+ expect(result).to.be.an.instanceOf(ValidationResult);
445
+ expect(result.isValid()).to.be.true();
446
+ });
447
+ });
@@ -0,0 +1,21 @@
1
+ const InvalidDataContractIdError = require('../../../../lib/errors/consensus/basic/dataContract/InvalidDataContractIdError');
2
+ const generateRandomIdentifier = require('../../../../lib/test/utils/generateRandomIdentifier');
3
+ const createConsensusError = require('../../../../lib/errors/consensus/createConsensusError');
4
+
5
+ describe('createConsensusError', () => {
6
+ it('should create an error instance from code and arguments', () => {
7
+ const expectedId = generateRandomIdentifier();
8
+ const invalidId = Buffer.alloc(16).fill(1);
9
+
10
+ const error = new InvalidDataContractIdError(expectedId.toBuffer(), invalidId);
11
+
12
+ const restoredError = createConsensusError(error.getCode(), error.getConstructorArguments());
13
+
14
+ // Stack will be always different so we need to skip it for comparison
15
+ expect(restoredError.message).to.equal(error.message);
16
+ expect(restoredError.getExpectedId()).to.deep.equal(error.getExpectedId());
17
+ expect(restoredError.getInvalidId()).to.deep.equal(error.getInvalidId());
18
+ expect(restoredError.getConstructorArguments()).to.deep.equal(error.getConstructorArguments());
19
+ expect(restoredError.getCode()).to.deep.equal(error.getCode());
20
+ });
21
+ });
@@ -0,0 +1,187 @@
1
+ const { PublicKey } = require('@dashevo/dashcore-lib');
2
+ const DashPlatformProtocol = require('../../../lib/DashPlatformProtocol');
3
+
4
+ const Identity = require('../../../lib/identity/Identity');
5
+ const IdentityCreateTransition = require('../../../lib/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition');
6
+ const IdentityTopUpTransition = require('../../../lib/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition');
7
+
8
+ const ValidationResult = require('../../../lib/validation/ValidationResult');
9
+
10
+ const getIdentityFixture = require('../../../lib/test/fixtures/getIdentityFixture');
11
+
12
+ const createStateRepositoryMock = require('../../../lib/test/mocks/createStateRepositoryMock');
13
+ const InstantAssetLockProof = require('../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof');
14
+ const getInstantAssetLockProofFixture = require('../../../lib/test/fixtures/getInstantAssetLockProofFixture');
15
+ const getChainAssetLockProofFixture = require('../../../lib/test/fixtures/getChainAssetLockProofFixture');
16
+ const ChainAssetLockProof = require('../../../lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof');
17
+ const IdentityUpdateTransition = require('../../../lib/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition');
18
+ const IdentityPublicKey = require('../../../lib/identity/IdentityPublicKey');
19
+
20
+ describe('IdentityFacade', () => {
21
+ let dpp;
22
+ let identity;
23
+ let stateRepositoryMock;
24
+ let instantAssetLockProof;
25
+ let chainAssetLockProof;
26
+
27
+ beforeEach(async function beforeEach() {
28
+ const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000';
29
+
30
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
31
+ stateRepositoryMock.fetchTransaction.resolves(rawTransaction);
32
+
33
+ dpp = new DashPlatformProtocol({
34
+ stateRepository: stateRepositoryMock,
35
+ });
36
+ await dpp.initialize();
37
+
38
+ chainAssetLockProof = getChainAssetLockProofFixture();
39
+ instantAssetLockProof = getInstantAssetLockProofFixture();
40
+ identity = getIdentityFixture();
41
+ identity.id = instantAssetLockProof.createIdentifier();
42
+ identity.setAssetLockProof(instantAssetLockProof);
43
+ identity.setBalance(0);
44
+ });
45
+
46
+ describe('#create', () => {
47
+ it('should create Identity', () => {
48
+ const publicKeys = identity.getPublicKeys()
49
+ .map((identityPublicKey) => ({
50
+ ...identityPublicKey.toObject(),
51
+ key: new PublicKey(identityPublicKey.getData()),
52
+ }));
53
+
54
+ const result = dpp.identity.create(
55
+ instantAssetLockProof,
56
+ publicKeys,
57
+ );
58
+
59
+ expect(result).to.be.an.instanceOf(Identity);
60
+ expect(result.toObject()).to.deep.equal(identity.toObject());
61
+ });
62
+ });
63
+
64
+ describe('#createFromObject', () => {
65
+ it('should create Identity from plain object', () => {
66
+ const result = dpp.identity.createFromObject(identity.toObject());
67
+
68
+ expect(result).to.be.an.instanceOf(Identity);
69
+
70
+ expect(result.toObject()).to.deep.equal(identity.toObject());
71
+ });
72
+ });
73
+
74
+ describe('#createFromBuffer', () => {
75
+ it('should create Identity from string', () => {
76
+ const result = dpp.identity.createFromBuffer(identity.toBuffer());
77
+
78
+ expect(result).to.be.an.instanceOf(Identity);
79
+
80
+ expect(result.toObject()).to.deep.equal(identity.toObject());
81
+ });
82
+ });
83
+
84
+ describe('#validate', () => {
85
+ it('should validate Identity', async () => {
86
+ const result = await dpp.identity.validate(identity);
87
+
88
+ expect(result).to.be.an.instanceOf(ValidationResult);
89
+ expect(result.isValid()).to.be.true();
90
+ });
91
+ });
92
+
93
+ describe('#createInstantAssetLockProof', () => {
94
+ it('should create instant asset lock proof', () => {
95
+ const instantLock = instantAssetLockProof.getInstantLock();
96
+ const assetLockTransaction = instantAssetLockProof.getTransaction();
97
+ const outputIndex = instantAssetLockProof.getOutputIndex();
98
+
99
+ const result = dpp.identity.createInstantAssetLockProof(
100
+ instantLock,
101
+ assetLockTransaction,
102
+ outputIndex,
103
+ );
104
+
105
+ expect(result).to.be.instanceOf(InstantAssetLockProof);
106
+ expect(result.getInstantLock()).to.deep.equal(instantLock);
107
+ expect(result.getTransaction().toObject()).to.deep.equal(assetLockTransaction.toObject());
108
+ expect(result.getOutputIndex()).to.equal(outputIndex);
109
+ });
110
+ });
111
+
112
+ describe('#createChainAssetLockProof', () => {
113
+ it('should create chain asset lock proof', () => {
114
+ const coreChainLockedHeight = chainAssetLockProof.getCoreChainLockedHeight();
115
+ const outPoint = chainAssetLockProof.getOutPoint();
116
+
117
+ const result = dpp.identity.createChainAssetLockProof(
118
+ coreChainLockedHeight,
119
+ outPoint,
120
+ );
121
+
122
+ expect(result).to.be.instanceOf(ChainAssetLockProof);
123
+ expect(result.getCoreChainLockedHeight()).to.equal(coreChainLockedHeight);
124
+ expect(result.getOutPoint()).to.deep.equal(outPoint);
125
+ });
126
+ });
127
+
128
+ describe('#createIdentityCreateTransition', () => {
129
+ it('should create IdentityCreateTransition from Identity model', () => {
130
+ const stateTransition = dpp.identity.createIdentityCreateTransition(identity);
131
+
132
+ expect(stateTransition).to.be.instanceOf(IdentityCreateTransition);
133
+ expect(stateTransition.getPublicKeys()).to.deep.equal(identity.getPublicKeys());
134
+ expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal(
135
+ instantAssetLockProof.toObject(),
136
+ );
137
+ });
138
+ });
139
+
140
+ describe('#createIdentityTopUpTransition', () => {
141
+ it('should create IdentityTopUpTransition from identity id and outpoint', () => {
142
+ const stateTransition = dpp.identity
143
+ .createIdentityTopUpTransition(
144
+ identity.getId(),
145
+ instantAssetLockProof,
146
+ );
147
+
148
+ expect(stateTransition).to.be.instanceOf(IdentityTopUpTransition);
149
+ expect(stateTransition.getIdentityId()).to.be.deep.equal(identity.getId());
150
+ expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal(
151
+ instantAssetLockProof.toObject(),
152
+ );
153
+ });
154
+ });
155
+
156
+ describe('#createIdentityUpdateTransition', () => {
157
+ it('should create IdentityUpdateTransition from identity id and public keys', () => {
158
+ const publicKeys = {
159
+ add: [new IdentityPublicKey({
160
+ id: 3,
161
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
162
+ data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'),
163
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
164
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.CRITICAL,
165
+ readOnly: false,
166
+ })],
167
+ };
168
+
169
+ const stateTransition = dpp.identity
170
+ .createIdentityUpdateTransition(
171
+ identity,
172
+ publicKeys,
173
+ );
174
+
175
+ expect(stateTransition).to.be.instanceOf(IdentityUpdateTransition);
176
+ expect(stateTransition.getIdentityId()).to.be.deep.equal(identity.getId());
177
+ expect(stateTransition.getRevision()).to.equal(
178
+ identity.getRevision() + 1,
179
+ );
180
+ expect(
181
+ stateTransition.getPublicKeysToAdd().map((pk) => pk.toObject()),
182
+ ).to.deep.equal(publicKeys.add);
183
+ expect(stateTransition.getPublicKeyIdsToDisable()).to.equal(undefined);
184
+ expect(stateTransition.getPublicKeysDisabledAt()).to.equal(undefined);
185
+ });
186
+ });
187
+ });