@twin.org/immutable-proof-service 0.0.2-next.2 → 0.0.2-next.3

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.
@@ -363,15 +363,15 @@ async function immutableProofVerify(httpRequestContext, componentName, request)
363
363
  * Class for performing immutable proof operations.
364
364
  */
365
365
  class ImmutableProofService {
366
+ /**
367
+ * Runtime name for the class.
368
+ */
369
+ static CLASS_NAME = "ImmutableProofService";
366
370
  /**
367
371
  * The namespace for the service.
368
372
  * @internal
369
373
  */
370
374
  static _NAMESPACE = "immutable-proof";
371
- /**
372
- * Runtime name for the class.
373
- */
374
- CLASS_NAME = "ImmutableProofService";
375
375
  /**
376
376
  * The configuration for the connector.
377
377
  * @internal
@@ -417,7 +417,7 @@ class ImmutableProofService {
417
417
  * @param options The dependencies for the immutable proof connector.
418
418
  */
419
419
  constructor(options) {
420
- this._proofStorage = entityStorageModels.EntityStorageConnectorFactory.get(options?.immutableProofEntityStorageType ?? core.StringHelper.kebabCase("ImmutableProof"));
420
+ this._proofStorage = entityStorageModels.EntityStorageConnectorFactory.get(options?.immutableProofEntityStorageType ?? "immutable-proof");
421
421
  this._verifiableStorage = verifiableStorageModels.VerifiableStorageConnectorFactory.get(options?.verifiableStorageType ?? "verifiable-storage");
422
422
  this._identityConnectorType = options?.identityConnectorType ?? "identity";
423
423
  this._identityConnector = identityModels.IdentityConnectorFactory.get(this._identityConnectorType);
@@ -439,13 +439,13 @@ class ImmutableProofService {
439
439
  * @returns The id of the new proof.
440
440
  */
441
441
  async create(document, userIdentity, nodeIdentity) {
442
- core.Guards.object(this.CLASS_NAME, "document", document);
443
- core.Guards.stringValue(this.CLASS_NAME, "userIdentity", userIdentity);
444
- core.Guards.stringValue(this.CLASS_NAME, "nodeIdentity", nodeIdentity);
442
+ core.Guards.object(ImmutableProofService.CLASS_NAME, "document", document);
443
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "userIdentity", userIdentity);
444
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "nodeIdentity", nodeIdentity);
445
445
  try {
446
446
  const validationFailures = [];
447
447
  await dataJsonLd.JsonLdHelper.validate(document, validationFailures);
448
- core.Validation.asValidationError(this.CLASS_NAME, "document", validationFailures);
448
+ core.Validation.asValidationError(ImmutableProofService.CLASS_NAME, "document", validationFailures);
449
449
  const id = core.Converter.bytesToHex(core.RandomHelper.generate(32), false);
450
450
  const dateCreated = new Date(Date.now()).toISOString();
451
451
  const proofObjectId = core.ObjectHelper.extractProperty(document, ["@id", "id"], false);
@@ -474,7 +474,7 @@ class ImmutableProofService {
474
474
  return new core.Urn(ImmutableProofService._NAMESPACE, id).toString();
475
475
  }
476
476
  catch (error) {
477
- throw new core.GeneralError(this.CLASS_NAME, "createFailed", undefined, error);
477
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "createFailed", undefined, error);
478
478
  }
479
479
  }
480
480
  /**
@@ -484,10 +484,10 @@ class ImmutableProofService {
484
484
  * @throws NotFoundError if the proof is not found.
485
485
  */
486
486
  async get(id) {
487
- core.Guards.stringValue(this.CLASS_NAME, "id", id);
487
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
488
488
  const urnParsed = core.Urn.fromValidString(id);
489
489
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
490
- throw new core.GeneralError(this.CLASS_NAME, "namespaceMismatch", {
490
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
491
491
  namespace: ImmutableProofService._NAMESPACE,
492
492
  id
493
493
  });
@@ -497,7 +497,7 @@ class ImmutableProofService {
497
497
  return dataJsonLd.JsonLdProcessor.compact(immutableProof, immutableProof["@context"]);
498
498
  }
499
499
  catch (error) {
500
- throw new core.GeneralError(this.CLASS_NAME, "getFailed", undefined, error);
500
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "getFailed", undefined, error);
501
501
  }
502
502
  }
