@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,339 @@
1
+ const validateStateTransitionSignatureFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory');
2
+ const ValidationResult = require('../../../../lib/validation/ValidationResult');
3
+ const IdentityPublicKey = require('../../../../lib/identity/IdentityPublicKey');
4
+ const InvalidStateTransitionSignatureError = require('../../../../lib/errors/consensus/signature/InvalidStateTransitionSignatureError');
5
+ const MissingPublicKeyError = require('../../../../lib/errors/consensus/signature/MissingPublicKeyError');
6
+ const generateRandomIdentifier = require('../../../../lib/test/utils/generateRandomIdentifier');
7
+
8
+ const { expectValidationError } = require('../../../../lib/test/expect/expectError');
9
+ const stateTransitionTypes = require('../../../../lib/stateTransition/stateTransitionTypes');
10
+ const StateTransitionExecutionContext = require('../../../../lib/stateTransition/StateTransitionExecutionContext');
11
+ const PublicKeyIsDisabledConsensusError = require('../../../../lib/errors/consensus/signature/PublicKeyIsDisabledError');
12
+ const WrongPublicKeyPurposeConsensusError = require('../../../../lib/errors/consensus/signature/WrongPublicKeyPurposeError');
13
+ const PublicKeySecurityLevelNotMetConsensusError = require('../../../../lib/errors/consensus/signature/PublicKeySecurityLevelNotMetError');
14
+ const InvalidSignaturePublicKeySecurityLevelConsensusError = require('../../../../lib/errors/consensus/signature/InvalidSignaturePublicKeySecurityLevelError');
15
+ const InvalidIdentityPublicKeyTypeConsensusError = require('../../../../lib/errors/consensus/signature/InvalidIdentityPublicKeyTypeError');
16
+ const InvalidSignaturePublicKeySecurityLevelError = require('../../../../lib/stateTransition/errors/InvalidSignaturePublicKeySecurityLevelError');
17
+ const PublicKeySecurityLevelNotMetError = require('../../../../lib/stateTransition/errors/PublicKeySecurityLevelNotMetError');
18
+ const WrongPublicKeyPurposeError = require('../../../../lib/stateTransition/errors/WrongPublicKeyPurposeError');
19
+ const PublicKeyIsDisabledError = require('../../../../lib/stateTransition/errors/PublicKeyIsDisabledError');
20
+ const DPPError = require('../../../../lib/errors/DPPError');
21
+ const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock');
22
+ const IdentityNotFoundError = require('../../../../lib/errors/consensus/signature/IdentityNotFoundError');
23
+
24
+ describe('validateStateTransitionIdentitySignatureFactory', () => {
25
+ let validateStateTransitionIdentitySignature;
26
+ let stateTransition;
27
+ let ownerId;
28
+ let identity;
29
+ let identityPublicKey;
30
+ let publicKeyId;
31
+ let executionContext;
32
+ let stateRepositoryMock;
33
+
34
+ beforeEach(function beforeEach() {
35
+ executionContext = new StateTransitionExecutionContext();
36
+
37
+ ownerId = generateRandomIdentifier();
38
+ publicKeyId = 1;
39
+ stateTransition = {
40
+ verifySignature: this.sinonSandbox.stub().returns(true),
41
+ getSignaturePublicKeyId: this.sinonSandbox.stub().returns(publicKeyId),
42
+ getSignature: this.sinonSandbox.stub(),
43
+ getOwnerId: this.sinonSandbox.stub().returns(ownerId),
44
+ getType: this.sinonSandbox.stub().returns(stateTransitionTypes.IDENTITY_CREATE),
45
+ getExecutionContext: this.sinonSandbox.stub().returns(executionContext),
46
+ };
47
+
48
+ identityPublicKey = {
49
+ getType: this.sinonSandbox.stub().returns(IdentityPublicKey.TYPES.ECDSA_SECP256K1),
50
+ getSecurityLevel: this.sinonSandbox.stub(),
51
+ getId: this.sinonSandbox.stub().returns(publicKeyId),
52
+ };
53
+
54
+ const getPublicKeyById = this.sinonSandbox.stub().returns(identityPublicKey);
55
+
56
+ identity = {
57
+ getPublicKeyById,
58
+ getId: this.sinonSandbox.stub().returns(ownerId),
59
+ };
60
+
61
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
62
+ stateRepositoryMock.fetchIdentity.resolves(identity);
63
+
64
+ validateStateTransitionIdentitySignature = validateStateTransitionSignatureFactory(
65
+ stateRepositoryMock,
66
+ );
67
+ });
68
+
69
+ it('should pass properly signed state transition', async () => {
70
+ const result = await validateStateTransitionIdentitySignature(
71
+ stateTransition,
72
+ );
73
+
74
+ expect(result).to.be.instanceOf(ValidationResult);
75
+
76
+ expect(result.isValid()).to.be.true();
77
+ expect(result.getErrors()).to.be.an('array');
78
+ expect(result.getErrors()).to.be.empty();
79
+
80
+ expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
81
+ ownerId,
82
+ new StateTransitionExecutionContext(),
83
+ );
84
+ expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId);
85
+ expect(identityPublicKey.getType).to.be.calledTwice();
86
+ expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce();
87
+ expect(stateTransition.verifySignature).to.be.calledOnceWithExactly(identityPublicKey);
88
+ expect(stateTransition.getOwnerId).to.be.calledOnceWithExactly();
89
+ });
90
+
91
+ it('should return invalid result if owner id doesn\'t exist', async () => {
92
+ stateRepositoryMock.fetchIdentity.resolves(null);
93
+
94
+ const result = await validateStateTransitionIdentitySignature(
95
+ stateTransition,
96
+ );
97
+
98
+ expectValidationError(result);
99
+
100
+ const [error] = result.getErrors();
101
+
102
+ expect(error).to.be.an.instanceOf(IdentityNotFoundError);
103
+ expect(error.getCode()).to.equal(2000);
104
+ expect(Buffer.isBuffer(error.getIdentityId())).to.be.true();
105
+ expect(error.getIdentityId()).to.deep.equal(identity.getId().toBuffer());
106
+
107
+ expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
108
+ ownerId,
109
+ new StateTransitionExecutionContext(),
110
+ );
111
+ expect(identity.getPublicKeyById).to.not.be.called();
112
+ expect(identityPublicKey.getType).to.not.be.called();
113
+ expect(stateTransition.getSignaturePublicKeyId).to.not.be.called();
114
+ expect(stateTransition.verifySignature).to.not.be.called();
115
+ expect(stateTransition.getOwnerId).to.be.calledOnceWithExactly();
116
+ });
117
+
118
+ it("should return MissingPublicKeyError if the identity doesn't have a matching public key", async () => {
119
+ const type = IdentityPublicKey.TYPES.ECDSA_SECP256K1 + 1;
120
+ identityPublicKey.getType.returns(type);
121
+ identity.getPublicKeyById.returns(undefined);
122
+
123
+ const result = await validateStateTransitionIdentitySignature(
124
+ stateTransition,
125
+ );
126
+
127
+ expect(result).to.be.instanceOf(ValidationResult);
128
+ expect(result.isValid()).to.be.false();
129
+ expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
130
+ ownerId,
131
+ new StateTransitionExecutionContext(),
132
+ );
133
+ expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId);
134
+ expect(stateTransition.getSignaturePublicKeyId).to.be.calledTwice();
135
+ expect(stateTransition.verifySignature).to.not.be.called();
136
+
137
+ expect(result.getErrors()).to.be.an('array');
138
+ expect(result.getErrors()).to.have.lengthOf(1);
139
+
140
+ const [error] = result.getErrors();
141
+
142
+ expect(error).to.be.instanceOf(MissingPublicKeyError);
143
+ expect(error.getPublicKeyId()).to.equal(publicKeyId);
144
+ });
145
+
146
+ it('should return InvalidIdentityPublicKeyTypeError if type is not exist', async () => {
147
+ const type = Math.max(...Object.values(IdentityPublicKey.TYPES)) + 1;
148
+ identityPublicKey.getType.returns(type);
149
+
150
+ const result = await validateStateTransitionIdentitySignature(
151
+ stateTransition,
152
+ );
153
+
154
+ expect(result).to.be.instanceOf(ValidationResult);
155
+ expect(result.isValid()).to.be.false();
156
+ expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
157
+ ownerId,
158
+ new StateTransitionExecutionContext(),
159
+ );
160
+ expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId);
161
+ expect(identityPublicKey.getType).to.be.calledTwice();
162
+ expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce();
163
+ expect(stateTransition.verifySignature).to.not.be.called();
164
+
165
+ expect(result.getErrors()).to.be.an('array');
166
+ expect(result.getErrors()).to.have.lengthOf(1);
167
+
168
+ const [error] = result.getErrors();
169
+
170
+ expect(error).to.be.instanceOf(InvalidIdentityPublicKeyTypeConsensusError);
171
+ expect(error.getPublicKeyType()).to.equal(type);
172
+ });
173
+
174
+ it('should return InvalidStateTransitionSignatureError if signature is invalid', async () => {
175
+ stateTransition.verifySignature.resolves(false);
176
+
177
+ const result = await validateStateTransitionIdentitySignature(
178
+ stateTransition,
179
+ );
180
+
181
+ expect(result).to.be.instanceOf(ValidationResult);
182
+
183
+ expect(result.isValid()).to.be.false();
184
+ expect(result.getErrors()).to.be.an('array');
185
+ expect(result.getErrors()).to.have.lengthOf(1);
186
+
187
+ const [error] = result.getErrors();
188
+
189
+ expect(error).to.be.instanceOf(InvalidStateTransitionSignatureError);
190
+
191
+ expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(
192
+ ownerId,
193
+ new StateTransitionExecutionContext(),
194
+ );
195
+ expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId);
196
+ expect(identityPublicKey.getType).to.be.calledTwice();
197
+ expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce();
198
+ expect(stateTransition.verifySignature).to.be.calledOnceWithExactly(identityPublicKey);
199
+ });
200
+
201
+ describe('Consensus errors', () => {
202
+ it('should return InvalidSignaturePublicKeySecurityLevelConsensusError if InvalidSignaturePublicKeySecurityLevelError was thrown', async () => {
203
+ const e = new InvalidSignaturePublicKeySecurityLevelError(1, 0);
204
+
205
+ stateTransition.verifySignature.throws(e);
206
+
207
+ const result = await validateStateTransitionIdentitySignature(
208
+ stateTransition,
209
+ );
210
+
211
+ expect(result).to.be.instanceOf(ValidationResult);
212
+
213
+ expect(result.isValid()).to.be.false();
214
+ expect(result.getErrors()).to.be.an('array');
215
+ expect(result.getErrors()).to.have.lengthOf(1);
216
+
217
+ const [error] = result.getErrors();
218
+ expect(error).to.be.instanceOf(InvalidSignaturePublicKeySecurityLevelConsensusError);
219
+ expect(error.getPublicKeySecurityLevel()).to.equal(1);
220
+ expect(error.getKeySecurityLevelRequirement()).to.equal(0);
221
+ });
222
+
223
+ it('should return PublicKeySecurityLevelNotMetConsensusError if PublicKeySecurityLevelNotMetError was thrown', async () => {
224
+ const e = new PublicKeySecurityLevelNotMetError(1, 2);
225
+
226
+ stateTransition.verifySignature.throws(e);
227
+
228
+ const result = await validateStateTransitionIdentitySignature(
229
+ stateTransition,
230
+ );
231
+
232
+ expect(result).to.be.instanceOf(ValidationResult);
233
+
234
+ expect(result.isValid()).to.be.false();
235
+ expect(result.getErrors()).to.be.an('array');
236
+ expect(result.getErrors()).to.have.lengthOf(1);
237
+
238
+ const [error] = result.getErrors();
239
+ expect(error).to.be.instanceOf(PublicKeySecurityLevelNotMetConsensusError);
240
+ expect(error.getPublicKeySecurityLevel()).to.equal(1);
241
+ expect(error.getKeySecurityLevelRequirement()).to.equal(2);
242
+ });
243
+
244
+ it('should return WrongPublicKeyPurposeConsensusError if WrongPublicKeyPurposeError was thrown', async () => {
245
+ const e = new WrongPublicKeyPurposeError(4, 2);
246
+
247
+ stateTransition.verifySignature.throws(e);
248
+
249
+ const result = await validateStateTransitionIdentitySignature(
250
+ stateTransition,
251
+ );
252
+
253
+ expect(result).to.be.instanceOf(ValidationResult);
254
+
255
+ expect(result.isValid()).to.be.false();
256
+ expect(result.getErrors()).to.be.an('array');
257
+ expect(result.getErrors()).to.have.lengthOf(1);
258
+
259
+ const [error] = result.getErrors();
260
+ expect(error).to.be.instanceOf(WrongPublicKeyPurposeConsensusError);
261
+
262
+ expect(error.getPublicKeyPurpose()).to.equal(4);
263
+ expect(error.getKeyPurposeRequirement()).to.equal(2);
264
+ });
265
+
266
+ it('should return PublicKeyIsDisabledConsensusError if PublicKeyIsDisabledError was thrown', async () => {
267
+ const e = new PublicKeyIsDisabledError(identityPublicKey);
268
+
269
+ stateTransition.verifySignature.throws(e);
270
+
271
+ const result = await validateStateTransitionIdentitySignature(
272
+ stateTransition,
273
+ );
274
+
275
+ expect(result).to.be.instanceOf(ValidationResult);
276
+
277
+ expect(result.isValid()).to.be.false();
278
+ expect(result.getErrors()).to.be.an('array');
279
+ expect(result.getErrors()).to.have.lengthOf(1);
280
+
281
+ const [error] = result.getErrors();
282
+ expect(error).to.be.instanceOf(PublicKeyIsDisabledConsensusError);
283
+ expect(error.getPublicKeyId()).to.deep.equal(publicKeyId);
284
+ });
285
+
286
+ it('should return InvalidStateTransitionSignatureError if DPPError was thrown', async () => {
287
+ const e = new DPPError('Dpp error');
288
+
289
+ stateTransition.verifySignature.throws(e);
290
+
291
+ const result = await validateStateTransitionIdentitySignature(
292
+ stateTransition,
293
+ );
294
+
295
+ expect(result).to.be.instanceOf(ValidationResult);
296
+
297
+ expect(result.isValid()).to.be.false();
298
+ expect(result.getErrors()).to.be.an('array');
299
+ expect(result.getErrors()).to.have.lengthOf(1);
300
+
301
+ const [error] = result.getErrors();
302
+ expect(error).to.be.instanceOf(InvalidStateTransitionSignatureError);
303
+ });
304
+
305
+ it('should throw unknown error', async () => {
306
+ const e = new Error('unknown error');
307
+
308
+ stateTransition.verifySignature.throws(e);
309
+
310
+ try {
311
+ await validateStateTransitionIdentitySignature(
312
+ stateTransition,
313
+ );
314
+
315
+ expect.fail('should throw an error');
316
+ } catch (error) {
317
+ expect(error).to.equal(e);
318
+ }
319
+ });
320
+
321
+ it('should not verify signature on dry run', async () => {
322
+ const e = new DPPError('Dpp error');
323
+
324
+ stateTransition.verifySignature.throws(e);
325
+
326
+ executionContext.enableDryRun();
327
+
328
+ const result = await validateStateTransitionIdentitySignature(
329
+ stateTransition,
330
+ );
331
+
332
+ executionContext.disableDryRun();
333
+
334
+ expect(result.isValid()).to.be.true();
335
+ expect(result.getErrors()).to.be.an('array');
336
+ expect(result.getErrors()).to.be.empty();
337
+ });
338
+ });
339
+ });
@@ -0,0 +1,86 @@
1
+ const validateStateTransitionKeySignatureFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionKeySignatureFactory');
2
+
3
+ const getIdentityCreateTransitionFixture = require('../../../../lib/test/fixtures/getIdentityCreateTransitionFixture');
4
+ const InvalidStateTransitionSignatureError = require('../../../../lib/errors/consensus/signature/InvalidStateTransitionSignatureError');
5
+
6
+ const { expectValidationError } = require('../../../../lib/test/expect/expectError');
7
+
8
+ const ValidationResult = require('../../../../lib/validation/ValidationResult');
9
+ const StateTransitionExecutionContext = require('../../../../lib/stateTransition/StateTransitionExecutionContext');
10
+
11
+ describe('validateStateTransitionKeySignatureFactory', () => {
12
+ let publicKeyHash;
13
+ let stateTransition;
14
+ let stateTransitionHash;
15
+ let verifyHashSignatureMock;
16
+ let validateStateTransitionKeySignature;
17
+ let fetchAssetLockPublicKeyHashMock;
18
+ let executionContext;
19
+
20
+ beforeEach(function beforeEach() {
21
+ publicKeyHash = Buffer.alloc(20).fill(1);
22
+
23
+ stateTransition = getIdentityCreateTransitionFixture();
24
+ stateTransitionHash = stateTransition.hash({ skipSignature: true });
25
+
26
+ executionContext = new StateTransitionExecutionContext();
27
+
28
+ stateTransition.setExecutionContext(executionContext);
29
+
30
+ verifyHashSignatureMock = this.sinonSandbox.stub();
31
+
32
+ fetchAssetLockPublicKeyHashMock = this.sinonSandbox.stub().resolves(publicKeyHash);
33
+
34
+ validateStateTransitionKeySignature = validateStateTransitionKeySignatureFactory(
35
+ verifyHashSignatureMock,
36
+ fetchAssetLockPublicKeyHashMock,
37
+ );
38
+ });
39
+
40
+ it('should return invalid result if signature is not valid', async () => {
41
+ verifyHashSignatureMock.returns(false);
42
+
43
+ const result = await validateStateTransitionKeySignature(
44
+ stateTransition,
45
+ );
46
+
47
+ expectValidationError(result, InvalidStateTransitionSignatureError);
48
+
49
+ const [error] = result.getErrors();
50
+
51
+ expect(error.getCode()).to.equal(2002);
52
+
53
+ expect(fetchAssetLockPublicKeyHashMock).to.be.calledOnceWithExactly(
54
+ stateTransition.getAssetLockProof(),
55
+ executionContext,
56
+ );
57
+
58
+ expect(verifyHashSignatureMock).to.be.calledOnceWithExactly(
59
+ stateTransitionHash,
60
+ stateTransition.getSignature(),
61
+ publicKeyHash,
62
+ );
63
+ });
64
+
65
+ it('should return valid result if signature is valid', async () => {
66
+ verifyHashSignatureMock.returns(true);
67
+
68
+ const result = await validateStateTransitionKeySignature(
69
+ stateTransition,
70
+ );
71
+
72
+ expect(result).to.be.instanceof(ValidationResult);
73
+ expect(result.isValid()).to.be.true();
74
+
75
+ expect(fetchAssetLockPublicKeyHashMock).to.be.calledOnceWithExactly(
76
+ stateTransition.getAssetLockProof(),
77
+ executionContext,
78
+ );
79
+
80
+ expect(verifyHashSignatureMock).to.be.calledOnceWithExactly(
81
+ stateTransitionHash,
82
+ stateTransition.getSignature(),
83
+ publicKeyHash,
84
+ );
85
+ });
86
+ });
@@ -0,0 +1,89 @@
1
+ const stateTransitionTypes = require('../../../../lib/stateTransition/stateTransitionTypes');
2
+
3
+ const validateStateTransitionStateFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionStateFactory');
4
+
5
+ const { expectValidationError } = require('../../../../lib/test/expect/expectError');
6
+
7
+ const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture');
8
+
9
+ const ValidationResult = require('../../../../lib/validation/ValidationResult');
10
+
11
+ const DataContractFactory = require('../../../../lib/dataContract/DataContractFactory');
12
+
13
+ const InvalidStateTransitionTypeError = require('../../../../lib/stateTransition/errors/InvalidStateTransitionTypeError');
14
+ const createDPPMock = require('../../../../lib/test/mocks/createDPPMock');
15
+ const SomeConsensusError = require('../../../../lib/test/mocks/SomeConsensusError');
16
+
17
+ describe('validateStateTransitionStateFactory', () => {
18
+ let validateDataContractSTDataMock;
19
+ let validateStateTransitionState;
20
+ let stateTransition;
21
+
22
+ beforeEach(function beforeEach() {
23
+ validateDataContractSTDataMock = this.sinonSandbox.stub();
24
+
25
+ const dataContractFactory = new DataContractFactory(createDPPMock(), undefined);
26
+
27
+ const dataContract = getDataContractFixture();
28
+ stateTransition = dataContractFactory.createDataContractCreateTransition(dataContract);
29
+
30
+ validateStateTransitionState = validateStateTransitionStateFactory({
31
+ [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractSTDataMock,
32
+ });
33
+ });
34
+
35
+ it('should return invalid result if State Transition type is invalid', async () => {
36
+ const rawStateTransition = {};
37
+ stateTransition = {
38
+ getType() {
39
+ return 4343;
40
+ },
41
+ toObject() {
42
+ return rawStateTransition;
43
+ },
44
+ };
45
+
46
+ try {
47
+ await validateStateTransitionState(stateTransition);
48
+
49
+ expect.fail('should throw InvalidStateTransitionTypeError');
50
+ } catch (e) {
51
+ expect(e).to.be.instanceOf(InvalidStateTransitionTypeError);
52
+ expect(e.getType()).to.equal(stateTransition.getType());
53
+
54
+ expect(validateDataContractSTDataMock).to.not.be.called();
55
+ }
56
+ });
57
+
58
+ it('should return invalid result if Data Contract State Transition is not valid', async () => {
59
+ const dataContractError = new SomeConsensusError('test');
60
+ const dataContractResult = new ValidationResult([
61
+ dataContractError,
62
+ ]);
63
+
64
+ validateDataContractSTDataMock.resolves(dataContractResult);
65
+
66
+ const result = await validateStateTransitionState(stateTransition);
67
+
68
+ expectValidationError(result);
69
+
70
+ const [error] = result.getErrors();
71
+
72
+ expect(error).to.equal(dataContractError);
73
+
74
+ expect(validateDataContractSTDataMock).to.be.calledOnceWith(stateTransition);
75
+ });
76
+
77
+ it('should return valid result', async () => {
78
+ const dataContractResult = new ValidationResult();
79
+
80
+ validateDataContractSTDataMock.resolves(dataContractResult);
81
+
82
+ const result = await validateStateTransitionState(stateTransition);
83
+
84
+ expect(result).to.be.an.instanceOf(ValidationResult);
85
+ expect(result.isValid()).to.be.true();
86
+
87
+ expect(validateDataContractSTDataMock).to.be.calledOnceWith(stateTransition);
88
+ });
89
+ });
@@ -0,0 +1,80 @@
1
+ const UnsupportedProtocolVersionError = require('../../../lib/errors/consensus/basic/UnsupportedProtocolVersionError');
2
+ const CompatibleProtocolVersionIsNotDefinedError = require('../../../lib/errors/CompatibleProtocolVersionIsNotDefinedError');
3
+ const IncompatibleProtocolVersionError = require('../../../lib/errors/consensus/basic/IncompatibleProtocolVersionError');
4
+
5
+ const createDPPMock = require('../../../lib/test/mocks/createDPPMock');
6
+ const validateProtocolVersionFactory = require('../../../lib/version/validateProtocolVersionFactory');
7
+
8
+ const { expectValidationError } = require('../../../lib/test/expect/expectError');
9
+ const { latestVersion } = require('../../../lib/version/protocolVersion');
10
+
11
+ describe('validateProtocolVersionFactory', () => {
12
+ let validateProtocolVersion;
13
+ let dppMock;
14
+ let versionCompatibilityMap;
15
+ let currentProtocolVersion;
16
+ let protocolVersion;
17
+
18
+ beforeEach(function beforeEach() {
19
+ protocolVersion = 1;
20
+ currentProtocolVersion = 1;
21
+
22
+ dppMock = createDPPMock(this.sinonSandbox);
23
+ dppMock.getProtocolVersion.returns(currentProtocolVersion);
24
+
25
+ versionCompatibilityMap = {
26
+ 1: 1,
27
+ };
28
+
29
+ validateProtocolVersion = validateProtocolVersionFactory(
30
+ dppMock,
31
+ versionCompatibilityMap,
32
+ );
33
+ });
34
+
35
+ it('should throw UnsupportedProtocolVersionError if protocolVersion is higher than latestVersion', () => {
36
+ protocolVersion = latestVersion + 1;
37
+
38
+ const result = validateProtocolVersion(protocolVersion);
39
+
40
+ expectValidationError(result, UnsupportedProtocolVersionError);
41
+
42
+ const error = result.getFirstError();
43
+
44
+ expect(error.getParsedProtocolVersion()).to.equal(protocolVersion);
45
+ expect(error.getLatestVersion()).to.equal(latestVersion);
46
+ expect(error.getCode()).to.equal(1002);
47
+ });
48
+
49
+ it('should throw CompatibleProtocolVersionIsNotDefinedError if compatible version is not'
50
+ + ' defined for the current protocol version', () => {
51
+ delete versionCompatibilityMap[currentProtocolVersion.toString()];
52
+
53
+ try {
54
+ validateProtocolVersion(protocolVersion);
55
+
56
+ expect.fail('should throw CompatibleProtocolVersionIsNotDefinedError');
57
+ } catch (e) {
58
+ expect(e).to.be.an.instanceOf(CompatibleProtocolVersionIsNotDefinedError);
59
+ }
60
+ });
61
+
62
+ it('should throw IncompatibleProtocolVersionError if parsed version is lower than compatible one', () => {
63
+ const minimalProtocolVersion = 1;
64
+
65
+ protocolVersion = 0;
66
+ currentProtocolVersion = 5;
67
+
68
+ versionCompatibilityMap[currentProtocolVersion.toString()] = minimalProtocolVersion;
69
+
70
+ const result = validateProtocolVersion(protocolVersion);
71
+
72
+ expectValidationError(result, IncompatibleProtocolVersionError);
73
+
74
+ const error = result.getFirstError();
75
+
76
+ expect(error.getParsedProtocolVersion()).to.equal(protocolVersion);
77
+ expect(error.getMinimalProtocolVersion()).to.equal(minimalProtocolVersion);
78
+ expect(error.getCode()).to.equal(1003);
79
+ });
80
+ });
@@ -0,0 +1,49 @@
1
+ const path = require('path');
2
+ const webpack = require('webpack');
3
+
4
+ const commonJSConfig = {
5
+ entry: ['core-js/stable', './lib/DashPlatformProtocol.js'],
6
+ mode: 'production',
7
+ output: {
8
+ path: path.resolve(__dirname, 'dist'),
9
+ filename: 'DashPlatformProtocol.min.js',
10
+ library: 'DashPlatformProtocol',
11
+ libraryTarget: 'umd',
12
+ },
13
+ resolve: {
14
+ fallback: {
15
+ fs: false,
16
+ ws: false,
17
+ crypto: require.resolve('crypto-browserify'),
18
+ http: require.resolve('stream-http'),
19
+ https: require.resolve('https-browserify'),
20
+ stream: require.resolve('stream-browserify'),
21
+ path: require.resolve('path-browserify'),
22
+ url: require.resolve('url/'),
23
+ util: require.resolve('util/'),
24
+ buffer: require.resolve('buffer/'),
25
+ events: require.resolve('events/'),
26
+ assert: require.resolve('assert/'),
27
+ string_decoder: require.resolve('string_decoder/'),
28
+ },
29
+ },
30
+ plugins: [
31
+ new webpack.ProvidePlugin({
32
+ Buffer: [require.resolve('buffer/'), 'Buffer'],
33
+ process: require.resolve('process/browser'),
34
+ }),
35
+ ],
36
+ module: {
37
+ rules: [
38
+ {
39
+ test: /\.js$/,
40
+ exclude: /(node_modules)/,
41
+ use: {
42
+ loader: 'babel-loader',
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ };
48
+
49
+ module.exports = [commonJSConfig];