@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,274 @@
1
+ const { PublicKey } = require('@dashevo/dashcore-lib');
2
+ const Identity = require('../../../lib/identity/Identity');
3
+ const IdentityCreateTransition = require('../../../lib/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition');
4
+ const IdentityTopUpTransition = require('../../../lib/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition');
5
+
6
+ const getIdentityFixture = require('../../../lib/test/fixtures/getIdentityFixture');
7
+
8
+ const ValidationResult = require('../../../lib/validation/ValidationResult');
9
+ const SerializedObjectParsingError = require('../../../lib/errors/consensus/basic/decode/SerializedObjectParsingError');
10
+
11
+ const InvalidIdentityError = require(
12
+ '../../../lib/identity/errors/InvalidIdentityError',
13
+ );
14
+ const getInstantAssetLockProofFixture = require('../../../lib/test/fixtures/getInstantAssetLockProofFixture');
15
+ const InstantAssetLockProof = require('../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof');
16
+ const getChainAssetLockProofFixture = require('../../../lib/test/fixtures/getChainAssetLockProofFixture');
17
+ const createDPPMock = require('../../../lib/test/mocks/createDPPMock');
18
+ const SomeConsensusError = require('../../../lib/test/mocks/SomeConsensusError');
19
+ const IdentityFactory = require('../../../lib/identity/IdentityFactory');
20
+ const IdentityUpdateTransition = require('../../../lib/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition');
21
+ const IdentityPublicKey = require('../../../lib/identity/IdentityPublicKey');
22
+
23
+ describe('IdentityFactory', () => {
24
+ let factory;
25
+ let validateIdentityMock;
26
+ let decodeProtocolEntityMock;
27
+ let identity;
28
+ let instantAssetLockProof;
29
+ let chainAssetLockProof;
30
+ let dppMock;
31
+ let fakeTime;
32
+
33
+ beforeEach(function beforeEach() {
34
+ validateIdentityMock = this.sinonSandbox.stub();
35
+ decodeProtocolEntityMock = this.sinonSandbox.stub();
36
+
37
+ instantAssetLockProof = getInstantAssetLockProofFixture();
38
+ chainAssetLockProof = getChainAssetLockProofFixture();
39
+
40
+ dppMock = createDPPMock();
41
+
42
+ factory = new IdentityFactory(
43
+ dppMock,
44
+ validateIdentityMock,
45
+ decodeProtocolEntityMock,
46
+ );
47
+
48
+ identity = getIdentityFixture();
49
+ identity.id = instantAssetLockProof.createIdentifier();
50
+ identity.setAssetLockProof(instantAssetLockProof);
51
+ identity.setBalance(0);
52
+
53
+ fakeTime = this.sinonSandbox.useFakeTimers(new Date());
54
+ });
55
+
56
+ afterEach(() => {
57
+ fakeTime.reset();
58
+ });
59
+
60
+ describe('#constructor', () => {
61
+ it('should set validator', () => {
62
+ expect(factory.validateIdentity).to.equal(validateIdentityMock);
63
+ });
64
+ });
65
+
66
+ describe('#create', () => {
67
+ it('should create Identity from asset lock transaction, output index, proof and public keys', () => {
68
+ const publicKeys = identity
69
+ .getPublicKeys()
70
+ .map((identityPublicKey) => ({
71
+ ...identityPublicKey.toObject(),
72
+ key: new PublicKey(identityPublicKey.getData()),
73
+ readonly: true,
74
+ }));
75
+
76
+ const result = factory.create(
77
+ instantAssetLockProof,
78
+ publicKeys,
79
+ );
80
+
81
+ expect(result).to.be.an.instanceOf(Identity);
82
+ expect(result.toObject()).to.deep.equal(identity.toObject());
83
+ });
84
+ });
85
+
86
+ describe('#createFromObject', () => {
87
+ it('should skip validation if options is set', () => {
88
+ factory.createFromObject({}, { skipValidation: true });
89
+
90
+ expect(validateIdentityMock).to.have.not.been.called();
91
+ });
92
+
93
+ it('should throw an error if validation have failed', () => {
94
+ const errors = [new SomeConsensusError('error')];
95
+
96
+ validateIdentityMock.returns(new ValidationResult(errors));
97
+
98
+ try {
99
+ factory.createFromObject(identity.toObject());
100
+
101
+ expect.fail('error was not thrown');
102
+ } catch (e) {
103
+ expect(e).to.be.an.instanceOf(InvalidIdentityError);
104
+ expect(e.getErrors()).to.have.deep.members(errors);
105
+ expect(e.getRawIdentity()).to.deep.equal(identity.toObject());
106
+ }
107
+ });
108
+
109
+ it('should create an identity if validation passed', () => {
110
+ validateIdentityMock.returns(new ValidationResult());
111
+
112
+ const result = factory.createFromObject(identity.toObject());
113
+
114
+ expect(result).to.be.an.instanceOf(Identity);
115
+ expect(result.toObject()).to.deep.equal(identity.toObject());
116
+ });
117
+ });
118
+
119
+ describe('#createFromBuffer', () => {
120
+ let serializedIdentity;
121
+ let rawIdentity;
122
+
123
+ beforeEach(function beforeEach() {
124
+ this.sinonSandbox.stub(factory, 'createFromObject');
125
+
126
+ serializedIdentity = identity.toBuffer();
127
+ rawIdentity = identity.toObject();
128
+ });
129
+
130
+ afterEach(() => {
131
+ factory.createFromObject.restore();
132
+ });
133
+
134
+ it('should return new Identity from serialized one', () => {
135
+ decodeProtocolEntityMock.returns([rawIdentity.protocolVersion, rawIdentity]);
136
+
137
+ factory.createFromObject.returns(identity);
138
+
139
+ const result = factory.createFromBuffer(serializedIdentity);
140
+
141
+ expect(result).to.equal(identity);
142
+
143
+ expect(factory.createFromObject).to.have.been.calledOnceWith(rawIdentity);
144
+
145
+ expect(decodeProtocolEntityMock).to.have.been.calledOnceWithExactly(
146
+ serializedIdentity,
147
+ );
148
+ });
149
+
150
+ it('should throw InvalidIdentityError if the decoding fails with consensus error', () => {
151
+ const parsingError = new SerializedObjectParsingError(
152
+ serializedIdentity,
153
+ new Error(),
154
+ );
155
+
156
+ decodeProtocolEntityMock.throws(parsingError);
157
+
158
+ try {
159
+ factory.createFromBuffer(serializedIdentity);
160
+
161
+ expect.fail('should throw InvalidIdentityError');
162
+ } catch (e) {
163
+ expect(e).to.be.an.instanceOf(InvalidIdentityError);
164
+
165
+ const [innerError] = e.getErrors();
166
+ expect(innerError).to.equal(parsingError);
167
+ }
168
+ });
169
+
170
+ it('should throw an error if decoding fails with any other error', () => {
171
+ const parsingError = new Error('Something failed during parsing');
172
+
173
+ decodeProtocolEntityMock.throws(parsingError);
174
+
175
+ try {
176
+ factory.createFromBuffer(serializedIdentity);
177
+
178
+ expect.fail('should throw an error');
179
+ } catch (e) {
180
+ expect(e).to.equal(parsingError);
181
+ }
182
+ });
183
+ });
184
+
185
+ describe('#createInstantAssetLockProof', () => {
186
+ it('should create instant asset lock proof from InstantLock', () => {
187
+ const instantLock = instantAssetLockProof.getInstantLock();
188
+ const assetLockTransaction = instantAssetLockProof.getTransaction();
189
+ const outputIndex = instantAssetLockProof.getOutputIndex();
190
+
191
+ const result = factory.createInstantAssetLockProof(
192
+ instantLock,
193
+ assetLockTransaction,
194
+ outputIndex,
195
+ );
196
+
197
+ expect(result).to.be.instanceOf(InstantAssetLockProof);
198
+ expect(result.getInstantLock()).to.deep.equal(instantLock);
199
+ });
200
+ });
201
+
202
+ describe('#createIdentityCreateTransition', () => {
203
+ it('should create IdentityCreateTransition from Identity model', () => {
204
+ const stateTransition = factory.createIdentityCreateTransition(identity);
205
+
206
+ expect(stateTransition).to.be.instanceOf(IdentityCreateTransition);
207
+ expect(stateTransition.getPublicKeys()).to.deep.equal(identity.getPublicKeys());
208
+ expect(stateTransition.getAssetLockProof().toObject())
209
+ .to.deep.equal(instantAssetLockProof.toObject());
210
+ });
211
+ });
212
+
213
+ describe('createChainAssetLockProof', () => {
214
+ it('should create IdentityCreateTransition from Identity model', () => {
215
+ identity = getIdentityFixture();
216
+ identity.id = chainAssetLockProof.createIdentifier();
217
+ identity.setAssetLockProof(chainAssetLockProof);
218
+ identity.setBalance(0);
219
+
220
+ const stateTransition = factory.createIdentityCreateTransition(identity);
221
+
222
+ expect(stateTransition).to.be.instanceOf(IdentityCreateTransition);
223
+ expect(stateTransition.getPublicKeys()).deep.to.equal(identity.getPublicKeys());
224
+ expect(stateTransition.getAssetLockProof().toObject())
225
+ .to.deep.equal(chainAssetLockProof.toObject());
226
+ });
227
+ });
228
+
229
+ describe('#createIdentityTopUpTransition', () => {
230
+ it('should create IdentityTopUpTransition from identity id and outpoint', () => {
231
+ const stateTransition = factory
232
+ .createIdentityTopUpTransition(
233
+ identity.getId(),
234
+ instantAssetLockProof,
235
+ );
236
+
237
+ expect(stateTransition).to.be.instanceOf(IdentityTopUpTransition);
238
+ expect(stateTransition.getIdentityId()).to.deep.equal(identity.getId());
239
+ expect(stateTransition.getAssetLockProof().toObject())
240
+ .to.deep.equal(instantAssetLockProof.toObject());
241
+ });
242
+ });
243
+
244
+ describe('createIdentityUpdateTransition', () => {
245
+ it('should create IdentityUpdateTransition', () => {
246
+ const revision = 1;
247
+ const disablePublicKeys = [identity.getPublicKeyById(0)];
248
+ const addPublicKeys = [new IdentityPublicKey({
249
+ id: 0,
250
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
251
+ data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'),
252
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
253
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
254
+ readOnly: false,
255
+ })];
256
+
257
+ const stateTransition = factory
258
+ .createIdentityUpdateTransition(
259
+ identity,
260
+ {
261
+ add: addPublicKeys,
262
+ disable: disablePublicKeys,
263
+ },
264
+ );
265
+
266
+ expect(stateTransition).to.be.instanceOf(IdentityUpdateTransition);
267
+ expect(stateTransition.getIdentityId()).to.deep.equal(identity.getId());
268
+ expect(stateTransition.getRevision()).to.deep.equal(revision);
269
+ expect(stateTransition.getPublicKeysToAdd()).to.deep.equal(addPublicKeys);
270
+ expect(stateTransition.getPublicKeyIdsToDisable()).to.deep.equal([0]);
271
+ expect(stateTransition.getPublicKeysDisabledAt()).to.deep.equal(new Date());
272
+ });
273
+ });
274
+ });
@@ -0,0 +1,273 @@
1
+ const IdentityPublicKey = require('../../../lib/identity/IdentityPublicKey');
2
+ const EmptyPublicKeyDataError = require('../../../lib/identity/errors/EmptyPublicKeyDataError');
3
+
4
+ describe('IdentityPublicKey', () => {
5
+ let rawPublicKey;
6
+ let publicKey;
7
+
8
+ beforeEach(() => {
9
+ rawPublicKey = {
10
+ id: 0,
11
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
12
+ data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'),
13
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
14
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
15
+ readOnly: false,
16
+ };
17
+
18
+ publicKey = new IdentityPublicKey(rawPublicKey);
19
+ });
20
+
21
+ describe('#constructor', () => {
22
+ it('should not set anything if nothing passed', () => {
23
+ const instance = new IdentityPublicKey();
24
+
25
+ expect(instance.id).to.be.undefined();
26
+ expect(instance.type).to.be.undefined();
27
+ expect(instance.data).to.be.undefined();
28
+ });
29
+
30
+ it('should set variables from raw model', () => {
31
+ const instance = new IdentityPublicKey(rawPublicKey);
32
+
33
+ expect(instance.id).to.equal(rawPublicKey.id);
34
+ expect(instance.type).to.equal(rawPublicKey.type);
35
+ expect(instance.data).to.equal(rawPublicKey.data);
36
+ });
37
+ });
38
+
39
+ describe('#getId', () => {
40
+ it('should return set id', () => {
41
+ expect(publicKey.getId()).to.equal(rawPublicKey.id);
42
+ });
43
+ });
44
+
45
+ describe('#setId', () => {
46
+ it('should set id', () => {
47
+ publicKey.setId(42);
48
+
49
+ expect(publicKey.id).to.equal(42);
50
+ });
51
+ });
52
+
53
+ describe('#getType', () => {
54
+ it('should return set type', () => {
55
+ publicKey.type = 42;
56
+
57
+ expect(publicKey.getType()).to.equal(42);
58
+ });
59
+ });
60
+
61
+ describe('#setType', () => {
62
+ it('should set type', () => {
63
+ publicKey.setType(42);
64
+
65
+ expect(publicKey.type).to.equal(42);
66
+ });
67
+ });
68
+
69
+ describe('#getData', () => {
70
+ it('should return set data', () => {
71
+ expect(publicKey.getData()).to.equal(rawPublicKey.data);
72
+ });
73
+ });
74
+
75
+ describe('#setData', () => {
76
+ it('should set data', () => {
77
+ const buffer = Buffer.alloc(36);
78
+
79
+ publicKey.setData(buffer);
80
+
81
+ expect(publicKey.data).to.equal(buffer);
82
+ });
83
+ });
84
+
85
+ describe('#getPurpose', () => {
86
+ it('should return set data', () => {
87
+ expect(publicKey.getPurpose()).to.equal(rawPublicKey.purpose);
88
+ });
89
+ });
90
+
91
+ describe('#setPurpose', () => {
92
+ it('should set data', () => {
93
+ publicKey.setPurpose(IdentityPublicKey.PURPOSES.DECRYPTION);
94
+
95
+ expect(publicKey.purpose).to.equal(IdentityPublicKey.PURPOSES.DECRYPTION);
96
+ });
97
+ });
98
+
99
+ describe('#getSecurityLevel', () => {
100
+ it('should return set data', () => {
101
+ expect(publicKey.getSecurityLevel()).to.equal(rawPublicKey.securityLevel);
102
+ });
103
+ });
104
+
105
+ describe('#setSecurityLevel', () => {
106
+ it('should set data', () => {
107
+ publicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM);
108
+
109
+ expect(publicKey.securityLevel).to.equal(IdentityPublicKey.SECURITY_LEVELS.MEDIUM);
110
+ });
111
+ });
112
+
113
+ describe('#isReadOnly', () => {
114
+ it('should return readOnly', () => {
115
+ expect(publicKey.isReadOnly()).to.equal(rawPublicKey.readOnly);
116
+ });
117
+ });
118
+
119
+ describe('#setReadOnly', () => {
120
+ it('should set readOnly', () => {
121
+ publicKey.setReadOnly(true);
122
+
123
+ expect(publicKey.readOnly).to.equal(true);
124
+ });
125
+ });
126
+
127
+ describe('#setDisabledAt', () => {
128
+ it('should set disabledAt', () => {
129
+ publicKey.setDisabledAt(123);
130
+
131
+ expect(publicKey.disabledAt).to.equal(123);
132
+ });
133
+ });
134
+
135
+ describe('#getDisabledAt', () => {
136
+ it('should return disabledAt', () => {
137
+ publicKey.disabledAt = 42;
138
+
139
+ expect(publicKey.getDisabledAt()).to.equal(42);
140
+ });
141
+ });
142
+
143
+ describe('#hash', () => {
144
+ it('should return original public key hash', () => {
145
+ const result = publicKey.hash();
146
+
147
+ const expectedHash = Buffer.from('Q/5mfilFPdZt+Fr5JWC1+tg0cPs=', 'base64');
148
+
149
+ expect(result).to.deep.equal(expectedHash);
150
+ });
151
+
152
+ it('should return data in case ECDSA_HASH160', () => {
153
+ rawPublicKey = {
154
+ id: 0,
155
+ type: IdentityPublicKey.TYPES.ECDSA_HASH160,
156
+ data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'),
157
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
158
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
159
+ };
160
+
161
+ publicKey = new IdentityPublicKey(rawPublicKey);
162
+
163
+ const result = publicKey.hash();
164
+
165
+ const expectedHash = Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64');
166
+
167
+ expect(result).to.deep.equal(expectedHash);
168
+ });
169
+
170
+ it('should return original public key hash in case BLS12_381', () => {
171
+ rawPublicKey = {
172
+ id: 0,
173
+ type: IdentityPublicKey.TYPES.BLS12_381,
174
+ data: Buffer.from('01fac99ca2c8f39c286717c213e190aba4b7af76db320ec43f479b7d9a2012313a0ae59ca576edf801444bc694686694', 'hex'),
175
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
176
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
177
+ };
178
+
179
+ publicKey = new IdentityPublicKey(rawPublicKey);
180
+
181
+ const result = publicKey.hash();
182
+
183
+ const expectedHash = Buffer.from('1de31a0a328e8822f9cb2c25141d7d80baee26ef', 'hex');
184
+
185
+ expect(result).to.deep.equal(expectedHash);
186
+ });
187
+
188
+ it('should return data in case BIP13_SCRIPT_HASH', () => {
189
+ rawPublicKey = {
190
+ id: 0,
191
+ type: IdentityPublicKey.TYPES.BIP13_SCRIPT_HASH,
192
+ data: Buffer.from('54c557e07dde5bb6cb791c7a540e0a4796f5e97e', 'hex'),
193
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
194
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
195
+ };
196
+
197
+ publicKey = new IdentityPublicKey(rawPublicKey);
198
+
199
+ const result = publicKey.hash();
200
+
201
+ const expectedHash = Buffer.from('54c557e07dde5bb6cb791c7a540e0a4796f5e97e', 'hex');
202
+
203
+ expect(result).to.deep.equal(expectedHash);
204
+ });
205
+
206
+ it('should throw invalid argument error if data was not originally provided', async () => {
207
+ publicKey = new IdentityPublicKey({
208
+ id: 0,
209
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
210
+ });
211
+
212
+ try {
213
+ publicKey.hash();
214
+
215
+ expect.fail('Error was not thrown');
216
+ } catch (e) {
217
+ expect(e).to.be.an.instanceOf(EmptyPublicKeyDataError);
218
+ expect(e.message).to.equal(
219
+ 'Public key data is not set',
220
+ );
221
+ }
222
+ });
223
+ });
224
+
225
+ describe('#toJSON', () => {
226
+ it('should return JSON representation', () => {
227
+ const jsonPublicKey = publicKey.toJSON();
228
+
229
+ expect(jsonPublicKey).to.deep.equal({
230
+ id: 0,
231
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
232
+ data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH',
233
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
234
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
235
+ readOnly: false,
236
+ });
237
+ });
238
+
239
+ it('should return JSON representation with optional properties', () => {
240
+ publicKey.setDisabledAt(42);
241
+
242
+ const jsonPublicKey = publicKey.toJSON();
243
+
244
+ expect(jsonPublicKey).to.deep.equal({
245
+ id: 0,
246
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
247
+ data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH',
248
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
249
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
250
+ readOnly: false,
251
+ disabledAt: 42,
252
+ });
253
+ });
254
+ });
255
+
256
+ describe('#isMaster', () => {
257
+ it('should return true when public key has MASTER security level', () => {
258
+ publicKey.securityLevel = IdentityPublicKey.SECURITY_LEVELS.MASTER;
259
+
260
+ const result = publicKey.isMaster();
261
+
262
+ expect(result).to.be.true();
263
+ });
264
+
265
+ it('should return false when public key doesn\'t have MASTER security level', () => {
266
+ publicKey.securityLevel = IdentityPublicKey.SECURITY_LEVELS.HIGH;
267
+
268
+ const result = publicKey.isMaster();
269
+
270
+ expect(result).to.be.false();
271
+ });
272
+ });
273
+ });
@@ -0,0 +1,34 @@
1
+ const {
2
+ convertSatoshiToCredits,
3
+ convertCreditsToSatoshi,
4
+ RATIO,
5
+ } = require('../../../lib/identity/creditsConverter');
6
+
7
+ describe('creditsConverter', () => {
8
+ describe('convertSatoshiToCredits', () => {
9
+ it('should convert satoshi to credits', () => {
10
+ const amount = 42;
11
+
12
+ const convertedAmount = convertSatoshiToCredits(amount);
13
+
14
+ expect(convertedAmount).to.equal(amount * RATIO);
15
+ });
16
+ });
17
+ describe('convertCreditsToSatoshi', () => {
18
+ it('should convert credits to satoshi', () => {
19
+ const amount = 10000;
20
+
21
+ const convertedAmount = convertCreditsToSatoshi(amount);
22
+
23
+ expect(convertedAmount).to.equal(Math.floor(amount / RATIO));
24
+ });
25
+
26
+ it('should convert credits to 0 satoshi if amount < RATIO', () => {
27
+ const amount = RATIO - 1;
28
+
29
+ const convertedAmount = convertCreditsToSatoshi(amount);
30
+
31
+ expect(convertedAmount).to.equal(0);
32
+ });
33
+ });
34
+ });
@@ -0,0 +1,46 @@
1
+ const InvalidIdentityError = require('../../../../lib/identity/errors/InvalidIdentityError');
2
+ const getIdentityFixture = require('../../../../lib/test/fixtures/getIdentityFixture');
3
+
4
+ describe('InvalidIdentityError', () => {
5
+ let rawIdentity;
6
+ let error;
7
+
8
+ beforeEach(() => {
9
+ error = new Error('Some error');
10
+
11
+ const identity = getIdentityFixture();
12
+ rawIdentity = identity.toObject();
13
+ });
14
+
15
+ it('should return errors', () => {
16
+ const errors = [error];
17
+
18
+ const invalidIdentityError = new InvalidIdentityError(errors, rawIdentity);
19
+
20
+ expect(invalidIdentityError.getErrors()).to.deep.equal(errors);
21
+ });
22
+
23
+ it('should return Identity', async () => {
24
+ const errors = [error];
25
+
26
+ const invalidIdentityError = new InvalidIdentityError(errors, rawIdentity);
27
+
28
+ expect(invalidIdentityError.getRawIdentity()).to.deep.equal(rawIdentity);
29
+ });
30
+
31
+ it('should contain message for 1 error', async () => {
32
+ const errors = [error];
33
+
34
+ const invalidIdentityError = new InvalidIdentityError(errors, rawIdentity);
35
+
36
+ expect(invalidIdentityError.message).to.equal(`Invalid Identity: "${error.message}"`);
37
+ });
38
+
39
+ it('should contain message for multiple errors', async () => {
40
+ const errors = [error, error];
41
+
42
+ const invalidIdentityError = new InvalidIdentityError(errors, rawIdentity);
43
+
44
+ expect(invalidIdentityError.message).to.equal(`Invalid Identity: "${error.message}" and 1 more`);
45
+ });
46
+ });