503
503
  /**
@@ -507,10 +507,10 @@ class ImmutableProofService {
507
507
  * @throws NotFoundError if the proof is not found.
508
508
  */
509
509
  async verify(id) {
510
- core.Guards.stringValue(this.CLASS_NAME, "id", id);
510
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
511
511
  const urnParsed = core.Urn.fromValidString(id);
512
512
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
513
- throw new core.GeneralError(this.CLASS_NAME, "namespaceMismatch", {
513
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
514
514
  namespace: ImmutableProofService._NAMESPACE,
515
515
  id
516
516
  });
@@ -525,7 +525,7 @@ class ImmutableProofService {
525
525
  };
526
526
  }
527
527
  catch (error) {
528
- throw new core.GeneralError(this.CLASS_NAME, "verifyFailed", undefined, error);
528
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "verifyFailed", undefined, error);
529
529
  }
530
530
  }
531
531
  /**
@@ -536,11 +536,11 @@ class ImmutableProofService {
536
536
  * @throws NotFoundError if the proof is not found.
537
537
  */
538
538
  async removeVerifiable(id, nodeIdentity) {
539
- core.Guards.stringValue(this.CLASS_NAME, "id", id);
540
- core.Guards.stringValue(this.CLASS_NAME, "nodeIdentity", nodeIdentity);
539
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
540
+ core.Guards.stringValue(ImmutableProofService.CLASS_NAME, "nodeIdentity", nodeIdentity);
541
541
  const urnParsed = core.Urn.fromValidString(id);
542
542
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
543
- throw new core.GeneralError(this.CLASS_NAME, "namespaceMismatch", {
543
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
544
544
  namespace: ImmutableProofService._NAMESPACE,
545
545
  id
546
546
  });
@@ -549,7 +549,7 @@ class ImmutableProofService {
549
549
  const streamId = urnParsed.namespaceSpecific(0);
550
550
  const streamEntity = await this._proofStorage.get(streamId);
551
551
  if (core.Is.empty(streamEntity)) {
552
- throw new core.NotFoundError(this.CLASS_NAME, "proofNotFound", id);
552
+ throw new core.NotFoundError(ImmutableProofService.CLASS_NAME, "proofNotFound", id);
553
553
  }
554
554
  if (core.Is.stringValue(streamEntity.verifiableStorageId)) {
555
555
  await this._verifiableStorage.remove(nodeIdentity, streamEntity.verifiableStorageId);
@@ -558,7 +558,7 @@ class ImmutableProofService {
558
558
  }
559
559
  }
560
560
  catch (error) {
561
- throw new core.GeneralError(this.CLASS_NAME, "removeVerifiableFailed", undefined, error);
561
+ throw new core.GeneralError(ImmutableProofService.CLASS_NAME, "removeVerifiableFailed", undefined, error);
562
562
  }
563
563
  }
564
564
  /**
@@ -627,7 +627,7 @@ class ImmutableProofService {
627
627
  const proofId = urnParsed.namespaceSpecific(0);
628
628
  const proofEntity = await this._proofStorage.get(proofId);
629
629
  if (core.Is.empty(proofEntity)) {
630
- throw new core.NotFoundError(this.CLASS_NAME, "proofNotFound", id);
630
+ throw new core.NotFoundError(ImmutableProofService.CLASS_NAME, "proofNotFound", id);
631
631
  }
632
632
  let proofJsonLd = this.proofEntityToJsonLd(proofEntity);
633
633
  let verified = false;
@@ -1,5 +1,5 @@
1
1
  import { property, SortDirection, entity, EntitySchemaFactory, EntitySchemaHelper } from '@twin.org/entity';
2
- import { Guards, ComponentFactory, StringHelper, Is, Validation, Converter, RandomHelper, ObjectHelper, Urn, GeneralError, NotFoundError, JsonHelper } from '@twin.org/core';
2
+ import { Guards, ComponentFactory, Is, Validation, Converter, RandomHelper, ObjectHelper, Urn, GeneralError, NotFoundError, JsonHelper } from '@twin.org/core';
3
3
  import { ImmutableProofTypes, ImmutableProofContexts, ImmutableProofFailure, ImmutableProofTopics } from '@twin.org/immutable-proof-models';
4
4
  import { DidCryptoSuites, ProofTypes, DidContexts } from '@twin.org/standards-w3c-did';
5
5
  import { HttpStatusCode, HeaderTypes, MimeTypes } from '@twin.org/web';
@@ -361,15 +361,15 @@ async function immutableProofVerify(httpRequestContext, componentName, request)
361
361
  * Class for performing immutable proof operations.
362
362
  */
363
363
  class ImmutableProofService {
364
+ /**
365
+ * Runtime name for the class.
366
+ */
367
+ static CLASS_NAME = "ImmutableProofService";
364
368
  /**
365
369
  * The namespace for the service.
366
370
  * @internal
367
371
  */
368
372
  static _NAMESPACE = "immutable-proof";
369
- /**
370
- * Runtime name for the class.
371
- */
372
- CLASS_NAME = "ImmutableProofService";
373
373
  /**
374
374
  * The configuration for the connector.
375
375
  * @internal
@@ -415,7 +415,7 @@ class ImmutableProofService {
415
415
  * @param options The dependencies for the immutable proof connector.
416
416
  */
417
417
  constructor(options) {
418
- this._proofStorage = EntityStorageConnectorFactory.get(options?.immutableProofEntityStorageType ?? StringHelper.kebabCase("ImmutableProof"));
418
+ this._proofStorage = EntityStorageConnectorFactory.get(options?.immutableProofEntityStorageType ?? "immutable-proof");
419
419
  this._verifiableStorage = VerifiableStorageConnectorFactory.get(options?.verifiableStorageType ?? "verifiable-storage");
420
420
  this._identityConnectorType = options?.identityConnectorType ?? "identity";
421
421
  this._identityConnector = IdentityConnectorFactory.get(this._identityConnectorType);
@@ -437,13 +437,13 @@ class ImmutableProofService {
437
437
  * @returns The id of the new proof.
438
438
  */
439
439
  async create(document, userIdentity, nodeIdentity) {
440
- Guards.object(this.CLASS_NAME, "document", document);
441
- Guards.stringValue(this.CLASS_NAME, "userIdentity", userIdentity);
442
- Guards.stringValue(this.CLASS_NAME, "nodeIdentity", nodeIdentity);
440
+ Guards.object(ImmutableProofService.CLASS_NAME, "document", document);
441
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "userIdentity", userIdentity);
442
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "nodeIdentity", nodeIdentity);
443
443
  try {
444
444
  const validationFailures = [];
445
445
  await JsonLdHelper.validate(document, validationFailures);
446
- Validation.asValidationError(this.CLASS_NAME, "document", validationFailures);
446
+ Validation.asValidationError(ImmutableProofService.CLASS_NAME, "document", validationFailures);
447
447
  const id = Converter.bytesToHex(RandomHelper.generate(32), false);
448
448
  const dateCreated = new Date(Date.now()).toISOString();
449
449
  const proofObjectId = ObjectHelper.extractProperty(document, ["@id", "id"], false);
@@ -472,7 +472,7 @@ class ImmutableProofService {
472
472
  return new Urn(ImmutableProofService._NAMESPACE, id).toString();
473
473
  }
474
474
  catch (error) {
475
- throw new GeneralError(this.CLASS_NAME, "createFailed", undefined, error);
475
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "createFailed", undefined, error);
476
476
  }
477
477
  }
478
478
  /**
@@ -482,10 +482,10 @@ class ImmutableProofService {
482
482
  * @throws NotFoundError if the proof is not found.
483
483
  */
484
484
  async get(id) {
485
- Guards.stringValue(this.CLASS_NAME, "id", id);
485
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
486
486
  const urnParsed = Urn.fromValidString(id);
487
487
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
488
- throw new GeneralError(this.CLASS_NAME, "namespaceMismatch", {
488
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
489
489
  namespace: ImmutableProofService._NAMESPACE,
490
490
  id
491
491
  });
@@ -495,7 +495,7 @@ class ImmutableProofService {
495
495
  return JsonLdProcessor.compact(immutableProof, immutableProof["@context"]);
496
496
  }
497
497
  catch (error) {
498
- throw new GeneralError(this.CLASS_NAME, "getFailed", undefined, error);
498
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "getFailed", undefined, error);
499
499
  }
500
500
  }
501
501
  /**
@@ -505,10 +505,10 @@ class ImmutableProofService {
505
505
  * @throws NotFoundError if the proof is not found.
506
506
  */
507
507
  async verify(id) {
508
- Guards.stringValue(this.CLASS_NAME, "id", id);
508
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
509
509
  const urnParsed = Urn.fromValidString(id);
510
510
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
511
- throw new GeneralError(this.CLASS_NAME, "namespaceMismatch", {
511
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
512
512
  namespace: ImmutableProofService._NAMESPACE,
513
513
  id
514
514
  });
@@ -523,7 +523,7 @@ class ImmutableProofService {
523
523
  };
524
524
  }
525
525
  catch (error) {
526
- throw new GeneralError(this.CLASS_NAME, "verifyFailed", undefined, error);
526
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "verifyFailed", undefined, error);
527
527
  }
