@docknetwork/wallet-sdk-wasm 0.4.22 → 1.5.0

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 (193) hide show
  1. package/lib/{account-614e6414.js → account-bf00e5c0.js} +5 -5
  2. package/lib/{account-ee524484.js → account-e48dc9b6.js} +5 -5
  3. package/lib/core/polkadot-utils.js +18 -4
  4. package/lib/core/polkadot-utils.mjs +15 -2
  5. package/lib/index.js +16 -19
  6. package/lib/index.mjs +20 -23
  7. package/lib/modules/account.js +10 -5
  8. package/lib/modules/account.mjs +10 -5
  9. package/lib/modules/accounts.js +10 -5
  10. package/lib/modules/accounts.mjs +10 -5
  11. package/lib/modules/network-manager.js +4 -2
  12. package/lib/modules/network-manager.mjs +4 -2
  13. package/lib/modules/wallet.js +13 -8
  14. package/lib/modules/wallet.mjs +13 -8
  15. package/lib/rpc-server.js +16 -19
  16. package/lib/rpc-server.mjs +20 -23
  17. package/lib/services/blockchain/configs.js +7 -0
  18. package/lib/services/blockchain/configs.mjs +3 -0
  19. package/lib/services/{dock → blockchain}/index.android.js +3 -4
  20. package/lib/services/{dock → blockchain}/index.android.mjs +3 -4
  21. package/lib/services/{dock → blockchain}/index.ios.js +3 -4
  22. package/lib/services/{dock → blockchain}/index.ios.mjs +3 -4
  23. package/lib/services/blockchain/index.js +30 -0
  24. package/lib/services/blockchain/index.mjs +22 -0
  25. package/lib/services/{dock → blockchain}/service-rpc.js +5 -7
  26. package/lib/services/{dock → blockchain}/service-rpc.mjs +5 -7
  27. package/lib/services/blockchain/service.js +212 -0
  28. package/lib/services/blockchain/service.mjs +206 -0
  29. package/lib/services/credential/bbs-revocation.js +41 -60
  30. package/lib/services/credential/bbs-revocation.mjs +42 -57
  31. package/lib/services/credential/bound-check.js +0 -8
  32. package/lib/services/credential/bound-check.mjs +1 -5
  33. package/lib/services/credential/index.js +21 -24
  34. package/lib/services/credential/index.mjs +22 -25
  35. package/lib/services/credential/pex-helpers.js +134 -34
  36. package/lib/services/credential/pex-helpers.mjs +133 -35
  37. package/lib/services/credential/service.js +55 -56
  38. package/lib/services/credential/service.mjs +45 -43
  39. package/lib/services/credential/utils.js +12 -18
  40. package/lib/services/credential/utils.mjs +11 -14
  41. package/lib/services/dids/config.js +8 -0
  42. package/lib/services/dids/config.mjs +8 -0
  43. package/lib/services/dids/index.js +11 -10
  44. package/lib/services/dids/index.mjs +12 -11
  45. package/lib/services/dids/service-rpc.js +2 -2
  46. package/lib/services/dids/service-rpc.mjs +2 -2
  47. package/lib/services/dids/service.js +28 -36
  48. package/lib/services/dids/service.mjs +27 -33
  49. package/lib/services/edv/hmac.js +5 -0
  50. package/lib/services/edv/hmac.mjs +5 -0
  51. package/lib/services/edv/index.js +13 -11
  52. package/lib/services/edv/index.mjs +16 -14
  53. package/lib/services/edv/service-rpc.js +4 -0
  54. package/lib/services/edv/service-rpc.mjs +4 -0
  55. package/lib/services/edv/service.js +29 -13
  56. package/lib/services/edv/service.mjs +31 -16
  57. package/lib/services/example/service.js +3 -1
  58. package/lib/services/example/service.mjs +3 -1
  59. package/lib/services/index.js +14 -17
  60. package/lib/services/index.mjs +18 -21
  61. package/lib/services/keyring/configs.js +12 -0
  62. package/lib/services/keyring/configs.mjs +12 -0
  63. package/lib/services/keyring/service.js +5 -0
  64. package/lib/services/keyring/service.mjs +5 -0
  65. package/lib/services/pex/service.js +17 -15
  66. package/lib/services/pex/service.mjs +17 -15
  67. package/lib/services/relay-service/index.mjs +1 -1
  68. package/lib/services/relay-service/service.mjs +2 -2
  69. package/lib/services/substrate/api-utils.js +19 -6
  70. package/lib/services/substrate/api-utils.mjs +19 -6
  71. package/lib/services/substrate/index.js +14 -6
  72. package/lib/services/substrate/index.mjs +14 -6
  73. package/lib/services/substrate/service.js +17 -9
  74. package/lib/services/substrate/service.mjs +17 -9
  75. package/lib/services/test-utils.js +27 -17
  76. package/lib/services/test-utils.mjs +27 -17
  77. package/lib/services/trust-registry/index.js +17 -5
  78. package/lib/services/trust-registry/index.mjs +17 -5
  79. package/lib/services/trust-registry/service.js +27 -10
  80. package/lib/services/trust-registry/service.mjs +27 -10
  81. package/lib/services/util-crypto/configs.js +3 -0
  82. package/lib/services/util-crypto/configs.mjs +3 -0
  83. package/lib/services/util-crypto/service-rpc.js +6 -0
  84. package/lib/services/util-crypto/service-rpc.mjs +6 -0
  85. package/lib/services/util-crypto/service.js +5 -0
  86. package/lib/services/util-crypto/service.mjs +6 -1
  87. package/lib/setup-nodejs.js +16 -19
  88. package/lib/setup-nodejs.mjs +20 -23
  89. package/lib/setup-tests.js +16 -19
  90. package/lib/setup-tests.mjs +20 -23
  91. package/lib/src/core/polkadot-utils.d.ts +1 -0
  92. package/lib/src/core/polkadot-utils.d.ts.map +1 -1
  93. package/lib/src/modules/network-manager.d.ts +1 -0
  94. package/lib/src/modules/network-manager.d.ts.map +1 -1
  95. package/lib/src/services/blockchain/configs.d.ts +8 -0
  96. package/lib/src/services/blockchain/configs.d.ts.map +1 -0
  97. package/lib/src/services/blockchain/index.d.ts +2 -0
  98. package/lib/src/services/blockchain/index.d.ts.map +1 -0
  99. package/lib/src/services/blockchain/service.d.ts +52 -0
  100. package/lib/src/services/blockchain/service.d.ts.map +1 -0
  101. package/lib/src/services/credential/bbs-revocation.d.ts.map +1 -1
  102. package/lib/src/services/credential/bound-check.d.ts +0 -4
  103. package/lib/src/services/credential/bound-check.d.ts.map +1 -1
  104. package/lib/src/services/credential/index.d.ts +2 -7
  105. package/lib/src/services/credential/index.d.ts.map +1 -1
  106. package/lib/src/services/credential/pex-helpers.d.ts +5 -3
  107. package/lib/src/services/credential/pex-helpers.d.ts.map +1 -1
  108. package/lib/src/services/credential/service.d.ts +2 -7
  109. package/lib/src/services/credential/service.d.ts.map +1 -1
  110. package/lib/src/services/credential/utils.d.ts.map +1 -1
  111. package/lib/src/services/dids/config.d.ts +5 -0
  112. package/lib/src/services/dids/config.d.ts.map +1 -1
  113. package/lib/src/services/dids/service-rpc.d.ts +1 -1
  114. package/lib/src/services/dids/service-rpc.d.ts.map +1 -1
  115. package/lib/src/services/dids/service.d.ts +9 -4
  116. package/lib/src/services/dids/service.d.ts.map +1 -1
  117. package/lib/src/services/edv/hmac.d.ts +1 -0
  118. package/lib/src/services/edv/hmac.d.ts.map +1 -1
  119. package/lib/src/services/edv/service.d.ts +5 -0
  120. package/lib/src/services/edv/service.d.ts.map +1 -1
  121. package/lib/src/services/example/service.d.ts.map +1 -1
  122. package/lib/src/services/keyring/configs.d.ts +6 -0
  123. package/lib/src/services/keyring/configs.d.ts.map +1 -1
  124. package/lib/src/services/pex/service.d.ts.map +1 -1
  125. package/lib/src/services/trust-registry/service.d.ts.map +1 -1
  126. package/lib/src/services/util-crypto/configs.d.ts +1 -0
  127. package/lib/src/services/util-crypto/configs.d.ts.map +1 -1
  128. package/lib/src/services/util-crypto/service.d.ts +1 -0
  129. package/lib/src/services/util-crypto/service.d.ts.map +1 -1
  130. package/lib/test/setup-test-state.js +11 -6
  131. package/lib/test/setup-test-state.mjs +11 -6
  132. package/lib/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +7 -4
  134. package/src/core/polkadot-utils.js +14 -3
  135. package/src/modules/network-manager.ts +5 -2
  136. package/src/modules/wallet.ts +5 -5
  137. package/src/services/blockchain/configs.ts +11 -0
  138. package/src/services/blockchain/index.android.js +3 -0
  139. package/src/services/blockchain/index.ios.js +3 -0
  140. package/src/services/blockchain/index.js +1 -0
  141. package/src/services/blockchain/index.test.js +34 -0
  142. package/src/services/{dock → blockchain}/service-rpc.js +5 -6
  143. package/src/services/blockchain/service.ts +261 -0
  144. package/src/services/credential/bbs-revocation.ts +41 -85
  145. package/src/services/credential/bound-check.test.ts +2 -5
  146. package/src/services/credential/bound-check.ts +0 -5
  147. package/src/services/credential/index.test.js +148 -7
  148. package/src/services/credential/pex-helpers.js +132 -34
  149. package/src/services/credential/pex-helpers.test.js +284 -27
  150. package/src/services/credential/service.ts +44 -27
  151. package/src/services/credential/utils.js +5 -14
  152. package/src/services/dids/config.ts +15 -0
  153. package/src/services/dids/index.test.js +5 -23
  154. package/src/services/dids/service-rpc.ts +2 -2
  155. package/src/services/dids/service.ts +34 -44
  156. package/src/services/edv/hmac.ts +13 -0
  157. package/src/services/edv/index.test.js +22 -0
  158. package/src/services/edv/service-rpc.js +4 -0
  159. package/src/services/edv/service.ts +22 -0
  160. package/src/services/example/service.ts +3 -1
  161. package/src/services/index.js +2 -2
  162. package/src/services/keyring/configs.ts +21 -0
  163. package/src/services/keyring/service.ts +13 -0
  164. package/src/services/pex/service.ts +29 -18
  165. package/src/services/pex/tests/pex-service.test.js +163 -6
  166. package/src/services/substrate/api-utils.test.js +7 -7
  167. package/src/services/substrate/api-utils.ts +3 -3
  168. package/src/services/substrate/service.ts +6 -6
  169. package/src/services/test-utils.js +13 -11
  170. package/src/services/trust-registry/index.test.js +6 -4
  171. package/src/services/trust-registry/service.ts +13 -7
  172. package/src/services/util-crypto/configs.ts +4 -0
  173. package/src/services/util-crypto/service-rpc.js +6 -0
  174. package/src/services/util-crypto/service.ts +8 -0
  175. package/src/test/setup-test-state.js +2 -2
  176. package/lib/services/dock/configs.js +0 -18
  177. package/lib/services/dock/configs.mjs +0 -10
  178. package/lib/services/dock/index.js +0 -17
  179. package/lib/services/dock/index.mjs +0 -9
  180. package/lib/services/dock/service.js +0 -138
  181. package/lib/services/dock/service.mjs +0 -126
  182. package/lib/src/services/dock/configs.d.ts +0 -7
  183. package/lib/src/services/dock/configs.d.ts.map +0 -1
  184. package/lib/src/services/dock/index.d.ts +0 -2
  185. package/lib/src/services/dock/index.d.ts.map +0 -1
  186. package/lib/src/services/dock/service.d.ts +0 -44
  187. package/lib/src/services/dock/service.d.ts.map +0 -1
  188. package/src/services/dock/configs.ts +0 -12
  189. package/src/services/dock/index.android.js +0 -3
  190. package/src/services/dock/index.ios.js +0 -3
  191. package/src/services/dock/index.js +0 -1
  192. package/src/services/dock/index.test.js +0 -48
  193. package/src/services/dock/service.ts +0 -154
