@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.
- package/.babelrc +5 -0
- package/.editorconfig +13 -0
- package/.eslintignore +1 -0
- package/.eslintrc +15 -0
- package/.mocharc.yml +4 -0
- package/CHANGELOG.md +397 -0
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/karma.conf.js +53 -0
- package/package.json +107 -0
- package/test/.eslintrc +12 -0
- package/test/integration/DashPlatformProtocol.spec.js +53 -0
- package/test/integration/ajv/keywords/byteArray/addByteArrayKeyword.spec.js +148 -0
- package/test/integration/dataContract/DataContractFacade.spec.js +84 -0
- package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +357 -0
- package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +444 -0
- package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +2191 -0
- package/test/integration/document/Document.spec.js +90 -0
- package/test/integration/document/DocumentFacade.spec.js +155 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +83 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +1146 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +294 -0
- package/test/integration/document/validation/validateDocumentFactory.spec.js +447 -0
- package/test/integration/error/consensus/createConsensusError.spec.js +21 -0
- package/test/integration/identity/IdentityFacade.spec.js +187 -0
- package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +422 -0
- package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +361 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +595 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +299 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +66 -0
- package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +415 -0
- package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +134 -0
- package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +401 -0
- package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +205 -0
- package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +127 -0
- package/test/integration/identity/validation/validateIdentityFactory.spec.js +370 -0
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +497 -0
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +507 -0
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +418 -0
- package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +35 -0
- package/test/integration/util/generateEntropy.spec.js +17 -0
- package/test/integration/util/serializer.spec.js +24 -0
- package/test/unit/DashPlatformProtocol.spec.js +79 -0
- package/test/unit/Identifier.spec.js +123 -0
- package/test/unit/Metadata.spec.js +37 -0
- package/test/unit/dataContract/DataContract.spec.js +407 -0
- package/test/unit/dataContract/DataContractFactory.spec.js +178 -0
- package/test/unit/dataContract/createDataContract.spec.js +57 -0
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +46 -0
- package/test/unit/dataContract/generateDataContractId.spec.js +19 -0
- package/test/unit/dataContract/getBinaryPropertiesFromSchema.spec.js +103 -0
- package/test/unit/dataContract/getPropertyDefinitionByPath.spec.js +84 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +160 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +48 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +85 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +158 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +47 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +121 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +111 -0
- package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +93 -0
- package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +64 -0
- package/test/unit/dataTrigger/DataTrigger.spec.js +132 -0
- package/test/unit/dataTrigger/DataTriggerExecutionContext.spec.js +29 -0
- package/test/unit/dataTrigger/dashpayDataTriggers/createContactRequestDataTrigger.spec.js +109 -0
- package/test/unit/dataTrigger/dpnsTriggers/createDomainDataTrigger.spec.js +382 -0
- package/test/unit/dataTrigger/featureFlagDataTriggers/createFeatureFlagDataTrigger.spec.js +101 -0
- package/test/unit/dataTrigger/getDataTriggersFactory.spec.js +113 -0
- package/test/unit/dataTrigger/rejectDataTrigger.spec.js +51 -0
- package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +200 -0
- package/test/unit/decodeProtocolEntityFactory.spec.js +75 -0
- package/test/unit/document/Document.spec.js +444 -0
- package/test/unit/document/DocumentFactory.spec.js +376 -0
- package/test/unit/document/errors/InvalidDocumentError.spec.js +46 -0
- package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +66 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +168 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +171 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +25 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +31 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +122 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +75 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +128 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +811 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +279 -0
- package/test/unit/errors/consensus/codes.spec.js +102 -0
- package/test/unit/identity/Identity.spec.js +243 -0
- package/test/unit/identity/IdentityFactory.spec.js +274 -0
- package/test/unit/identity/IdentityPublicKey.spec.js +273 -0
- package/test/unit/identity/creditsConverter.spec.js +34 -0
- package/test/unit/identity/errors/InvalidIdentityError.spec.js +46 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +184 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +90 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +71 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +137 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +108 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +22 -0
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +219 -0
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +149 -0
- package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +21 -0
- package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +36 -0
- package/test/unit/identity/validation/validateRequiredPurposeAndSecurityLevelFactory.spec.js +47 -0
- package/test/unit/stateTransition/StateTransitionFactory.spec.js +160 -0
- package/test/unit/stateTransition/createStateTransitionFactory.spec.js +72 -0
- package/test/unit/stateTransition/errors/InvalidStateTransitionError.spec.js +51 -0
- package/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js +138 -0
- package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +372 -0
- package/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js +339 -0
- package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +86 -0
- package/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js +89 -0
- package/test/unit/version/validateProtocolVersionFactory.spec.js +80 -0
- package/webpack.config.js +49 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock');
|
|
2
|
+
const validateIdentityUpdateTransitionStateFactory = require('../../../../../../../lib/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory');
|
|
3
|
+
const getIdentityUpdateTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityUpdateTransitionFixture');
|
|
4
|
+
const IdentityPublicKey = require('../../../../../../../lib/identity/IdentityPublicKey');
|
|
5
|
+
const getIdentityFixture = require('../../../../../../../lib/test/fixtures/getIdentityFixture');
|
|
6
|
+
const ValidationResult = require('../../../../../../../lib/validation/ValidationResult');
|
|
7
|
+
const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
|
|
8
|
+
const InvalidIdentityRevisionError = require('../../../../../../../lib/errors/consensus/state/identity/InvalidIdentityRevisionError');
|
|
9
|
+
const IdentityPublicKeyIsReadOnlyError = require('../../../../../../../lib/errors/consensus/state/identity/IdentityPublicKeyIsReadOnlyError');
|
|
10
|
+
const IdentityPublicKeyDisabledAtWindowViolationError = require('../../../../../../../lib/errors/consensus/state/identity/IdentityPublicKeyDisabledAtWindowViolationError');
|
|
11
|
+
const InvalidIdentityPublicKeyIdError = require('../../../../../../../lib/errors/consensus/state/identity/InvalidIdentityPublicKeyIdError');
|
|
12
|
+
const SomeConsensusError = require('../../../../../../../lib/test/mocks/SomeConsensusError');
|
|
13
|
+
const StateTransitionExecutionContext = require('../../../../../../../lib/stateTransition/StateTransitionExecutionContext');
|
|
14
|
+
const IdentityPublicKeyIsDisabledError = require('../../../../../../../lib/errors/consensus/state/identity/IdentityPublicKeyIsDisabledError');
|
|
15
|
+
|
|
16
|
+
describe('validateIdentityUpdateTransitionStateFactory', () => {
|
|
17
|
+
let validateIdentityUpdateTransitionState;
|
|
18
|
+
let stateRepositoryMock;
|
|
19
|
+
let stateTransition;
|
|
20
|
+
let identity;
|
|
21
|
+
let validatePublicKeysMock;
|
|
22
|
+
let fakeTime;
|
|
23
|
+
let blockTime;
|
|
24
|
+
let validateRequiredPurposeAndSecurityLevelMock;
|
|
25
|
+
let executionContext;
|
|
26
|
+
|
|
27
|
+
beforeEach(async function beforeEach() {
|
|
28
|
+
identity = getIdentityFixture();
|
|
29
|
+
validatePublicKeysMock = this.sinonSandbox.stub()
|
|
30
|
+
.returns(new ValidationResult());
|
|
31
|
+
validateRequiredPurposeAndSecurityLevelMock = this.sinonSandbox.stub()
|
|
32
|
+
.returns(new ValidationResult());
|
|
33
|
+
|
|
34
|
+
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
35
|
+
stateRepositoryMock.fetchIdentity.resolves(identity);
|
|
36
|
+
|
|
37
|
+
blockTime = new Date().getTime() / 1000;
|
|
38
|
+
|
|
39
|
+
const abciHeader = {
|
|
40
|
+
time: {
|
|
41
|
+
seconds: blockTime,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
stateRepositoryMock.fetchLatestPlatformBlockHeader.resolves(abciHeader);
|
|
46
|
+
|
|
47
|
+
validateIdentityUpdateTransitionState = validateIdentityUpdateTransitionStateFactory(
|
|
48
|
+
stateRepositoryMock,
|
|
49
|
+
validatePublicKeysMock,
|
|
50
|
+
validateRequiredPurposeAndSecurityLevelMock,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
stateTransition = getIdentityUpdateTransitionFixture();
|
|
54
|
+
stateTransition.setRevision(identity.getRevision() + 1);
|
|
55
|
+
stateTransition.setPublicKeyIdsToDisable(undefined);
|
|
56
|
+
stateTransition.setPublicKeysDisabledAt(undefined);
|
|
57
|
+
|
|
58
|
+
executionContext = new StateTransitionExecutionContext();
|
|
59
|
+
|
|
60
|
+
stateTransition.setExecutionContext(executionContext);
|
|
61
|
+
|
|
62
|
+
const privateKey = '9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2';
|
|
63
|
+
|
|
64
|
+
await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1);
|
|
65
|
+
|
|
66
|
+
fakeTime = this.sinonSandbox.useFakeTimers(new Date());
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
afterEach(() => {
|
|
70
|
+
fakeTime.reset();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should return InvalidIdentityRevisionError if new revision is not incremented by 1', async () => {
|
|
74
|
+
stateTransition.setRevision(identity.getRevision() + 2);
|
|
75
|
+
|
|
76
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
77
|
+
|
|
78
|
+
expectValidationError(result, InvalidIdentityRevisionError);
|
|
79
|
+
|
|
80
|
+
const [error] = result.getErrors();
|
|
81
|
+
expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId());
|
|
82
|
+
expect(error.getCurrentRevision()).to.equal(identity.getRevision());
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should return IdentityPublicKeyIsReadOnlyError if disabling public key is readOnly', async () => {
|
|
86
|
+
identity.getPublicKeyById(0).setReadOnly(true);
|
|
87
|
+
stateTransition.setPublicKeyIdsToDisable([0]);
|
|
88
|
+
|
|
89
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
90
|
+
|
|
91
|
+
expectValidationError(result, IdentityPublicKeyIsReadOnlyError);
|
|
92
|
+
|
|
93
|
+
const [error] = result.getErrors();
|
|
94
|
+
expect(error.getPublicKeyIndex()).to.equal(0);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should return IdentityPublicKeyIsDisabledError if disabling public key is already disabled', async () => {
|
|
98
|
+
identity.getPublicKeyById(0).setDisabledAt(new Date().getTime());
|
|
99
|
+
stateTransition.setPublicKeyIdsToDisable([0]);
|
|
100
|
+
|
|
101
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
102
|
+
|
|
103
|
+
expectValidationError(result, IdentityPublicKeyIsDisabledError);
|
|
104
|
+
|
|
105
|
+
const [error] = result.getErrors();
|
|
106
|
+
expect(error.getPublicKeyIndex()).to.equal(0);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should return invalid result if disabledAt has violated time window', async () => {
|
|
110
|
+
stateTransition.setPublicKeyIdsToDisable([1]);
|
|
111
|
+
stateTransition.setPublicKeysDisabledAt(new Date());
|
|
112
|
+
|
|
113
|
+
const timeWindowStart = new Date(blockTime * 1000);
|
|
114
|
+
timeWindowStart.setMinutes(
|
|
115
|
+
timeWindowStart.getMinutes() - 5,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const timeWindowEnd = new Date(blockTime * 1000);
|
|
119
|
+
timeWindowEnd.setMinutes(
|
|
120
|
+
timeWindowEnd.getMinutes() + 5,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
stateTransition.publicKeysDisabledAt.setMinutes(
|
|
124
|
+
stateTransition.publicKeysDisabledAt.getMinutes() - 6,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
128
|
+
|
|
129
|
+
expectValidationError(result, IdentityPublicKeyDisabledAtWindowViolationError);
|
|
130
|
+
|
|
131
|
+
const [error] = result.getErrors();
|
|
132
|
+
expect(error.getDisabledAt()).to.deep.equal(stateTransition.publicKeysDisabledAt);
|
|
133
|
+
expect(error.getTimeWindowStart()).to.deep.equal(timeWindowStart);
|
|
134
|
+
expect(error.getTimeWindowEnd()).to.deep.equal(timeWindowEnd);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should throw InvalidIdentityPublicKeyIdError if identity does not contain public key with disabling ID', async () => {
|
|
138
|
+
stateTransition.setPublicKeyIdsToDisable([3]);
|
|
139
|
+
stateTransition.setPublicKeysDisabledAt(new Date());
|
|
140
|
+
|
|
141
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
142
|
+
|
|
143
|
+
expectValidationError(result, InvalidIdentityPublicKeyIdError);
|
|
144
|
+
|
|
145
|
+
const [error] = result.getErrors();
|
|
146
|
+
expect(error.getId()).to.equal(3);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should pass when disabling public key', async () => {
|
|
150
|
+
stateTransition.setPublicKeyIdsToDisable([1]);
|
|
151
|
+
stateTransition.setPublicKeysDisabledAt(new Date());
|
|
152
|
+
stateTransition.setPublicKeysToAdd(undefined);
|
|
153
|
+
|
|
154
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
155
|
+
|
|
156
|
+
expect(result.isValid()).to.be.true();
|
|
157
|
+
|
|
158
|
+
expect(stateRepositoryMock.fetchIdentity)
|
|
159
|
+
.to.be.calledOnceWithExactly(
|
|
160
|
+
stateTransition.getIdentityId(),
|
|
161
|
+
executionContext,
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
165
|
+
.to.be.calledOnce();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should pass when adding public key', async () => {
|
|
169
|
+
stateTransition.setPublicKeyIdsToDisable(undefined);
|
|
170
|
+
stateTransition.setPublicKeysDisabledAt(undefined);
|
|
171
|
+
|
|
172
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
173
|
+
|
|
174
|
+
expect(result.isValid()).to.be.true();
|
|
175
|
+
|
|
176
|
+
expect(stateRepositoryMock.fetchIdentity)
|
|
177
|
+
.to.be.calledOnceWithExactly(
|
|
178
|
+
stateTransition.getIdentityId(),
|
|
179
|
+
executionContext,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
183
|
+
.to.not.be.called();
|
|
184
|
+
|
|
185
|
+
expect(validatePublicKeysMock).to.be.calledOnceWithExactly(
|
|
186
|
+
[...identity.getPublicKeys(), ...stateTransition.getPublicKeysToAdd()].map(
|
|
187
|
+
(pk) => pk.toObject(),
|
|
188
|
+
),
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('should pass when both adding and disabling public keys', async () => {
|
|
193
|
+
stateTransition.setPublicKeyIdsToDisable([1]);
|
|
194
|
+
stateTransition.setPublicKeysDisabledAt(new Date());
|
|
195
|
+
|
|
196
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
197
|
+
|
|
198
|
+
expect(result.isValid()).to.be.true();
|
|
199
|
+
|
|
200
|
+
expect(stateRepositoryMock.fetchIdentity)
|
|
201
|
+
.to.be.calledOnceWithExactly(
|
|
202
|
+
stateTransition.getIdentityId(),
|
|
203
|
+
executionContext,
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
207
|
+
.to.be.calledOnce();
|
|
208
|
+
|
|
209
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
210
|
+
.to.be.calledOnce();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('should validate purpose and security level', async () => {
|
|
214
|
+
const now = new Date();
|
|
215
|
+
|
|
216
|
+
stateTransition.setPublicKeyIdsToDisable([1]);
|
|
217
|
+
stateTransition.setPublicKeysDisabledAt(now);
|
|
218
|
+
|
|
219
|
+
const publicKeysError = new SomeConsensusError('test');
|
|
220
|
+
|
|
221
|
+
validateRequiredPurposeAndSecurityLevelMock.onCall(0)
|
|
222
|
+
.returns(new ValidationResult([publicKeysError]));
|
|
223
|
+
|
|
224
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
225
|
+
|
|
226
|
+
expectValidationError(result, SomeConsensusError);
|
|
227
|
+
|
|
228
|
+
expect(validateRequiredPurposeAndSecurityLevelMock).to.be.calledOnceWithExactly([
|
|
229
|
+
identity.getPublicKeys()[0].toObject(),
|
|
230
|
+
{ ...identity.getPublicKeys()[1].toObject(), disabledAt: now.getTime() },
|
|
231
|
+
stateTransition.getPublicKeysToAdd()[0].toObject(),
|
|
232
|
+
]);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('should validate public keys to add', async () => {
|
|
236
|
+
const publicKeysError = new SomeConsensusError('test');
|
|
237
|
+
|
|
238
|
+
validatePublicKeysMock.onCall(0).returns(new ValidationResult([publicKeysError]));
|
|
239
|
+
|
|
240
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
241
|
+
|
|
242
|
+
expectValidationError(result, SomeConsensusError);
|
|
243
|
+
|
|
244
|
+
expect(validatePublicKeysMock).to.be.calledOnceWithExactly(
|
|
245
|
+
[...identity.getPublicKeys(), ...stateTransition.getPublicKeysToAdd()]
|
|
246
|
+
.map((pk) => pk.toObject()),
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it('should validate resulting identity public keys', async () => {
|
|
251
|
+
const publicKeysError = new SomeConsensusError('test');
|
|
252
|
+
|
|
253
|
+
validatePublicKeysMock.returns(new ValidationResult([publicKeysError]));
|
|
254
|
+
|
|
255
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
256
|
+
|
|
257
|
+
expectValidationError(result, SomeConsensusError);
|
|
258
|
+
|
|
259
|
+
expect(validatePublicKeysMock).to.be.calledOnce();
|
|
260
|
+
|
|
261
|
+
const publicKeys = [...identity.getPublicKeys(), ...stateTransition.getPublicKeysToAdd()];
|
|
262
|
+
|
|
263
|
+
expect(validatePublicKeysMock).to.be.calledWithExactly(
|
|
264
|
+
publicKeys.map((pk) => pk.toObject()),
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should return valid result on dry run', async () => {
|
|
269
|
+
stateTransition.setPublicKeyIdsToDisable([3]);
|
|
270
|
+
stateTransition.setPublicKeysDisabledAt(new Date());
|
|
271
|
+
|
|
272
|
+
const publicKeysError = new SomeConsensusError('test');
|
|
273
|
+
|
|
274
|
+
validateRequiredPurposeAndSecurityLevelMock.onCall(0)
|
|
275
|
+
.returns(new ValidationResult([publicKeysError]));
|
|
276
|
+
|
|
277
|
+
stateTransition.getExecutionContext().enableDryRun();
|
|
278
|
+
|
|
279
|
+
const result = await validateIdentityUpdateTransitionState(stateTransition);
|
|
280
|
+
|
|
281
|
+
stateTransition.getExecutionContext().disableDryRun();
|
|
282
|
+
|
|
283
|
+
expect(result.isValid()).to.be.true();
|
|
284
|
+
|
|
285
|
+
expect(validatePublicKeysMock).to.not.be.called();
|
|
286
|
+
expect(validateRequiredPurposeAndSecurityLevelMock).to.not.be.called();
|
|
287
|
+
expect(stateRepositoryMock.fetchIdentity)
|
|
288
|
+
.to.be.calledOnceWithExactly(
|
|
289
|
+
stateTransition.getIdentityId(),
|
|
290
|
+
executionContext,
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
294
|
+
.to.not.be.called();
|
|
295
|
+
|
|
296
|
+
expect(stateRepositoryMock.fetchLatestPlatformBlockHeader)
|
|
297
|
+
.to.not.be.called();
|
|
298
|
+
});
|
|
299
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const validatePublicKeys = require(
|
|
2
|
+
'../../../../../../../lib/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState',
|
|
3
|
+
);
|
|
4
|
+
const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
|
|
5
|
+
const DuplicatedIdentityPublicKeyIdError = require('../../../../../../../lib/errors/consensus/state/identity/DuplicatedIdentityPublicKeyIdError');
|
|
6
|
+
const DuplicatedIdentityPublicKeyError = require('../../../../../../../lib/errors/consensus/state/identity/DuplicatedIdentityPublicKeyError');
|
|
7
|
+
const identitySchema = require('../../../../../../../schema/identity/identity.json');
|
|
8
|
+
const MaxIdentityPublicKeyLimitReachedError = require('../../../../../../../lib/errors/consensus/state/identity/MaxIdentityPublicKeyLimitReachedError');
|
|
9
|
+
const getIdentityFixture = require('../../../../../../../lib/test/fixtures/getIdentityFixture');
|
|
10
|
+
|
|
11
|
+
describe('validatePublicKeysState', () => {
|
|
12
|
+
let rawPublicKeys;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
({ publicKeys: rawPublicKeys } = getIdentityFixture().toObject());
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should return invalid result if there are duplicate key ids', () => {
|
|
19
|
+
rawPublicKeys[1].id = rawPublicKeys[0].id;
|
|
20
|
+
|
|
21
|
+
const result = validatePublicKeys(rawPublicKeys);
|
|
22
|
+
|
|
23
|
+
expectValidationError(result, DuplicatedIdentityPublicKeyIdError);
|
|
24
|
+
|
|
25
|
+
const [error] = result.getErrors();
|
|
26
|
+
|
|
27
|
+
expect(error.getCode()).to.equal(4022);
|
|
28
|
+
expect(error.getDuplicatedIds()).to.deep.equal([rawPublicKeys[1].id]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should return invalid result if there are duplicate keys', () => {
|
|
32
|
+
rawPublicKeys[1].data = rawPublicKeys[0].data;
|
|
33
|
+
|
|
34
|
+
const result = validatePublicKeys(rawPublicKeys);
|
|
35
|
+
|
|
36
|
+
expectValidationError(result, DuplicatedIdentityPublicKeyError);
|
|
37
|
+
|
|
38
|
+
const [error] = result.getErrors();
|
|
39
|
+
|
|
40
|
+
expect(error.getCode()).to.equal(4021);
|
|
41
|
+
expect(error.getDuplicatedPublicKeysIds()).to.deep.equal([rawPublicKeys[1].id]);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should pass valid public keys', () => {
|
|
45
|
+
const result = validatePublicKeys(rawPublicKeys);
|
|
46
|
+
|
|
47
|
+
expect(result.isValid()).to.be.true();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should return invalid result if number of public keys is bigger than 32', () => {
|
|
51
|
+
const { maxItems } = identitySchema.properties.publicKeys;
|
|
52
|
+
const numToAdd = maxItems - rawPublicKeys.length;
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i <= numToAdd; ++i) {
|
|
55
|
+
rawPublicKeys.push(rawPublicKeys[0]);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const result = validatePublicKeys(rawPublicKeys);
|
|
59
|
+
|
|
60
|
+
expectValidationError(result, MaxIdentityPublicKeyLimitReachedError);
|
|
61
|
+
|
|
62
|
+
const [error] = result.getErrors();
|
|
63
|
+
expect(error.getCode()).to.equal(4020);
|
|
64
|
+
expect(error.geMaxItems()).to.equal(maxItems);
|
|
65
|
+
});
|
|
66
|
+
});
|