@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,184 @@
1
+ const IdentityPublicKey = require('../../../../../lib/identity/IdentityPublicKey');
2
+
3
+ const stateTransitionTypes = require(
4
+ '../../../../../lib/stateTransition/stateTransitionTypes',
5
+ );
6
+
7
+ const protocolVersion = require('../../../../../lib/version/protocolVersion');
8
+ const IdentityCreateTransition = require('../../../../../lib/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition');
9
+ const Identifier = require('../../../../../lib/identifier/Identifier');
10
+
11
+ const getIdentityCreateTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture');
12
+ const InstantAssetLockProof = require('../../../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof');
13
+
14
+ describe('IdentityCreateTransition', () => {
15
+ let rawStateTransition;
16
+ let stateTransition;
17
+
18
+ beforeEach(() => {
19
+ stateTransition = getIdentityCreateTransitionFixture();
20
+ rawStateTransition = stateTransition.toObject();
21
+ });
22
+
23
+ describe('#constructor', () => {
24
+ it('should create an instance with specified data', () => {
25
+ expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal(
26
+ rawStateTransition.assetLockProof,
27
+ );
28
+
29
+ expect(stateTransition.publicKeys).to.deep.equal([
30
+ new IdentityPublicKey(rawStateTransition.publicKeys[0]),
31
+ ]);
32
+ });
33
+ });
34
+
35
+ describe('#getType', () => {
36
+ it('should return IDENTITY_CREATE type', () => {
37
+ expect(stateTransition.getType()).to.equal(stateTransitionTypes.IDENTITY_CREATE);
38
+ });
39
+ });
40
+
41
+ describe('#setAssetLockProof', () => {
42
+ it('should set asset lock proof', () => {
43
+ stateTransition.setAssetLockProof(
44
+ new InstantAssetLockProof(rawStateTransition.assetLockProof),
45
+ );
46
+
47
+ expect(stateTransition.assetLockProof.toObject())
48
+ .to.deep.equal(rawStateTransition.assetLockProof);
49
+ });
50
+
51
+ it('should set `identityId`', () => {
52
+ stateTransition.setAssetLockProof(
53
+ new InstantAssetLockProof(rawStateTransition.assetLockProof),
54
+ );
55
+
56
+ expect(stateTransition.identityId).to.deep.equal(
57
+ stateTransition.getAssetLockProof().createIdentifier(),
58
+ );
59
+ });
60
+ });
61
+
62
+ describe('#getAssetLockProof', () => {
63
+ it('should return currently set locked OutPoint', () => {
64
+ expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal(
65
+ rawStateTransition.assetLockProof,
66
+ );
67
+ });
68
+ });
69
+
70
+ describe('#setPublicKeys', () => {
71
+ it('should set public keys', () => {
72
+ const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()];
73
+
74
+ stateTransition.setPublicKeys(publicKeys);
75
+
76
+ expect(stateTransition.publicKeys).to.have.deep.members(publicKeys);
77
+ });
78
+ });
79
+
80
+ describe('#getPublicKeys', () => {
81
+ it('should return set public keys', () => {
82
+ expect(stateTransition.getPublicKeys()).to.deep.equal(
83
+ rawStateTransition.publicKeys.map((rawPublicKey) => new IdentityPublicKey(rawPublicKey)),
84
+ );
85
+ });
86
+ });
87
+
88
+ describe('#addPublicKeys', () => {
89
+ it('should add more public keys', () => {
90
+ const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()];
91
+
92
+ stateTransition.publicKeys = [];
93
+ stateTransition.addPublicKeys(publicKeys);
94
+ expect(stateTransition.getPublicKeys()).to.have.deep.members(publicKeys);
95
+ });
96
+ });
97
+
98
+ describe('#getIdentityId', () => {
99
+ it('should return identity id', () => {
100
+ expect(stateTransition.getIdentityId()).to.deep.equal(
101
+ stateTransition.getAssetLockProof().createIdentifier(),
102
+ );
103
+ });
104
+ });
105
+
106
+ describe('#getOwnerId', () => {
107
+ it('should return owner id', () => {
108
+ expect(stateTransition.getOwnerId()).to.equal(
109
+ stateTransition.getIdentityId(),
110
+ );
111
+ });
112
+ });
113
+
114
+ describe('#toObject', () => {
115
+ it('should return raw state transition', () => {
116
+ rawStateTransition = stateTransition.toObject();
117
+
118
+ expect(rawStateTransition).to.deep.equal({
119
+ protocolVersion: protocolVersion.latestVersion,
120
+ type: stateTransitionTypes.IDENTITY_CREATE,
121
+ assetLockProof: rawStateTransition.assetLockProof,
122
+ publicKeys: rawStateTransition.publicKeys,
123
+ signature: undefined,
124
+ });
125
+ });
126
+
127
+ it('should return raw state transition without signature', () => {
128
+ rawStateTransition = stateTransition.toObject({ skipSignature: true });
129
+
130
+ expect(rawStateTransition).to.deep.equal({
131
+ protocolVersion: protocolVersion.latestVersion,
132
+ type: stateTransitionTypes.IDENTITY_CREATE,
133
+ assetLockProof: rawStateTransition.assetLockProof,
134
+ publicKeys: rawStateTransition.publicKeys,
135
+ });
136
+ });
137
+ });
138
+
139
+ describe('#toJSON', () => {
140
+ it('should return JSON representation of state transition', () => {
141
+ const jsonStateTransition = stateTransition.toJSON();
142
+
143
+ expect(jsonStateTransition).to.deep.equal({
144
+ protocolVersion: protocolVersion.latestVersion,
145
+ type: stateTransitionTypes.IDENTITY_CREATE,
146
+ assetLockProof: stateTransition.getAssetLockProof().toJSON(),
147
+ publicKeys: stateTransition.getPublicKeys().map((k) => k.toJSON()),
148
+ signature: undefined,
149
+ });
150
+ });
151
+ });
152
+
153
+ describe('#getModifiedDataIds', () => {
154
+ it('should return ids of created identities', () => {
155
+ const result = stateTransition.getModifiedDataIds();
156
+
157
+ expect(result.length).to.be.equal(1);
158
+ const identityId = result[0];
159
+
160
+ expect(identityId).to.be.an.instanceOf(Identifier);
161
+ expect(identityId).to.be.deep.equal(
162
+ new IdentityCreateTransition(rawStateTransition).getIdentityId(),
163
+ );
164
+ });
165
+ });
166
+
167
+ describe('#isDataContractStateTransition', () => {
168
+ it('should return false', () => {
169
+ expect(stateTransition.isDataContractStateTransition()).to.be.false();
170
+ });
171
+ });
172
+
173
+ describe('#isDocumentStateTransition', () => {
174
+ it('should return false', () => {
175
+ expect(stateTransition.isDocumentStateTransition()).to.be.false();
176
+ });
177
+ });
178
+
179
+ describe('#isIdentityStateTransition', () => {
180
+ it('should return true', () => {
181
+ expect(stateTransition.isIdentityStateTransition()).to.be.true();
182
+ });
183
+ });
184
+ });
@@ -0,0 +1,90 @@
1
+ const Identity = require('../../../../../lib/identity/Identity');
2
+
3
+ const applyIdentityCreateTransitionFactory = require(
4
+ '../../../../../lib/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory',
5
+ );
6
+
7
+ const getIdentityCreateTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture');
8
+
9
+ const { convertSatoshiToCredits } = require('../../../../../lib/identity/creditsConverter');
10
+
11
+ const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock');
12
+
13
+ const protocolVersion = require('../../../../../lib/version/protocolVersion');
14
+ const StateTransitionExecutionContext = require('../../../../../lib/stateTransition/StateTransitionExecutionContext');
15
+ const ReadOperation = require('../../../../../lib/stateTransition/fee/operations/ReadOperation');
16
+
17
+ describe('applyIdentityCreateTransitionFactory', () => {
18
+ let stateTransition;
19
+ let applyIdentityCreateTransition;
20
+ let stateRepositoryMock;
21
+ let fetchAssetLockTransactionOutputMock;
22
+ let output;
23
+ let executionContext;
24
+
25
+ beforeEach(function beforeEach() {
26
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
27
+
28
+ stateTransition = getIdentityCreateTransitionFixture();
29
+
30
+ executionContext = new StateTransitionExecutionContext();
31
+
32
+ stateTransition.setExecutionContext(executionContext);
33
+
34
+ output = stateTransition.getAssetLockProof().getOutput();
35
+
36
+ fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output);
37
+
38
+ applyIdentityCreateTransition = applyIdentityCreateTransitionFactory(
39
+ stateRepositoryMock,
40
+ fetchAssetLockTransactionOutputMock,
41
+ );
42
+ });
43
+
44
+ it('should store identity created from state transition', async () => {
45
+ executionContext.addOperation(
46
+ new ReadOperation(1),
47
+ );
48
+
49
+ await applyIdentityCreateTransition(stateTransition);
50
+
51
+ const balance = convertSatoshiToCredits(
52
+ output.satoshis,
53
+ );
54
+
55
+ const identity = new Identity({
56
+ protocolVersion: protocolVersion.latestVersion,
57
+ id: stateTransition.getIdentityId(),
58
+ publicKeys: stateTransition.getPublicKeys().map((key) => key.toObject()),
59
+ balance,
60
+ revision: 0,
61
+ });
62
+
63
+ expect(stateRepositoryMock.createIdentity).to.have.been.calledOnceWithExactly(
64
+ identity,
65
+ executionContext,
66
+ );
67
+
68
+ const publicKeyHashes = identity
69
+ .getPublicKeys()
70
+ .map((publicKey) => publicKey.hash());
71
+
72
+ expect(stateRepositoryMock.storeIdentityPublicKeyHashes).to.have.been.calledOnceWithExactly(
73
+ identity.getId(),
74
+ publicKeyHashes,
75
+ executionContext,
76
+ );
77
+
78
+ expect(stateRepositoryMock.markAssetLockTransactionOutPointAsUsed).to.have.been
79
+ .calledOnceWithExactly(
80
+ stateTransition.getAssetLockProof().getOutPoint(),
81
+ executionContext,
82
+ );
83
+
84
+ expect(fetchAssetLockTransactionOutputMock)
85
+ .to.be.calledOnceWithExactly(
86
+ stateTransition.getAssetLockProof(),
87
+ executionContext,
88
+ );
89
+ });
90
+ });
@@ -0,0 +1,71 @@
1
+ const { expectValidationError } = require(
2
+ '../../../../../../../lib/test/expect/expectError',
3
+ );
4
+
5
+ const validateIdentityCreateTransitionStateFactory = require(
6
+ '../../../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory',
7
+ );
8
+
9
+ const getIdentityCreateTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture');
10
+
11
+ const IdentityAlreadyExistsError = require(
12
+ '../../../../../../../lib/errors/consensus/state/identity/IdentityAlreadyExistsError',
13
+ );
14
+
15
+ const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock');
16
+ const IdentityPublicKey = require('../../../../../../../lib/identity/IdentityPublicKey');
17
+
18
+ describe('validateIdentityCreateTransitionStateFactory', () => {
19
+ let validateIdentityCreateTransitionState;
20
+ let stateTransition;
21
+ let stateRepositoryMock;
22
+
23
+ beforeEach(async function beforeEach() {
24
+ const privateKey = 'af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837';
25
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
26
+
27
+ validateIdentityCreateTransitionState = validateIdentityCreateTransitionStateFactory(
28
+ stateRepositoryMock,
29
+ );
30
+
31
+ stateTransition = getIdentityCreateTransitionFixture();
32
+
33
+ await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1);
34
+
35
+ const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000';
36
+
37
+ stateRepositoryMock.fetchTransaction.resolves(rawTransaction);
38
+ });
39
+
40
+ it('should return invalid result if identity already exists', async () => {
41
+ stateRepositoryMock.fetchIdentity.resolves({});
42
+
43
+ const result = await validateIdentityCreateTransitionState(stateTransition);
44
+
45
+ expectValidationError(result, IdentityAlreadyExistsError, 1);
46
+
47
+ const [error] = result.getErrors();
48
+
49
+ expect(error.getCode()).to.equal(4011);
50
+ expect(Buffer.isBuffer(error.getIdentityId())).to.be.true();
51
+ expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId());
52
+ });
53
+
54
+ it('should return valid result if state transition is valid', async () => {
55
+ const result = await validateIdentityCreateTransitionState(stateTransition);
56
+
57
+ expect(result.isValid()).to.be.true();
58
+ });
59
+
60
+ it('should return valid result on dry run', async () => {
61
+ stateRepositoryMock.fetchIdentity.resolves({});
62
+
63
+ stateTransition.getExecutionContext().enableDryRun();
64
+
65
+ const result = await validateIdentityCreateTransitionState(stateTransition);
66
+
67
+ stateTransition.getExecutionContext().disableDryRun();
68
+
69
+ expect(result.isValid()).to.be.true();
70
+ });
71
+ });
@@ -0,0 +1,137 @@
1
+ const stateTransitionTypes = require(
2
+ '../../../../../lib/stateTransition/stateTransitionTypes',
3
+ );
4
+
5
+ const Identifier = require('../../../../../lib/identifier/Identifier');
6
+
7
+ const getIdentityTopUpTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture');
8
+
9
+ const protocolVersion = require('../../../../../lib/version/protocolVersion');
10
+
11
+ describe('IdentityTopUpTransition', () => {
12
+ let rawStateTransition;
13
+ let stateTransition;
14
+
15
+ beforeEach(() => {
16
+ stateTransition = getIdentityTopUpTransitionFixture();
17
+ rawStateTransition = stateTransition.toObject();
18
+ });
19
+
20
+ describe('#constructor', () => {
21
+ it('should create an instance with specified data from specified raw transition', () => {
22
+ expect(stateTransition.getAssetLockProof().toObject()).to.be.deep.equal(
23
+ rawStateTransition.assetLockProof,
24
+ );
25
+ expect(stateTransition.getIdentityId()).to.be.deep.equal(
26
+ rawStateTransition.identityId,
27
+ );
28
+ });
29
+ });
30
+
31
+ describe('#getType', () => {
32
+ it('should return IDENTITY_TOP_UP type', () => {
33
+ expect(stateTransition.getType()).to.equal(stateTransitionTypes.IDENTITY_TOP_UP);
34
+ });
35
+ });
36
+
37
+ describe('#setAssetLockProof', () => {
38
+ it('should set asset lock proof', () => {
39
+ stateTransition.setAssetLockProof(rawStateTransition.assetLockProof);
40
+
41
+ expect(stateTransition.assetLockProof).to.deep.equal(rawStateTransition.assetLockProof);
42
+ });
43
+ });
44
+
45
+ describe('#getAssetLock', () => {
46
+ it('should return currently set asset lock proof', () => {
47
+ expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal(
48
+ rawStateTransition.assetLockProof,
49
+ );
50
+ });
51
+ });
52
+
53
+ describe('#getIdentityId', () => {
54
+ it('should return identity id', () => {
55
+ expect(stateTransition.getIdentityId()).to.deep.equal(
56
+ rawStateTransition.identityId,
57
+ );
58
+ });
59
+ });
60
+
61
+ describe('#getOwnerId', () => {
62
+ it('should return owner id', () => {
63
+ expect(stateTransition.getOwnerId()).to.deep.equal(
64
+ rawStateTransition.identityId,
65
+ );
66
+ });
67
+ });
68
+
69
+ describe('#toObject', () => {
70
+ it('should return raw state transition', () => {
71
+ rawStateTransition = stateTransition.toObject();
72
+
73
+ expect(rawStateTransition).to.deep.equal({
74
+ protocolVersion: protocolVersion.latestVersion,
75
+ type: stateTransitionTypes.IDENTITY_TOP_UP,
76
+ assetLockProof: rawStateTransition.assetLockProof,
77
+ identityId: rawStateTransition.identityId,
78
+ signature: undefined,
79
+ });
80
+ });
81
+
82
+ it('should return raw state transition', () => {
83
+ rawStateTransition = stateTransition.toObject({ skipSignature: true });
84
+
85
+ expect(rawStateTransition).to.deep.equal({
86
+ protocolVersion: protocolVersion.latestVersion,
87
+ type: stateTransitionTypes.IDENTITY_TOP_UP,
88
+ assetLockProof: rawStateTransition.assetLockProof,
89
+ identityId: rawStateTransition.identityId,
90
+ });
91
+ });
92
+ });
93
+
94
+ describe('#toJSON', () => {
95
+ it('should return JSON representation of state transition', () => {
96
+ const jsonStateTransition = stateTransition.toJSON();
97
+
98
+ expect(jsonStateTransition).to.deep.equal({
99
+ protocolVersion: protocolVersion.latestVersion,
100
+ type: stateTransitionTypes.IDENTITY_TOP_UP,
101
+ assetLockProof: stateTransition.getAssetLockProof().toJSON(),
102
+ identityId: Identifier(rawStateTransition.identityId).toString(),
103
+ signature: undefined,
104
+ });
105
+ });
106
+ });
107
+
108
+ describe('#getModifiedDataIds', () => {
109
+ it('should return ids of topped up identity', () => {
110
+ const result = stateTransition.getModifiedDataIds();
111
+
112
+ expect(result.length).to.be.equal(1);
113
+ const identityId = result[0];
114
+
115
+ expect(identityId).to.be.an.instanceOf(Identifier);
116
+ expect(identityId).to.be.deep.equal(rawStateTransition.identityId);
117
+ });
118
+ });
119
+
120
+ describe('#isDataContractStateTransition', () => {
121
+ it('should return false', () => {
122
+ expect(stateTransition.isDataContractStateTransition()).to.be.false();
123
+ });
124
+ });
125
+
126
+ describe('#isDocumentStateTransition', () => {
127
+ it('should return false', () => {
128
+ expect(stateTransition.isDocumentStateTransition()).to.be.false();
129
+ });
130
+ });
131
+
132
+ describe('#isIdentityStateTransition', () => {
133
+ it('should return true', () => {
134
+ expect(stateTransition.isIdentityStateTransition()).to.be.true();
135
+ });
136
+ });
137
+ });
@@ -0,0 +1,108 @@
1
+ const applyIdentityTopUpTransitionFactory = require(
2
+ '../../../../../lib/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory',
3
+ );
4
+
5
+ const getIdentityFixture = require('../../../../../lib/test/fixtures/getIdentityFixture');
6
+ const getIdentityTopUpTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture');
7
+
8
+ const { convertSatoshiToCredits } = require('../../../../../lib/identity/creditsConverter');
9
+
10
+ const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock');
11
+ const StateTransitionExecutionContext = require('../../../../../lib/stateTransition/StateTransitionExecutionContext');
12
+ const getBiggestPossibleIdentity = require('../../../../../lib/identity/getBiggestPossibleIdentity');
13
+
14
+ describe('applyIdentityTopUpTransitionFactory', () => {
15
+ let stateTransition;
16
+ let applyIdentityTopUpTransition;
17
+ let stateRepositoryMock;
18
+ let identity;
19
+ let fetchAssetLockTransactionOutputMock;
20
+ let executionContext;
21
+
22
+ beforeEach(function beforeEach() {
23
+ identity = getIdentityFixture();
24
+
25
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
26
+ stateRepositoryMock.fetchIdentity.resolves(identity);
27
+
28
+ stateTransition = getIdentityTopUpTransitionFixture();
29
+
30
+ executionContext = new StateTransitionExecutionContext();
31
+
32
+ stateTransition.setExecutionContext(executionContext);
33
+
34
+ const output = stateTransition.getAssetLockProof().getOutput();
35
+
36
+ fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output);
37
+
38
+ applyIdentityTopUpTransition = applyIdentityTopUpTransitionFactory(
39
+ stateRepositoryMock,
40
+ fetchAssetLockTransactionOutputMock,
41
+ );
42
+ });
43
+
44
+ it('should store identity created from state transition', async () => {
45
+ const balanceBeforeTopUp = identity.getBalance();
46
+
47
+ const balanceToTopUp = convertSatoshiToCredits(
48
+ stateTransition.getAssetLockProof().getOutput().satoshis,
49
+ );
50
+
51
+ await applyIdentityTopUpTransition(stateTransition);
52
+
53
+ expect(identity.getBalance()).to.be.equal(balanceBeforeTopUp + balanceToTopUp);
54
+ expect(identity.getBalance()).to.be.greaterThan(balanceBeforeTopUp);
55
+
56
+ expect(stateRepositoryMock.updateIdentity).to.have.been.calledOnceWithExactly(
57
+ identity,
58
+ executionContext,
59
+ );
60
+
61
+ expect(stateRepositoryMock.markAssetLockTransactionOutPointAsUsed).to.have.been
62
+ .calledOnceWithExactly(
63
+ stateTransition.getAssetLockProof().getOutPoint(),
64
+ executionContext,
65
+ );
66
+
67
+ expect(fetchAssetLockTransactionOutputMock)
68
+ .to.be.calledOnceWithExactly(
69
+ stateTransition.getAssetLockProof(),
70
+ executionContext,
71
+ );
72
+ });
73
+
74
+ it('should store biggest possible identity on dry run', async () => {
75
+ const biggestPossibleIdentity = getBiggestPossibleIdentity();
76
+
77
+ const balanceBeforeTopUp = biggestPossibleIdentity.getBalance();
78
+
79
+ const balanceToTopUp = convertSatoshiToCredits(
80
+ stateTransition.getAssetLockProof().getOutput().satoshis,
81
+ );
82
+
83
+ executionContext.enableDryRun();
84
+
85
+ await applyIdentityTopUpTransition(stateTransition);
86
+
87
+ executionContext.disableDryRun();
88
+
89
+ expect(biggestPossibleIdentity.getBalance()).to.be.equal(balanceBeforeTopUp + balanceToTopUp);
90
+
91
+ expect(stateRepositoryMock.updateIdentity).to.have.been.calledOnceWithExactly(
92
+ biggestPossibleIdentity,
93
+ executionContext,
94
+ );
95
+
96
+ expect(stateRepositoryMock.markAssetLockTransactionOutPointAsUsed).to.have.been
97
+ .calledOnceWithExactly(
98
+ stateTransition.getAssetLockProof().getOutPoint(),
99
+ executionContext,
100
+ );
101
+
102
+ expect(fetchAssetLockTransactionOutputMock)
103
+ .to.be.calledOnceWithExactly(
104
+ stateTransition.getAssetLockProof(),
105
+ executionContext,
106
+ );
107
+ });
108
+ });
@@ -0,0 +1,22 @@
1
+ const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture');
2
+
3
+ const validateIdentityTopUpTransitionStateFactory = require(
4
+ '../../../../../../../lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory',
5
+ );
6
+
7
+ describe('validateIdentityTopUpTransitionStateFactory', () => {
8
+ let validateIdentityTopUpTransitionState;
9
+ let stateTransition;
10
+
11
+ beforeEach(() => {
12
+ validateIdentityTopUpTransitionState = validateIdentityTopUpTransitionStateFactory();
13
+
14
+ stateTransition = getIdentityTopUpTransitionFixture();
15
+ });
16
+
17
+ it('should return valid result', async () => {
18
+ const result = await validateIdentityTopUpTransitionState(stateTransition);
19
+
20
+ expect(result.isValid()).to.be.true();
21
+ });
22
+ });