@@ -132,10 +132,5 @@ export async function fetchProvingKey(proofRequest: ProofRequest) {
132
132
  return {provingKey, provingKeyId: 'key0'};
133
133
  }
134
134
 
135
- export const MAX_DATE_PLACEHOLDER = 884541351600000;
136
- export const MIN_DATE_PLACEHOLDER = -17592186044415;
137
- export const MAX_NUMBER = Math.pow(100, 9);
138
- export const MIN_INTEGER = -4294967295;
139
-
140
135
  export const hasProvingKey = (proofRequest: ProofRequest) =>
141
136
  !!proofRequest.boundCheckSnarkKey;
@@ -1,14 +1,31 @@
1
1
  import {assertRpcService, getPromiseError} from '../test-utils';
2
2
  import {credentialService as service} from './service';
3
3
  import {validation} from './config';
4
- import * as credentialsUtils from '@docknetwork/sdk/utils/vc/credentials';
4
+ import * as credentialUtils from '@docknetwork/credential-sdk/vc';
5
5
  import {CredentialServiceRPC} from './service-rpc';
6
6
  import {getTestWallet} from '../../test/setup-test-state';
7
- import BbsPlusPresentation from '@docknetwork/sdk/presentation';
7
+ import {OpenID4VCIClientV1_0_13} from '@sphereon/oid4vci-client';
8
+ import {didService} from '../dids/service';
8
9
 
