@dashevo/wasm-dpp 0.24.0-dev.10 → 0.24.0-dev.12
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/Cargo.toml +2 -0
- package/dist/index.js +1 -1
- package/dist/lib/dpp.d.ts +9 -0
- package/dist/lib/errors/AbstractConsensusError.d.ts +10 -0
- package/dist/lib/errors/DPPError.d.ts +5 -0
- package/dist/lib/errors/patchConsensusErrors.d.ts +1 -0
- package/dist/lib/{patchIdentifier.d.ts → identifier/patchIdentifier.d.ts} +1 -1
- package/dist/{index.d.ts → lib/index.d.ts} +1 -1
- package/dist/lib/utils/extend.d.ts +1 -0
- package/dist/wasm/wasm_dpp.d.ts +503 -262
- package/lib/dpp.ts +24 -0
- package/lib/errors/AbstractConsensusError.ts +13 -0
- package/lib/errors/DPPError.ts +15 -0
- package/lib/errors/patchConsensusErrors.ts +175 -0
- package/lib/{patchIdentifier.ts → identifier/patchIdentifier.ts} +1 -1
- package/{index.ts → lib/index.ts} +4 -3
- package/lib/test/expect/expectError.js +4 -2
- package/lib/utils/extend.ts +6 -0
- package/package.json +5 -5
- package/src/data_contract/errors/invalid_data_contract.rs +21 -0
- package/src/data_contract/state_transition/data_contract_create_transition/apply.rs +44 -0
- package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +107 -6
- package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +24 -0
- package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +44 -0
- package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +147 -0
- package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +46 -0
- package/src/data_contract/state_transition/mod.rs +2 -0
- package/src/data_contract_factory/data_contract_factory.rs +27 -12
- package/src/document/errors/document_already_exists_error.rs +1 -1
- package/src/document/errors/document_not_provided_error.rs +1 -1
- package/src/document/errors/invalid_document_action_error.rs +1 -1
- package/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +5 -5
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +4 -4
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +36 -0
- package/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +20 -0
- package/src/errors/consensus/basic/document/mod.rs +4 -0
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +2 -2
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +2 -2
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +2 -2
- package/src/errors/consensus/basic/json_schema_error.rs +1 -1
- package/src/errors/consensus/state/data_contract/data_trigger/data_trigger_condition_error.rs +1 -1
- package/src/errors/consensus/state/data_contract/data_trigger/data_trigger_execution_error.rs +1 -1
- package/src/errors/consensus/state/data_contract/data_trigger/data_trigger_invalid_result_error.rs +1 -1
- package/src/errors/consensus_error.rs +15 -8
- package/src/errors/from.rs +1 -1
- package/src/errors/mod.rs +1 -0
- package/src/errors/protocol_error.rs +12 -0
- package/src/{identifier.rs → identifier/mod.rs} +0 -0
- package/src/{identity_facade.rs → identity/identity_facade.rs} +1 -1
- package/src/{identity_public_key → identity/identity_public_key}/key_type.rs +0 -0
- package/src/{identity_public_key → identity/identity_public_key}/mod.rs +0 -3
- package/src/{identity_public_key → identity/identity_public_key}/purpose.rs +0 -0
- package/src/{identity_public_key → identity/identity_public_key}/security_level.rs +0 -0
- package/src/{identity.rs → identity/mod.rs} +6 -7
- package/src/identity/validation/mod.rs +3 -0
- package/src/identity/validation/public_keys_validator.rs +70 -0
- package/src/lib.rs +4 -8
- package/src/state_repository.rs +229 -0
- package/src/state_transition/mod.rs +41 -0
- package/src/utils.rs +2 -2
- package/src/validation/mod.rs +3 -0
- package/src/{validation_result.rs → validation/validation_result.rs} +0 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +1 -1
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +79 -114
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +0 -11
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +1 -1
- package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +135 -0
- package/test/unit/dataContract/DataContract.spec.js +5 -9
- package/test/unit/dataContract/DataContractFactory.spec.js +13 -6
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +11 -3
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +17 -64
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +28 -22
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +49 -42
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +23 -59
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +27 -23
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +29 -12
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +66 -49
- package/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +73 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +1 -1
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +1 -1
- package/test/unit/identity/IdentityPublicKey.spec.js +25 -31
- package/tsconfig.json +1 -1
- package/wasm/wasm_dpp.d.ts +503 -262
- package/wasm/wasm_dpp.js +925 -310
- package/wasm/wasm_dpp_bg.js +1 -1
- package/wasm/wasm_dpp_bg.wasm +0 -0
- package/wasm/wasm_dpp_bg.wasm.d.ts +273 -225
- package/webpack.config.js +1 -1
- package/src/identity_public_key/public_keys_validator.rs +0 -44
- package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +0 -32
- package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +0 -93
- package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +0 -64
|
@@ -1,47 +1,51 @@
|
|
|
1
|
-
const DataContractUpdateTransition = require(
|
|
2
|
-
'@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition',
|
|
3
|
-
);
|
|
4
|
-
|
|
5
1
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
2
|
+
const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion');
|
|
6
3
|
|
|
7
|
-
const
|
|
8
|
-
'@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory',
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
|
|
12
|
-
const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
|
|
4
|
+
const { default: loadWasmDpp } = require('../../../../../dist');
|
|
13
5
|
|
|
14
6
|
describe('applyDataContractUpdateTransitionFactory', () => {
|
|
15
7
|
let stateTransition;
|
|
16
8
|
let dataContract;
|
|
17
|
-
let stateRepositoryMock;
|
|
18
|
-
let applyDataContractUpdateTransition;
|
|
19
9
|
let executionContext;
|
|
10
|
+
let dataContractStored;
|
|
11
|
+
let factory;
|
|
12
|
+
let DataContractUpdateTransition;
|
|
13
|
+
let ApplyDataContractUpdateTransition;
|
|
14
|
+
let StateTransitionExecutionContext;
|
|
15
|
+
|
|
16
|
+
before(async () => {
|
|
17
|
+
({
|
|
18
|
+
DataContractUpdateTransition,
|
|
19
|
+
ApplyDataContractUpdateTransition,
|
|
20
|
+
StateTransitionExecutionContext,
|
|
21
|
+
} = await loadWasmDpp());
|
|
22
|
+
});
|
|
20
23
|
|
|
21
|
-
beforeEach(
|
|
24
|
+
beforeEach(() => {
|
|
22
25
|
dataContract = getDataContractFixture();
|
|
23
26
|
|
|
24
27
|
stateTransition = new DataContractUpdateTransition({
|
|
25
28
|
dataContract: dataContract.toObject(),
|
|
29
|
+
protocolVersion: protocolVersion.latestVersion,
|
|
26
30
|
});
|
|
27
31
|
|
|
28
32
|
executionContext = new StateTransitionExecutionContext();
|
|
29
33
|
|
|
30
34
|
stateTransition.setExecutionContext(executionContext);
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
const stateRepositoryLike = {
|
|
37
|
+
storeDataContract: () => {
|
|
38
|
+
dataContractStored = true;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
33
41
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
42
|
+
factory = new ApplyDataContractUpdateTransition(stateRepositoryLike);
|
|
43
|
+
|
|
44
|
+
dataContractStored = false;
|
|
37
45
|
});
|
|
38
46
|
|
|
39
47
|
it('should store a data contract from state transition in the repository', async () => {
|
|
40
|
-
await applyDataContractUpdateTransition(stateTransition);
|
|
41
|
-
|
|
42
|
-
expect(stateRepositoryMock.updateDataContract).to.have.been.calledOnceWithExactly(
|
|
43
|
-
stateTransition.getDataContract(),
|
|
44
|
-
executionContext,
|
|
45
|
-
);
|
|
48
|
+
await factory.applyDataContractUpdateTransition(stateTransition);
|
|
49
|
+
expect(dataContractStored).to.be.true();
|
|
46
50
|
});
|
|
47
51
|
});
|
|
@@ -1,13 +1,23 @@
|
|
|
1
|
-
const validateIndicesAreBackwardCompatible = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible');
|
|
2
|
-
const DataContractHaveNewIndexWithOldPropertiesError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractInvalidIndexDefinitionUpdateError');
|
|
3
|
-
const DataContractHaveNewUniqueIndexError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractHaveNewUniqueIndexError');
|
|
4
|
-
const DataContractIndicesChangedError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DataContractUniqueIndicesChangedError');
|
|
5
1
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
6
|
-
|
|
2
|
+
|
|
3
|
+
const { default: loadWasmDpp } = require('../../../../../../../dist');
|
|
7
4
|
|
|
8
5
|
describe('validateIndicesAreBackwardCompatible', () => {
|
|
9
6
|
let oldDocumentsSchema;
|
|
10
7
|
let newDocumentsSchema;
|
|
8
|
+
let validateIndicesAreBackwardCompatible;
|
|
9
|
+
let DataContractUniqueIndicesChangedError;
|
|
10
|
+
let DataContractInvalidIndexDefinitionUpdateError;
|
|
11
|
+
let DataContractHaveNewUniqueIndexError;
|
|
12
|
+
|
|
13
|
+
before(async () => {
|
|
14
|
+
({
|
|
15
|
+
validateIndicesAreBackwardCompatible,
|
|
16
|
+
DataContractUniqueIndicesChangedError,
|
|
17
|
+
DataContractInvalidIndexDefinitionUpdateError,
|
|
18
|
+
DataContractHaveNewUniqueIndexError,
|
|
19
|
+
} = await loadWasmDpp());
|
|
20
|
+
});
|
|
11
21
|
|
|
12
22
|
beforeEach(() => {
|
|
13
23
|
const oldDataContract = getDataContractFixture();
|
|
@@ -37,20 +47,19 @@ describe('validateIndicesAreBackwardCompatible', () => {
|
|
|
37
47
|
});
|
|
38
48
|
|
|
39
49
|
it('should return invalid result if some of unique indices have changed', async () => {
|
|
40
|
-
newDocumentsSchema.indexedDocument.indices[0].properties[
|
|
41
|
-
|
|
50
|
+
newDocumentsSchema.indexedDocument.indices[0].properties[1].firstName = 'desc';
|
|
42
51
|
const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
|
|
43
52
|
|
|
44
53
|
expect(result.isValid()).to.be.false();
|
|
45
54
|
|
|
46
55
|
const error = result.getErrors()[0];
|
|
47
56
|
|
|
48
|
-
expect(error).to.be.an.instanceOf(
|
|
57
|
+
expect(error).to.be.an.instanceOf(DataContractUniqueIndicesChangedError);
|
|
49
58
|
expect(error.getIndexName()).to.equal(newDocumentsSchema.indexedDocument.indices[0].name);
|
|
50
59
|
});
|
|
51
60
|
|
|
52
61
|
it('should return invalid result if non-unique index update failed due to changed old properties', async () => {
|
|
53
|
-
newDocumentsSchema.indexedDocument.indices[2].properties[0]
|
|
62
|
+
newDocumentsSchema.indexedDocument.indices[2].properties[0].lastName = 'desc';
|
|
54
63
|
|
|
55
64
|
const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
|
|
56
65
|
|
|
@@ -63,7 +72,14 @@ describe('validateIndicesAreBackwardCompatible', () => {
|
|
|
63
72
|
});
|
|
64
73
|
|
|
65
74
|
it('should return invalid result if non-unique index update failed due old properties used', async () => {
|
|
66
|
-
newDocumentsSchema.indexedDocument.indices
|
|
75
|
+
newDocumentsSchema.indexedDocument.indices.push({
|
|
76
|
+
name: 'oldFieldIndex',
|
|
77
|
+
properties: [
|
|
78
|
+
{
|
|
79
|
+
otherProperty: 'asc',
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
});
|
|
67
83
|
|
|
68
84
|
const result = validateIndicesAreBackwardCompatible(oldDocumentsSchema, newDocumentsSchema);
|
|
69
85
|
|
|
@@ -72,7 +88,7 @@ describe('validateIndicesAreBackwardCompatible', () => {
|
|
|
72
88
|
const error = result.getErrors()[0];
|
|
73
89
|
|
|
74
90
|
expect(error).to.be.an.instanceOf(DataContractInvalidIndexDefinitionUpdateError);
|
|
75
|
-
expect(error.getIndexName()).to.equal(
|
|
91
|
+
expect(error.getIndexName()).to.equal('oldFieldIndex');
|
|
76
92
|
});
|
|
77
93
|
|
|
78
94
|
it('should return invalid result if one of new indices contains old properties in the wrong order', async () => {
|
|
@@ -90,7 +106,8 @@ describe('validateIndicesAreBackwardCompatible', () => {
|
|
|
90
106
|
|
|
91
107
|
const error = result.getErrors()[0];
|
|
92
108
|
|
|
93
|
-
|
|
109
|
+
// TODO
|
|
110
|
+
// expect(error).to.be.an.instanceOf(DataContractHaveNewIndexWithOldPropertiesError);
|
|
94
111
|
expect(error.getIndexName()).to.equal('index_other');
|
|
95
112
|
});
|
|
96
113
|
|
|
@@ -1,27 +1,36 @@
|
|
|
1
|
-
const validateDataContractUpdateTransitionStateFactory = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory');
|
|
2
|
-
const DataContractUpdateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition');
|
|
3
|
-
|
|
4
|
-
const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
|
|
5
1
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
2
|
+
const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion');
|
|
6
3
|
|
|
7
|
-
const {
|
|
8
|
-
|
|
9
|
-
const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
|
|
10
|
-
|
|
11
|
-
const DataContractNotPresentError = require('@dashevo/dpp/lib/errors/consensus/basic/document/DataContractNotPresentError');
|
|
12
|
-
const InvalidDataContractVersionError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/InvalidDataContractVersionError');
|
|
13
|
-
const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
|
|
4
|
+
const { default: loadWasmDpp } = require('../../../../../../../dist');
|
|
14
5
|
|
|
15
6
|
describe('validateDataContractUpdateTransitionStateFactory', () => {
|
|
16
7
|
let validateDataContractUpdateTransitionState;
|
|
17
8
|
let dataContract;
|
|
18
9
|
let stateTransition;
|
|
19
|
-
let stateRepositoryMock;
|
|
20
10
|
let executionContext;
|
|
11
|
+
let DataContractUpdateTransition;
|
|
12
|
+
let StateTransitionExecutionContext;
|
|
13
|
+
let DataContractFactory;
|
|
14
|
+
let DataContractValidator;
|
|
15
|
+
let validateTransitionWithExistingContract;
|
|
16
|
+
let DataContractNotPresentError;
|
|
17
|
+
let InvalidDataContractVersionError;
|
|
18
|
+
let ValidationResult;
|
|
19
|
+
|
|
20
|
+
before(async () => {
|
|
21
|
+
({
|
|
22
|
+
DataContractUpdateTransition,
|
|
23
|
+
StateTransitionExecutionContext,
|
|
24
|
+
validateDataContractUpdateTransitionState,
|
|
25
|
+
ValidationResult,
|
|
26
|
+
DataContractFactory,
|
|
27
|
+
DataContractValidator,
|
|
28
|
+
DataContractNotPresentError,
|
|
29
|
+
InvalidDataContractVersionError,
|
|
30
|
+
} = await loadWasmDpp());
|
|
31
|
+
});
|
|
21
32
|
|
|
22
|
-
beforeEach(
|
|
23
|
-
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
24
|
-
|
|
33
|
+
beforeEach(async () => {
|
|
25
34
|
dataContract = getDataContractFixture();
|
|
26
35
|
|
|
27
36
|
const updatedRawDataContract = dataContract.toObject();
|
|
@@ -30,82 +39,90 @@ describe('validateDataContractUpdateTransitionStateFactory', () => {
|
|
|
30
39
|
|
|
31
40
|
stateTransition = new DataContractUpdateTransition({
|
|
32
41
|
dataContract: updatedRawDataContract,
|
|
42
|
+
protocolVersion: protocolVersion.latestVersion,
|
|
33
43
|
});
|
|
34
44
|
|
|
35
45
|
executionContext = new StateTransitionExecutionContext();
|
|
36
46
|
|
|
37
47
|
stateTransition.setExecutionContext(executionContext);
|
|
38
48
|
|
|
39
|
-
|
|
49
|
+
const validator = new DataContractValidator();
|
|
50
|
+
const dataContractFactory = new DataContractFactory(protocolVersion.latestVersion, validator);
|
|
51
|
+
const wasmDataContract = await dataContractFactory.createFromBuffer(dataContract.toBuffer());
|
|
52
|
+
|
|
53
|
+
const stateRepositoryLike = {
|
|
54
|
+
fetchDataContract: () => wasmDataContract,
|
|
55
|
+
};
|
|
40
56
|
|
|
41
|
-
|
|
42
|
-
|
|
57
|
+
validateTransitionWithExistingContract = (t) => validateDataContractUpdateTransitionState(
|
|
58
|
+
stateRepositoryLike,
|
|
59
|
+
t,
|
|
43
60
|
);
|
|
44
61
|
});
|
|
45
62
|
|
|
46
63
|
it('should return invalid result if Data Contract with specified contractId was not found', async () => {
|
|
47
|
-
|
|
64
|
+
const stateRepositoryLikeNoDataContract = {
|
|
65
|
+
fetchDataContract: () => undefined,
|
|
66
|
+
};
|
|
48
67
|
|
|
49
|
-
const
|
|
68
|
+
const validateTransitionWithNoContract = (t) => validateDataContractUpdateTransitionState(
|
|
69
|
+
stateRepositoryLikeNoDataContract,
|
|
70
|
+
t,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const result = await validateTransitionWithNoContract(stateTransition);
|
|
50
74
|
|
|
51
|
-
|
|
75
|
+
expect(result.isValid()).to.be.false();
|
|
52
76
|
|
|
53
77
|
const [error] = result.getErrors();
|
|
54
78
|
|
|
79
|
+
expect(error).to.be.an.instanceOf(DataContractNotPresentError);
|
|
55
80
|
expect(error.getCode()).to.equal(1018);
|
|
56
|
-
expect(Buffer.isBuffer(error.getDataContractId())).to.be.true();
|
|
57
81
|
expect(error.getDataContractId()).to.deep.equal(dataContract.getId().toBuffer());
|
|
58
|
-
|
|
59
|
-
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
60
|
-
dataContract.getId(),
|
|
61
|
-
executionContext,
|
|
62
|
-
);
|
|
63
82
|
});
|
|
64
83
|
|
|
65
84
|
it('should return invalid result if Data Contract version is not larger by 1', async () => {
|
|
66
|
-
dataContract.
|
|
85
|
+
const badlyUpdatedRawDataContract = dataContract.toObject();
|
|
86
|
+
badlyUpdatedRawDataContract.version += 2;
|
|
67
87
|
|
|
68
|
-
const
|
|
88
|
+
const badStateTransition = new DataContractUpdateTransition({
|
|
89
|
+
dataContract: badlyUpdatedRawDataContract,
|
|
90
|
+
protocolVersion: protocolVersion.latestVersion,
|
|
91
|
+
});
|
|
69
92
|
|
|
70
|
-
|
|
93
|
+
const result = await validateTransitionWithExistingContract(badStateTransition);
|
|
71
94
|
|
|
72
|
-
|
|
95
|
+
expect(result.isValid()).to.be.false();
|
|
73
96
|
|
|
97
|
+
const [error] = result.getErrors();
|
|
98
|
+
expect(error).to.be.an.instanceOf(InvalidDataContractVersionError);
|
|
74
99
|
expect(error.getCode()).to.equal(1050);
|
|
75
|
-
|
|
76
|
-
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
77
|
-
dataContract.getId(),
|
|
78
|
-
executionContext,
|
|
79
|
-
);
|
|
80
100
|
});
|
|
81
101
|
|
|
82
102
|
it('should return valid result', async () => {
|
|
83
|
-
const result = await
|
|
103
|
+
const result = await validateTransitionWithExistingContract(stateTransition);
|
|
84
104
|
|
|
85
105
|
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
86
106
|
expect(result.isValid()).to.be.true();
|
|
87
|
-
|
|
88
|
-
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
89
|
-
dataContract.getId(),
|
|
90
|
-
executionContext,
|
|
91
|
-
);
|
|
92
107
|
});
|
|
93
108
|
|
|
94
109
|
it('should return valid result on dry run', async () => {
|
|
95
|
-
|
|
110
|
+
const stateRepositoryLikeNoDataContract = {
|
|
111
|
+
fetchDataContract: () => undefined,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const validateTransitionWithNoContract = (t) => validateDataContractUpdateTransitionState(
|
|
115
|
+
stateRepositoryLikeNoDataContract,
|
|
116
|
+
t,
|
|
117
|
+
);
|
|
96
118
|
|
|
97
119
|
executionContext.enableDryRun();
|
|
98
120
|
|
|
99
|
-
const result = await
|
|
121
|
+
const result = await validateTransitionWithNoContract(stateTransition);
|
|
100
122
|
|
|
101
123
|
executionContext.disableDryRun();
|
|
102
124
|
|
|
103
125
|
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
104
126
|
expect(result.isValid()).to.be.true();
|
|
105
|
-
|
|
106
|
-
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
107
|
-
dataContract.getId(),
|
|
108
|
-
executionContext,
|
|
109
|
-
);
|
|
110
127
|
});
|
|
111
128
|
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
2
|
+
|
|
3
|
+
const { default: loadWasmDpp } = require('../../../../dist');
|
|
4
|
+
|
|
5
|
+
describe('validateDataContractPatterns', () => {
|
|
6
|
+
let DataContractValidator;
|
|
7
|
+
let IncompatibleRe2PatternError;
|
|
8
|
+
|
|
9
|
+
before(async () => {
|
|
10
|
+
({
|
|
11
|
+
DataContractValidator,
|
|
12
|
+
IncompatibleRe2PatternError,
|
|
13
|
+
} = await loadWasmDpp());
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should return valid result', () => {
|
|
17
|
+
const rawDataContract = getDataContractFixture().toObject();
|
|
18
|
+
delete rawDataContract.$defs;
|
|
19
|
+
|
|
20
|
+
const schema = {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
foo: { type: 'integer' },
|
|
24
|
+
bar: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
pattern: '([a-z]+)+$',
|
|
27
|
+
maxLength: 1337,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['foo'],
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
rawDataContract.documents.totallyFineDocument = schema;
|
|
35
|
+
|
|
36
|
+
const validator = new DataContractValidator();
|
|
37
|
+
|
|
38
|
+
const result = validator.validate(rawDataContract);
|
|
39
|
+
expect(result.isValid()).to.be.true();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should return invalid result on incompatible pattern', () => {
|
|
43
|
+
const rawDataContract = getDataContractFixture().toObject();
|
|
44
|
+
delete rawDataContract.$defs;
|
|
45
|
+
|
|
46
|
+
const schema = {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
foo: { type: 'integer' },
|
|
50
|
+
bar: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
pattern: '^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$',
|
|
53
|
+
maxLength: 1337,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ['foo'],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
rawDataContract.documents.notFineDocument = schema;
|
|
61
|
+
|
|
62
|
+
const validator = new DataContractValidator();
|
|
63
|
+
|
|
64
|
+
const result = validator.validate(rawDataContract);
|
|
65
|
+
|
|
66
|
+
const [error] = result.getErrors();
|
|
67
|
+
|
|
68
|
+
expect(error).to.be.instanceOf(IncompatibleRe2PatternError);
|
|
69
|
+
expect(error.getCode()).to.equal(1009);
|
|
70
|
+
expect(error.getPattern()).to.equal('^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$');
|
|
71
|
+
expect(error.getPath()).to.equal('/documents/notFineDocument/properties/bar');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -66,7 +66,7 @@ describe('applyDocumentsBatchTransitionFactory', () => {
|
|
|
66
66
|
|
|
67
67
|
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
68
68
|
stateRepositoryMock.fetchDataContract.resolves(dataContract);
|
|
69
|
-
stateRepositoryMock.fetchLatestPlatformBlockTime.
|
|
69
|
+
stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTimeMs);
|
|
70
70
|
|
|
71
71
|
fetchDocumentsMock = this.sinonSandbox.stub();
|
|
72
72
|
fetchDocumentsMock.resolves([
|
|
@@ -68,7 +68,7 @@ describe('validateDocumentsBatchTransitionStateFactory', () => {
|
|
|
68
68
|
|
|
69
69
|
blockTime = Date.now();
|
|
70
70
|
|
|
71
|
-
stateRepositoryMock.fetchLatestPlatformBlockTime.
|
|
71
|
+
stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTime);
|
|
72
72
|
|
|
73
73
|
fetchDocumentsMock = this.sinonSandbox.stub().resolves([]);
|
|
74
74
|
|
|
@@ -4,24 +4,18 @@ describe('IdentityPublicKey', () => {
|
|
|
4
4
|
let rawPublicKey;
|
|
5
5
|
let publicKey;
|
|
6
6
|
let IdentityPublicKey;
|
|
7
|
-
let KeyPurpose;
|
|
8
|
-
let KeyType;
|
|
9
|
-
let KeySecurityLevel;
|
|
10
7
|
|
|
11
8
|
beforeEach(async () => {
|
|
12
|
-
({
|
|
13
|
-
IdentityPublicKey, KeyPurpose, KeyType, KeySecurityLevel,
|
|
14
|
-
} = await loadWasmDpp());
|
|
9
|
+
({ IdentityPublicKey } = await loadWasmDpp());
|
|
15
10
|
|
|
16
11
|
rawPublicKey = {
|
|
17
12
|
id: 0,
|
|
18
|
-
type:
|
|
13
|
+
type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
|
|
19
14
|
data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'),
|
|
20
|
-
purpose:
|
|
21
|
-
securityLevel:
|
|
15
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
16
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
22
17
|
readOnly: false,
|
|
23
18
|
};
|
|
24
|
-
|
|
25
19
|
publicKey = new IdentityPublicKey(rawPublicKey);
|
|
26
20
|
});
|
|
27
21
|
|
|
@@ -89,9 +83,9 @@ describe('IdentityPublicKey', () => {
|
|
|
89
83
|
|
|
90
84
|
describe('#setPurpose', () => {
|
|
91
85
|
it('should set data', () => {
|
|
92
|
-
publicKey.setPurpose(
|
|
86
|
+
publicKey.setPurpose(IdentityPublicKey.PURPOSES.DECRYPTION);
|
|
93
87
|
|
|
94
|
-
expect(publicKey.getPurpose()).to.equal(
|
|
88
|
+
expect(publicKey.getPurpose()).to.equal(IdentityPublicKey.PURPOSES.DECRYPTION);
|
|
95
89
|
});
|
|
96
90
|
});
|
|
97
91
|
|
|
@@ -103,9 +97,9 @@ describe('IdentityPublicKey', () => {
|
|
|
103
97
|
|
|
104
98
|
describe('#setSecurityLevel', () => {
|
|
105
99
|
it('should set data', () => {
|
|
106
|
-
publicKey.setSecurityLevel(
|
|
100
|
+
publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM);
|
|
107
101
|
|
|
108
|
-
expect(publicKey.getSecurityLevel()).to.equal(
|
|
102
|
+
expect(publicKey.getSecurityLevel()).to.equal(IdentityPublicKey.SECURITY_LEVELS.MEDIUM);
|
|
109
103
|
});
|
|
110
104
|
});
|
|
111
105
|
|
|
@@ -151,10 +145,10 @@ describe('IdentityPublicKey', () => {
|
|
|
151
145
|
it('should return data in case ECDSA_HASH160', () => {
|
|
152
146
|
rawPublicKey = {
|
|
153
147
|
id: 0,
|
|
154
|
-
type:
|
|
148
|
+
type: IdentityPublicKey.TYPES.ECDSA_HASH160,
|
|
155
149
|
data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'),
|
|
156
|
-
purpose:
|
|
157
|
-
securityLevel:
|
|
150
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
151
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
158
152
|
readOnly: false,
|
|
159
153
|
disabledAt: 123,
|
|
160
154
|
};
|
|
@@ -171,10 +165,10 @@ describe('IdentityPublicKey', () => {
|
|
|
171
165
|
it('should return original public key hash in case BLS12_381', () => {
|
|
172
166
|
rawPublicKey = {
|
|
173
167
|
id: 0,
|
|
174
|
-
type:
|
|
168
|
+
type: IdentityPublicKey.TYPES.BLS12_381,
|
|
175
169
|
data: Buffer.from('01fac99ca2c8f39c286717c213e190aba4b7af76db320ec43f479b7d9a2012313a0ae59ca576edf801444bc694686694', 'hex'),
|
|
176
|
-
purpose:
|
|
177
|
-
securityLevel:
|
|
170
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
171
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
178
172
|
readOnly: false,
|
|
179
173
|
disabledAt: 123,
|
|
180
174
|
};
|
|
@@ -191,10 +185,10 @@ describe('IdentityPublicKey', () => {
|
|
|
191
185
|
it('should return data in case BIP13_SCRIPT_HASH', () => {
|
|
192
186
|
rawPublicKey = {
|
|
193
187
|
id: 0,
|
|
194
|
-
type:
|
|
188
|
+
type: IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH,
|
|
195
189
|
data: Buffer.from('54c557e07dde5bb6cb791c7a540e0a4796f5e97e', 'hex'),
|
|
196
|
-
purpose:
|
|
197
|
-
securityLevel:
|
|
190
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
191
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
198
192
|
readOnly: false,
|
|
199
193
|
disabledAt: 123,
|
|
200
194
|
};
|
|
@@ -215,10 +209,10 @@ describe('IdentityPublicKey', () => {
|
|
|
215
209
|
|
|
216
210
|
expect(jsonPublicKey).to.deep.equal({
|
|
217
211
|
id: 0,
|
|
218
|
-
type:
|
|
212
|
+
type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
|
|
219
213
|
data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH',
|
|
220
|
-
purpose:
|
|
221
|
-
securityLevel:
|
|
214
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
215
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
222
216
|
readOnly: false,
|
|
223
217
|
});
|
|
224
218
|
});
|
|
@@ -230,10 +224,10 @@ describe('IdentityPublicKey', () => {
|
|
|
230
224
|
|
|
231
225
|
expect(jsonPublicKey).to.deep.equal({
|
|
232
226
|
id: 0,
|
|
233
|
-
type:
|
|
227
|
+
type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
|
|
234
228
|
data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH',
|
|
235
|
-
purpose:
|
|
236
|
-
securityLevel:
|
|
229
|
+
purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
|
|
230
|
+
securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
|
|
237
231
|
readOnly: false,
|
|
238
232
|
disabledAt: 42,
|
|
239
233
|
});
|
|
@@ -242,7 +236,7 @@ describe('IdentityPublicKey', () => {
|
|
|
242
236
|
|
|
243
237
|
describe('#isMaster', () => {
|
|
244
238
|
it('should return true when public key has MASTER security level', () => {
|
|
245
|
-
publicKey.setSecurityLevel(
|
|
239
|
+
publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER);
|
|
246
240
|
|
|
247
241
|
const result = publicKey.isMaster();
|
|
248
242
|
|
|
@@ -250,7 +244,7 @@ describe('IdentityPublicKey', () => {
|
|
|
250
244
|
});
|
|
251
245
|
|
|
252
246
|
it('should return false when public key doesn\'t have MASTER security level', () => {
|
|
253
|
-
publicKey.setSecurityLevel(
|
|
247
|
+
publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.HIGH);
|
|
254
248
|
|
|
255
249
|
const result = publicKey.isMaster();
|
|
256
250
|
|