528
528
  }
529
529
  /**
@@ -534,11 +534,11 @@ class ImmutableProofService {
534
534
  * @throws NotFoundError if the proof is not found.
535
535
  */
536
536
  async removeVerifiable(id, nodeIdentity) {
537
- Guards.stringValue(this.CLASS_NAME, "id", id);
538
- Guards.stringValue(this.CLASS_NAME, "nodeIdentity", nodeIdentity);
537
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "id", id);
538
+ Guards.stringValue(ImmutableProofService.CLASS_NAME, "nodeIdentity", nodeIdentity);
539
539
  const urnParsed = Urn.fromValidString(id);
540
540
  if (urnParsed.namespaceIdentifier() !== ImmutableProofService._NAMESPACE) {
541
- throw new GeneralError(this.CLASS_NAME, "namespaceMismatch", {
541
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "namespaceMismatch", {
542
542
  namespace: ImmutableProofService._NAMESPACE,
543
543
  id
544
544
  });
@@ -547,7 +547,7 @@ class ImmutableProofService {
547
547
  const streamId = urnParsed.namespaceSpecific(0);
548
548
  const streamEntity = await this._proofStorage.get(streamId);
549
549
  if (Is.empty(streamEntity)) {
550
- throw new NotFoundError(this.CLASS_NAME, "proofNotFound", id);
550
+ throw new NotFoundError(ImmutableProofService.CLASS_NAME, "proofNotFound", id);
551
551
  }
552
552
  if (Is.stringValue(streamEntity.verifiableStorageId)) {
553
553
  await this._verifiableStorage.remove(nodeIdentity, streamEntity.verifiableStorageId);
@@ -556,7 +556,7 @@ class ImmutableProofService {
556
556
  }
557
557
  }
558
558
  catch (error) {
559
- throw new GeneralError(this.CLASS_NAME, "removeVerifiableFailed", undefined, error);
559
+ throw new GeneralError(ImmutableProofService.CLASS_NAME, "removeVerifiableFailed", undefined, error);
560
560
  }
561
561
  }
562
562
  /**
@@ -625,7 +625,7 @@ class ImmutableProofService {
625
625
  const proofId = urnParsed.namespaceSpecific(0);
626
626
  const proofEntity = await this._proofStorage.get(proofId);
627
627
  if (Is.empty(proofEntity)) {
628
- throw new NotFoundError(this.CLASS_NAME, "proofNotFound", id);
628
+ throw new NotFoundError(ImmutableProofService.CLASS_NAME, "proofNotFound", id);
629
629
  }
630
630
  let proofJsonLd = this.proofEntityToJsonLd(proofEntity);
631
631
  let verified = false;
@@ -8,7 +8,7 @@ export declare class ImmutableProofService implements IImmutableProofComponent {
8
8
  /**
9
9
  * Runtime name for the class.
10
10
  */
11
- readonly CLASS_NAME: string;
11
+ static readonly CLASS_NAME: string;
12
12
  /**
13
13
  * Create a new instance of ImmutableProofService.
14
14
  * @param options The dependencies for the immutable proof connector.
package/docs/changelog.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @twin.org/immutable-proof-service - Changelog
2
2
 
3
+ ## [0.0.2-next.3](https://github.com/twinfoundation/immutable-proof/compare/immutable-proof-service-v0.0.2-next.2...immutable-proof-service-v0.0.2-next.3) (2025-10-09)
4
+
5
+
6
+ ### Features
7
+
8
+ * add validate-locales ([d6a7c07](https://github.com/twinfoundation/immutable-proof/commit/d6a7c0794a1922981a42f56cc24724d7cee727f6))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/immutable-proof-models bumped from 0.0.2-next.2 to 0.0.2-next.3
16
+ * @twin.org/immutable-proof-task bumped from 0.0.2-next.2 to 0.0.2-next.3
17
+
3
18
  ## [0.0.2-next.2](https://github.com/twinfoundation/immutable-proof/compare/immutable-proof-service-v0.0.2-next.1...immutable-proof-service-v0.0.2-next.2) (2025-08-29)
4
19
 
5
20
 
@@ -78,7 +78,7 @@
78
78
  "exampleResponse": {
79
79
  "value": {
80
80
  "name": "GeneralError",
81
- "message": "component.error",
81
+ "message": "errorMessage",
82
82
  "properties": {
83
83
  "foo": "bar"
84
84
  }
@@ -99,7 +99,7 @@
99
99
  "exampleResponse": {
100
100
  "value": {
101
101
  "name": "UnauthorizedError",
102
- "message": "component.error"
102
+ "message": "errorMessage"
103
103
  }
104
104
  }
105
105
  }
@@ -117,7 +117,7 @@
117
117
  "exampleResponse": {
118
118
  "value": {
119
119
  "name": "NotFoundError",
120
- "message": "component.error",
120
+ "message": "errorMessage",
121
121
  "properties": {
122
122
  "notFoundId": "1"
123
123
  }
@@ -138,7 +138,7 @@
138
138
  "exampleResponse": {
139
139
  "value": {
140
140
  "name": "InternalServerError",
141
- "message": "component.error"
141
+ "message": "errorMessage"
142
142
  }
143
143
  }
144
144
  }
@@ -266,7 +266,7 @@
266
266
  "exampleResponse": {
267
267
  "value": {
268
268
  "name": "GeneralError",
269
- "message": "component.error",
269
+ "message": "errorMessage",
270
270
  "properties": {
271
271
  "foo": "bar"
272
272
  }
@@ -287,7 +287,7 @@
287
287
  "exampleResponse": {
288
288
  "value": {
289
289
  "name": "UnauthorizedError",
290
- "message": "component.error"
290
+ "message": "errorMessage"
291
291
  }
292
292
  }
293
293
  }
@@ -305,7 +305,7 @@
305
305
  "exampleResponse": {
306
306
  "value": {
307
307
  "name": "NotFoundError",
308
- "message": "component.error",
308
+ "message": "errorMessage",
309
309
  "properties": {
310
310
  "notFoundId": "1"
311
311
  }
@@ -326,7 +326,7 @@
326
326
  "exampleResponse": {
327
327
  "value": {
328
328
  "name": "InternalServerError",
329
- "message": "component.error"
329
+ "message": "errorMessage"
330
330
  }
331
331
  }
332
332
  }
@@ -409,7 +409,7 @@
409
409
  "exampleResponse": {
410
410
  "value": {
411
411
  "name": "GeneralError",
412
- "message": "component.error",
412
+ "message": "errorMessage",
413
413
  "properties": {
414
414
  "foo": "bar"
415
415
  }
@@ -430,7 +430,7 @@
430
430
  "exampleResponse": {
431
431
  "value": {
432
432
  "name": "UnauthorizedError",
433
- "message": "component.error"
433
+ "message": "errorMessage"
434
434
  }
435
435
  }
436
436
  }
@@ -448,7 +448,7 @@
448
448
  "exampleResponse": {
449
449
  "value": {
450
450
  "name": "NotFoundError",
451
- "message": "component.error",
451
+ "message": "errorMessage",
452
452
  "properties": {
453
453
  "notFoundId": "1"
454
454
  }
@@ -469,7 +469,7 @@
469
469
  "exampleResponse": {
470
470
  "value": {
471
471
  "name": "InternalServerError",
472
- "message": "component.error"
472
+ "message": "errorMessage"
473
473
  }
474
474
  }
475
475
  }
@@ -30,14 +30,10 @@ The dependencies for the immutable proof connector.
30
30
 
31
31
  ### CLASS\_NAME
32
32
 
33
- > `readonly` **CLASS\_NAME**: `string`
33
+ > `readonly` `static` **CLASS\_NAME**: `string`
34
34
 
35
35
  Runtime name for the class.
36
36
 
37
- #### Implementation of
38
-
39
- `IImmutableProofComponent.CLASS_NAME`
40
-
41
37
  ## Methods
42
38
 
43
39
  ### create()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/immutable-proof-service",
3
- "version": "0.0.2-next.2",
3
+ "version": "0.0.2-next.3",
4
4
  "description": "Immutable proof contract implementation and REST endpoint definitions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,8 +23,8 @@
23
23
  "@twin.org/entity-storage-models": "next",
24
24
  "@twin.org/event-bus-models": "next",
25
25
  "@twin.org/identity-models": "next",
26
- "@twin.org/immutable-proof-models": "0.0.2-next.2",
27
- "@twin.org/immutable-proof-task": "0.0.2-next.2",
26
+ "@twin.org/immutable-proof-models": "0.0.2-next.3",
27
+ "@twin.org/immutable-proof-task": "0.0.2-next.3",
28
28
  "@twin.org/nameof": "next",
29
29
  "@twin.org/standards-w3c-did": "next",
30
30
  "@twin.org/vault-models": "next",
@@ -48,5 +48,20 @@
48
48
  "dist/types",
49
49
  "locales",
50
50
  "docs"
51
- ]
51
+ ],
52
+ "keywords": [
53
+ "twin",
54
+ "trade",
55
+ "iota",
56
+ "framework",
57
+ "blockchain",
58
+ "immutable-proof",
59
+ "service",
60
+ "microservice",
61
+ "business-logic"
62
+ ],
63
+ "bugs": {
64
+ "url": "git+https://github.com/twinfoundation/immutable-proof/issues"
65
+ },
66
+ "homepage": "https://twindev.org"
52
67
  }