9
10
  describe('Credential Service', () => {
10
11
  beforeAll(async () => {
11
12
  await getTestWallet();
13
+ const mockAddCredentialToPresent = jest.fn(() => 0);
14
+ const mockAddAttributeToReveal = jest.fn();
15
+ const mockCreatePresentation = jest.fn();
16
+ const mockDeriveCredentials = jest.fn(() => []);
17
+
18
+ jest.spyOn(credentialUtils, 'Presentation').mockImplementation(() => {
19
+ return {
20
+ addCredentialToPresent: mockAddCredentialToPresent,
21
+ addAttributeToReveal: mockAddAttributeToReveal,
22
+ createPresentation: mockCreatePresentation,
23
+ deriveCredentials: mockDeriveCredentials,
24
+ presBuilder: {
25
+ enforceBounds: jest.fn(),
26
+ },
27
+ };
28
+ });
12
29
  });
13
30
  it('ServiceRpc', () => {
14
31
  assertRpcService(CredentialServiceRPC, service, validation);
@@ -19,7 +36,7 @@ describe('Credential Service', () => {
19
36
  });
20
37
  it('expect to verify credential', async () => {
21
38
  jest
22
- .spyOn(credentialsUtils, 'verifyCredential')
39
+ .spyOn(credentialUtils, 'verifyCredential')
23
40
  .mockImplementationOnce(async () => ({verified: true}));
24
41
  const credential = {
25
42
  '@context': [
@@ -71,7 +88,7 @@ describe('Credential Service', () => {
71
88
  },
72
89
  };
73
90
  await service.verifyCredential({credential});
74
- expect(credentialsUtils.verifyCredential).toBeCalled();
91
+ expect(credentialUtils.verifyCredential).toBeCalled();
75
92
  });
76
93
  it('should create a vc', async () => {
77
94
  const subject = {
@@ -296,7 +313,7 @@ describe('Credential Service', () => {
296
313
  credentials,
297
314
  });
298
315
 
299
- const bbsPresentation = new BbsPlusPresentation();
316
+ const bbsPresentation = new credentialUtils.Presentation();
300
317
  expect(bbsPresentation.addCredentialToPresent).toBeCalledWith(
301
318
  credential,
302
319
  expect.any(Object),
@@ -366,7 +383,7 @@ describe('Credential Service', () => {
366
383
  credentials,
367
384
  });
368
385
 
369
- const bbsPresentation = new BbsPlusPresentation();
386
+ const bbsPresentation = new credentialUtils.Presentation();
370
387
  expect(bbsPresentation.addCredentialToPresent).toBeCalledWith(
371
388
  credential,
372
389
  expect.any(Object),
@@ -401,7 +418,7 @@ describe('Credential Service', () => {
401
418
  },
402
419
  }),
403
420
  ).toBe(
404
- '0xa632a41f2fbdb681c14b33daae4fcc46af41661b90b35c4ac1545c9bebf0d7cc',
421
+ 'dock:accumulator:0xa632a41f2fbdb681c14b33daae4fcc46af41661b90b35c4ac1545c9bebf0d7cc',
405
422
  );
406
423
  });
407
424
  });
@@ -427,4 +444,128 @@ describe('Credential Service', () => {
427
444
  }),
428
445
  ).toBe(true);
429
446
  });
447
+
448
+ describe('acquireOIDCredential', () => {
449
+ const mockHolderKeyDocument = {
450
+ id: 'did:example:123#key-1',
451
+ controller: 'did:example:123',
452
+ };
453
+
454
+ const mockCredential = {
455
+ '@context': ['https://www.w3.org/2018/credentials/v1'],
456
+ type: ['VerifiableCredential', 'MyCredential'],
457
+ issuer:
458
+ 'https://api-testnet.truvera.io/openid/issuers/7eff516f-69fb-4b9d-94dc-e88308ec0c4c',
459
+ credentialSubject: {
460
+ id: 'did:example:123',
461
+ name: 'John Doe',
462
+ },
463
+ proof: {
464
+ type: 'Ed25519Signature2018',
465
+ created: '2024-03-31T12:00:00Z',
466
+ proofPurpose: 'assertionMethod',
467
+ verificationMethod: 'did:example:123#key-1',
468
+ proofValue: 'mockProofValue',
469
+ },
470
+ };
471
+
472
+ beforeEach(() => {
473
+ jest.clearAllMocks();
474
+ });
475
+
476
+ it('should handle credential_offer parameter', async () => {
477
+ const uri =
478
+ 'openid-credential-offer://?credential_offer=%7B%22credential_issuer%22%3A%22https%3A%2F%2Fapi-testnet.truvera.io%2Fopenid%2Fissuers%2F7eff516f-69fb-4b9d-94dc-e88308ec0c4c%22%2C%22credentials%22%3A%5B%22ldp_vc%3AMyCredential%22%5D%2C%22grants%22%3A%7B%22urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Apre-authorized_code%22%3A%7B%22pre-authorized_code%22%3A%22AAL4MPpEpWY6daBxVxJ8Q3chxOhvc9qIV3EAyj7dvps%22%2C%22user_pin_required%22%3Afalse%7D%7D%7D';
479
+
480
+ const mockClient = {
481
+ credentialOffer: {
482
+ preAuthorizedCode: 'AAL4MPpEpWY6daBxVxJ8Q3chxOhvc9qIV3EAyj7dvps',
483
+ },
484
+ acquireAccessToken: jest.fn(),
485
+ acquireCredentials: jest
486
+ .fn()
487
+ .mockResolvedValue({credential: mockCredential}),
488
+ getCredentialsSupported: jest
489
+ .fn()
490
+ .mockReturnValue([{scope: 'ldp_vc:MyCredential'}]),
491
+ };
492
+
493
+ jest
494
+ .spyOn(OpenID4VCIClientV1_0_13, 'fromURI')
495
+ .mockResolvedValue(mockClient);
496
+ jest
497
+ .spyOn(didService, 'createSignedJWT')
498
+ .mockResolvedValue('mock.jwt.token');
499
+
500
+ const result = await service.acquireOIDCredential({
501
+ uri,
502
+ holderKeyDocument: mockHolderKeyDocument,
503
+ });
504
+
505
+ expect(result).toEqual({
506
+ credential: mockCredential,
507
+ });
508
+ });
509
+
510
+ it('should handle credential_offer_uri parameter', async () => {
511
+ const uri =
512
+ 'openid-credential-offer://?credential_offer_uri=https://api.truvera.io/openid/credential-offers/6783b6ff-b84d-4e6a-850d-f3828e2c1526';
513
+
514
+ // Mock OpenID4VCIClientV1_0_13
515
+ const mockClient = {
516
+ credentialOffer: {
517
+ preAuthorizedCode: 'AAL4MPpEpWY6daBxVxJ8Q3chxOhvc9qIV3EAyj7dvps',
518
+ },
519
+ acquireAccessToken: jest.fn(),
520
+ acquireCredentials: jest
521
+ .fn()
522
+ .mockResolvedValue({credential: mockCredential}),
523
+ getCredentialsSupported: jest
524
+ .fn()
525
+ .mockReturnValue([{scope: 'ldp_vc:MyCredential'}]),
526
+ };
527
+
528
+ jest
529
+ .spyOn(OpenID4VCIClientV1_0_13, 'fromURI')
530
+ .mockResolvedValue(mockClient);
531
+ jest
532
+ .spyOn(didService, 'createSignedJWT')
533
+ .mockResolvedValue('mock.jwt.token');
534
+
535
+ const result = await service.acquireOIDCredential({
536
+ uri,
537
+ holderKeyDocument: mockHolderKeyDocument,
538
+ });
539
+
540
+ expect(result).toEqual({
541
+ credential: mockCredential,
542
+ });
543
+ });
544
+
545
+ it('should return authorization URL when no pre-authorized code is available', async () => {
546
+ const uri =
547
+ 'openid-credential-offer://?credential_offer=%7B%22credential_issuer%22%3A%22https%3A%2F%2Fapi-testnet.truvera.io%2Fopenid%2Fissuers%2F7eff516f-69fb-4b9d-94dc-e88308ec0c4c%22%2C%22credentials%22%3A%5B%22ldp_vc%3AMyCredential%22%5D%7D';
548
+ const mockClient = {
549
+ credentialOffer: {},
550
+ authorizationURL:
551
+ 'https://api-testnet.truvera.io/openid/authorize?response_type=code&client_id=dock.wallet&redirect_uri=dock-wallet%3A%2F%2Fcredentials%2Fcallback&scope=ldp_vc%3AMyCredential',
552
+ getCredentialsSupported: jest
553
+ .fn()
554
+ .mockReturnValue([{scope: 'ldp_vc:MyCredential'}]),
555
+ };
556
+
557
+ jest
558
+ .spyOn(OpenID4VCIClientV1_0_13, 'fromURI')
559
+ .mockResolvedValue(mockClient);
560
+
561
+ const result = await service.acquireOIDCredential({
562
+ uri,
563
+ holderKeyDocument: mockHolderKeyDocument,
564
+ });
565
+
566
+ expect(result).toEqual({
567
+ authorizationURL: mockClient.authorizationURL,
568
+ });
569
+ });
570
+ });
430
571
  });
@@ -1,12 +1,14 @@
1
1
  import {JSONPath} from '@astronautlabs/jsonpath';
2
2
 
3
- export const EPSILON_NUMBER = 0.0001;
3
+ export const EPSILON_NUMBER = 0.001;
4
4
  export const EPSILON_INT = 1;
5
5
 
6
6
  export const MAX_DATE_PLACEHOLDER = 884541351600000;
7
7
  export const MIN_DATE_PLACEHOLDER = -17592186044415;
8
- export const MAX_NUMBER = 100 ** 9;
9
- export const MIN_NUMBER = -4294967295;
8
+ export const MAX_INTEGER = 100 ** 9;
9
+ export const MIN_INTEGER = -4294967295;
10
+ export const MAX_NUMBER = 100 ** 5;
11
+ export const MIN_NUMBER = -4294967294;
10
12
 
11
13
  /*
12
14
  PEX Filter rules:
@@ -21,6 +23,15 @@ function correctFieldPath(path) {
21
23
  return path.replace('$.', '');
22
24
  }
23
25
 
26
+ function getNumDecimalPlaces(n) {
27
+ const parts = n.toString().split('.');
28
+ return parts.length > 1 && parts[1].length;
29
+ }
30
+
31
+ function toMaxDecimalPlaces(n, maxDecimalPlaces) {
32
+ return +n.toFixed(maxDecimalPlaces);
33
+ }
34
+
24
35
  function getAttributeName({field, selectedCredentials, index}) {
25
36
  let attributeName;
26
37
  if (Array.isArray(field.path) && field.path.length > 1) {
@@ -52,18 +63,40 @@ function getAttributeName({field, selectedCredentials, index}) {
52
63
  export function pexToBounds(
53
64
  pexRequest,
54
65
  selectedCredentials = [],
55
- isRawBoundies = false,
66
+ removeFromRequest = false,
56
67
  ) {
57
68
  const descriptorBounds = [];
58
- const [MIN_DATE_ADJ, MAX_DATE_ADJ, MIN_NUMBER_ADJ, MAX_NUMBER_ADJ] = [
59
- MIN_DATE_PLACEHOLDER,
60
- MAX_DATE_PLACEHOLDER,
61
- MIN_NUMBER,
62
- MAX_NUMBER,
63
- ].map(value => (isRawBoundies ? undefined : value));
69
+ const fieldsToRemove = [];
64
70
 
65
71
  // One list of bounds per descriptor/credential
66
72
  pexRequest.input_descriptors.forEach((inputDescriptor, index) => {
73
+ const selectedCredential = selectedCredentials[index];
74
+ if (!selectedCredential) {
75
+ return;
76
+ }
77
+
78
+ // Get embedded schema if existing
79
+ let decodedSchema = {};
80
+ if (selectedCredential.credentialSchema) {
81
+ const schemaStartStr = 'data:application/json;charset=utf-8,';
82
+
83
+ if (selectedCredential.credentialSchema.details) {
84
+ decodedSchema =
85
+ JSON.parse(selectedCredential.credentialSchema.details).jsonSchema ||
86
+ {};
87
+ } else if (
88
+ selectedCredential.credentialSchema.id &&
89
+ selectedCredential.credentialSchema.id.startsWith(schemaStartStr)
90
+ ) {
91
+ // LEGACY embedded schema handling
92
+ decodedSchema = JSON.parse(
93
+ decodeURIComponent(
94
+ selectedCredential.credentialSchema.id.split(schemaStartStr)[1],
95
+ ),
96
+ );
97
+ }
98
+ }
99
+
67
100
  const bounds = [];
68
101
  inputDescriptor.constraints.fields.forEach(field => {
69
102
  const {
@@ -77,6 +110,44 @@ export function pexToBounds(
77
110
  type,
78
111
  } = field.filter || {};
79
112
 
113
+ if (!field.path || field.path.length === 0) {
114
+ throw new Error(
115
+ 'Missing or empty field "path" property, expected array or string',
116
+ );
117
+ }
118
+
119
+ let attributeName;
120
+ if (Array.isArray(field.path) && field.path.length > 1) {
121
+ // Must find a path that matches in selectedcredential, and choose that for bounds
122
+ const pathCount = field.path.length;
123
+ for (let i = 0; i < pathCount; i++) {
124
+ const path = field.path[i];
125
+ const paths = JSONPath.paths(selectedCredential, path);
126
+ if (paths.length) {
127
+ // First come first served
128
+ attributeName = correctFieldPath(JSONPath.stringify(paths[0]));
129
+ break;
130
+ }
131
+ }
132
+ } else {
133
+ const path = Array.isArray(field.path) ? field.path[0] : field.path;
134
+ attributeName = correctFieldPath(path);
135
+ }
136
+
137
+ if (!attributeName) {
138
+ return;
139
+ }
140
+
141
+ const schemaPath = `$.properties.${attributeName.replaceAll(
142
+ '.',
143
+ '.properties.',
144
+ )}`;
145
+ const attributeSchema = JSONPath.query(
146
+ decodedSchema,
147
+ schemaPath,
148
+ 1,
149
+ )[0] || {type};
150
+
80
151
  let max =
81
152
  maximum === undefined
82
153
  ? formatMaximum === undefined
@@ -95,62 +166,89 @@ export function pexToBounds(
95
166
  return;
96
167
  }
97
168
 
169
+ const attributeType = attributeSchema.type || type;
170
+
98
171
  // Get min/max bounds values, if using exclusive we must apply an epsilon so equality isnt true
99
172
  if (format === 'date-time' || format === 'date') {
100
- max = max === undefined ? MAX_DATE_ADJ : max;
101
- max = max ? new Date(max) : undefined;
102
- min = min === undefined ? MIN_DATE_ADJ : min;
103
- min = min ? new Date(min) : undefined;
104
- } else if (type === 'number') {
173
+ max = new Date(max === undefined ? MAX_DATE_PLACEHOLDER : max);
174
+ min = new Date(min === undefined ? MIN_DATE_PLACEHOLDER : min);
175
+ } else if (attributeType === 'number') {
176
+ const epsilon = attributeSchema.multipleOf || EPSILON_NUMBER;
177
+ const attribDecimalPlaces = getNumDecimalPlaces(epsilon);
178
+
105
179
  max =
106
180
  max === undefined
107
- ? MAX_NUMBER_ADJ
108
- : exclusiveMaximum === undefined || isRawBoundies
181
+ ? attributeSchema.maximum === undefined
182
+ ? MAX_NUMBER
183
+ : attributeSchema.maximum
184
+ : exclusiveMaximum === undefined
109
185
  ? max
110
- : max - EPSILON_NUMBER;
186
+ : max - epsilon;
111
187
  min =
112
188
  min === undefined
113
- ? MIN_NUMBER_ADJ
114
- : exclusiveMinimum === undefined || isRawBoundies
189
+ ? attributeSchema.minimum === undefined
190
+ ? MIN_NUMBER
191
+ : attributeSchema.minimum
192
+ : exclusiveMinimum === undefined
115
193
  ? min
116
- : min + EPSILON_NUMBER;
117
- } else if (type === 'integer') {
194
+ : min + epsilon;
195
+
196
+ // Because of floating point math sucks, sometimes we can get extra decimal points
197
+ // the bounds must also match the same decimal points as the input
198
+ // for this we read from the embedded schema
199
+ min = toMaxDecimalPlaces(min, attribDecimalPlaces);
200
+ max = toMaxDecimalPlaces(max, attribDecimalPlaces);
201
+ } else if (attributeType === 'integer') {
118
202
  max =
119
203
  max === undefined
120
- ? MAX_NUMBER_ADJ
121
- : exclusiveMaximum === undefined || isRawBoundies
204
+ ? attributeSchema.maximum === undefined
205
+ ? MAX_INTEGER
206
+ : attributeSchema.maximum
207
+ : exclusiveMaximum === undefined
122
208
  ? max
123
209
  : max - EPSILON_INT;
124
210
  min =
125
211
  min === undefined
126
- ? MIN_NUMBER_ADJ
127
- : exclusiveMinimum === undefined || isRawBoundies
212
+ ? attributeSchema.minimum === undefined
213
+ ? MIN_INTEGER
214
+ : attributeSchema.minimum
215
+ : exclusiveMinimum === undefined
128
216
  ? min
129
217
  : min + EPSILON_INT;
218
+
219
+ // Ensure that input values are not decimals otherwise crypto-wasm-ts will complain
220
+ min = Math.floor(min);
221
+ max = Math.floor(max);
130
222
  } else {
131
223
  throw new Error(
132
224
  `Unsupported format ${format} and type ${type} for enforce bounds`,
133
225
  );
134
226
  }
135
227
 
136
- const attributeName = getAttributeName({
137
- field,
138
- selectedCredentials,
139
- index,
140
- });
228
+ if (removeFromRequest) {
229
+ fieldsToRemove.push({
230
+ fields: inputDescriptor.constraints.fields,
231
+ field,
232
+ });
233
+ }
141
234
 
142
235
  bounds.push({
143
236
  attributeName,
144
237
  min,
145
238
  max,
146
- type,
147
- format,
148
239
  });
149
240
  });
150
241
 
151
242
  descriptorBounds.push(bounds);
152
243
  });
153
244
 
245
+ fieldsToRemove.forEach(({fields, field}) => {
246
+ const idx = fields.indexOf(field);
247
+ if (idx !== -1) {
248
+ fields.splice(idx, 1);
249
+ }
250
+ });
251
+
154
252
  return descriptorBounds;
155
253
  }
156
254
 
@@ -170,7 +268,7 @@ export function getPexRequiredAttributes(pexRequest, selectedCredentials = []) {
170
268
  .map((inputDescriptor, index) => {
171
269
  return inputDescriptor.constraints.fields
172
270
  .filter(field => {
173
- if (field.filter) {
271
+ if (field.filter || field.optional) {
174
272
  return false;
175
273
  }
176
274