@metamask-previews/kyc-controller 0.0.0-preview-e57e5c3dc → 0.0.0-preview-c34a16a37

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 (57) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/README.md +1 -1
  3. package/dist/KycController-method-action-types.cjs.map +1 -1
  4. package/dist/KycController-method-action-types.d.cts +46 -1
  5. package/dist/KycController-method-action-types.d.cts.map +1 -1
  6. package/dist/KycController-method-action-types.d.mts +46 -1
  7. package/dist/KycController-method-action-types.d.mts.map +1 -1
  8. package/dist/KycController-method-action-types.mjs.map +1 -1
  9. package/dist/KycController.cjs +366 -10
  10. package/dist/KycController.cjs.map +1 -1
  11. package/dist/KycController.d.cts +85 -3
  12. package/dist/KycController.d.cts.map +1 -1
  13. package/dist/KycController.d.mts +85 -3
  14. package/dist/KycController.d.mts.map +1 -1
  15. package/dist/KycController.mjs +366 -10
  16. package/dist/KycController.mjs.map +1 -1
  17. package/dist/KycService-method-action-types.cjs.map +1 -1
  18. package/dist/KycService-method-action-types.d.cts +56 -1
  19. package/dist/KycService-method-action-types.d.cts.map +1 -1
  20. package/dist/KycService-method-action-types.d.mts +56 -1
  21. package/dist/KycService-method-action-types.d.mts.map +1 -1
  22. package/dist/KycService-method-action-types.mjs.map +1 -1
  23. package/dist/KycService.cjs +167 -10
  24. package/dist/KycService.cjs.map +1 -1
  25. package/dist/KycService.d.cts +75 -2
  26. package/dist/KycService.d.cts.map +1 -1
  27. package/dist/KycService.d.mts +75 -2
  28. package/dist/KycService.d.mts.map +1 -1
  29. package/dist/KycService.mjs +168 -11
  30. package/dist/KycService.mjs.map +1 -1
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +5 -5
  33. package/dist/index.d.cts.map +1 -1
  34. package/dist/index.d.mts +5 -5
  35. package/dist/index.d.mts.map +1 -1
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/types.cjs.map +1 -1
  38. package/dist/types.d.cts +48 -10
  39. package/dist/types.d.cts.map +1 -1
  40. package/dist/types.d.mts +48 -10
  41. package/dist/types.d.mts.map +1 -1
  42. package/dist/types.mjs.map +1 -1
  43. package/dist/ukyc/deriveClientMaterial.cjs +1 -1
  44. package/dist/ukyc/deriveClientMaterial.cjs.map +1 -1
  45. package/dist/ukyc/deriveClientMaterial.mjs +1 -1
  46. package/dist/ukyc/deriveClientMaterial.mjs.map +1 -1
  47. package/dist/ukyc/storageAccessToken.cjs +1 -1
  48. package/dist/ukyc/storageAccessToken.cjs.map +1 -1
  49. package/dist/ukyc/storageAccessToken.d.cts.map +1 -1
  50. package/dist/ukyc/storageAccessToken.d.mts.map +1 -1
  51. package/dist/ukyc/storageAccessToken.mjs +1 -1
  52. package/dist/ukyc/storageAccessToken.mjs.map +1 -1
  53. package/dist/ukyc/wrappedRelayPayload.cjs.map +1 -1
  54. package/dist/ukyc/wrappedRelayPayload.d.cts.map +1 -1
  55. package/dist/ukyc/wrappedRelayPayload.d.mts.map +1 -1
  56. package/dist/ukyc/wrappedRelayPayload.mjs.map +1 -1
  57. package/package.json +1 -1
@@ -47,6 +47,61 @@ export type KycServiceCheckKycRequiredAction = {
47
47
  type: `KycService:checkKycRequired`;
48
48
  handler: KycService['checkKycRequired'];
49
49
  };
50
+ /**
51
+ * Creates (or resumes) an Iron empty-shell customer for the authenticated
52
+ * canonical user. Must run before showing Iron T&C so the customer exists in
53
+ * `SigningsRequired` and resume logic can key off Iron status.
54
+ *
55
+ * @param params - The parameters.
56
+ * @param params.email - Email associated with the Iron customer.
57
+ * @returns The Iron customer record (subset validated for controller use).
58
+ */
59
+ export type KycServiceCreateIronCustomerAction = {
60
+ type: `KycService:createIronCustomer`;
61
+ handler: KycService['createIronCustomer'];
62
+ };
63
+ /**
64
+ * Fetches Iron disclaimers / terms the customer must accept before consents
65
+ * and the SumSub sub-flow.
66
+ *
67
+ * @param params - The parameters.
68
+ * @param params.country - ISO 3166-1 alpha-3 country code.
69
+ * @returns The disclaimers.
70
+ */
71
+ export type KycServiceFetchIronDisclaimersAction = {
72
+ type: `KycService:fetchIronDisclaimers`;
73
+ handler: KycService['fetchIronDisclaimers'];
74
+ };
75
+ /**
76
+ * Checks whether Iron still requires KYC for the authenticated canonical
77
+ * user. Unlike the MoonPay variant, this does not take an access token.
78
+ *
79
+ * @returns Whether KYC is required.
80
+ */
81
+ export type KycServiceCheckIronKycRequiredAction = {
82
+ type: `KycService:checkIronKycRequired`;
83
+ handler: KycService['checkIronKycRequired'];
84
+ };
85
+ /**
86
+ * Posts T&C1 (Iron signings) and T&C2 (Sumsub + idOS) consents for the
87
+ * authenticated user. The API responds with 204 No Content on success.
88
+ *
89
+ * @param params - The consent parameters.
90
+ */
91
+ export type KycServiceSubmitConsentsAction = {
92
+ type: `KycService:submitConsents`;
93
+ handler: KycService['submitConsents'];
94
+ };
95
+ /**
96
+ * Fetches the user-keyed simplified KYC status used by Money toast / banner
97
+ * surfaces (`GET /kyc/status`).
98
+ *
99
+ * @returns The simplified status payload.
100
+ */
101
+ export type KycServiceFetchKycStatusAction = {
102
+ type: `KycService:fetchKycStatus`;
103
+ handler: KycService['fetchKycStatus'];
104
+ };
50
105
  /**
51
106
  * Requests a per-session wrapping key from the UKYC backend.
52
107
  *
@@ -117,5 +172,5 @@ export type KycServiceGetSessionStatusAction = {
117
172
  /**
118
173
  * Union of all KycService action types.
119
174
  */
120
- export type KycServiceMethodActions = KycServiceGetGeoCountryAction | KycServiceFetchDisclaimersAction | KycServiceCreateSessionAction | KycServiceCheckKycRequiredAction | KycServiceGetWrappingKeyAction | KycServiceFetchJwksAction | KycServiceCreateUkycSessionAction | KycServiceCreateJourneyAction | KycServiceGetSessionStatusAction;
175
+ export type KycServiceMethodActions = KycServiceGetGeoCountryAction | KycServiceFetchDisclaimersAction | KycServiceCreateSessionAction | KycServiceCheckKycRequiredAction | KycServiceCreateIronCustomerAction | KycServiceFetchIronDisclaimersAction | KycServiceCheckIronKycRequiredAction | KycServiceSubmitConsentsAction | KycServiceFetchKycStatusAction | KycServiceGetWrappingKeyAction | KycServiceFetchJwksAction | KycServiceCreateUkycSessionAction | KycServiceCreateJourneyAction | KycServiceGetSessionStatusAction;
121
176
  //# sourceMappingURL=KycService-method-action-types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KycService-method-action-types.d.mts","sourceRoot":"","sources":["../src/KycService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAwB;AAElD;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;CACzC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,2BAA2B,CAAC;IAClC,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,8BAA8B,CAAC;IACrC,OAAO,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC;CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B,6BAA6B,GAC7B,gCAAgC,GAChC,6BAA6B,GAC7B,gCAAgC,GAChC,8BAA8B,GAC9B,yBAAyB,GACzB,iCAAiC,GACjC,6BAA6B,GAC7B,gCAAgC,CAAC"}
1
+ {"version":3,"file":"KycService-method-action-types.d.mts","sourceRoot":"","sources":["../src/KycService-method-action-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"KycService-method-action-types.mjs","sourceRoot":"","sources":["../src/KycService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { KycService } from './KycService.js';\n\n/**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\nexport type KycServiceGetGeoCountryAction = {\n type: `KycService:getGeoCountry`;\n handler: KycService['getGeoCountry'];\n};\n\n/**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\nexport type KycServiceFetchDisclaimersAction = {\n type: `KycService:fetchDisclaimers`;\n handler: KycService['fetchDisclaimers'];\n};\n\n/**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\nexport type KycServiceCreateSessionAction = {\n type: `KycService:createSession`;\n handler: KycService['createSession'];\n};\n\n/**\n * Checks whether KYC is required for the given access token, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\nexport type KycServiceCheckKycRequiredAction = {\n type: `KycService:checkKycRequired`;\n handler: KycService['checkKycRequired'];\n};\n\n/**\n * Requests a per-session wrapping key from the UKYC backend.\n *\n * The client sends its ephemeral X25519 public key; the backend responds with\n * its session public key (`sessionServerPublicKey`) and a `jwtChain` that\n * attests it. The caller must verify `jwtChain` against the Fractal JWKS\n * (see {@link KycService.fetchJwks}) before trusting the key to wrap the\n * `data_encryption_key`.\n *\n * @param params - The parameters.\n * @param params.sessionClientPublicKey - Our ephemeral X25519 public key\n * (base64url).\n * @returns The wrapping key id, `jwtChain`, and session server public key.\n */\nexport type KycServiceGetWrappingKeyAction = {\n type: `KycService:getWrappingKey`;\n handler: KycService['getWrappingKey'];\n};\n\n/**\n * Fetches the Fractal encryption service JWKS used to verify the `jwtChain`\n * returned by {@link KycService.getWrappingKey}.\n *\n * This is an unauthenticated request to a well-known path on the Fractal\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\nexport type KycServiceFetchJwksAction = {\n type: `KycService:fetchJwks`;\n handler: KycService['fetchJwks'];\n};\n\n/**\n * Creates a UKYC session for the SumSub document-verification sub-flow,\n * handing over the wrapped `data_encryption_key` and the client-signed,\n * read-only `ukyc_capability_token` that authorizes later storage access for\n * the session.\n *\n * @param params - The session parameters.\n * @returns The UKYC session identifiers.\n */\nexport type KycServiceCreateUkycSessionAction = {\n type: `KycService:createUkycSession`;\n handler: KycService['createUkycSession'];\n};\n\n/**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\nexport type KycServiceCreateJourneyAction = {\n type: `KycService:createJourney`;\n handler: KycService['createJourney'];\n};\n\n/**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\nexport type KycServiceGetSessionStatusAction = {\n type: `KycService:getSessionStatus`;\n handler: KycService['getSessionStatus'];\n};\n\n/**\n * Union of all KycService action types.\n */\nexport type KycServiceMethodActions =\n | KycServiceGetGeoCountryAction\n | KycServiceFetchDisclaimersAction\n | KycServiceCreateSessionAction\n | KycServiceCheckKycRequiredAction\n | KycServiceGetWrappingKeyAction\n | KycServiceFetchJwksAction\n | KycServiceCreateUkycSessionAction\n | KycServiceCreateJourneyAction\n | KycServiceGetSessionStatusAction;\n"]}
1
+ {"version":3,"file":"KycService-method-action-types.mjs","sourceRoot":"","sources":["../src/KycService-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { KycService } from './KycService.js';\n\n/**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\nexport type KycServiceGetGeoCountryAction = {\n type: `KycService:getGeoCountry`;\n handler: KycService['getGeoCountry'];\n};\n\n/**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\nexport type KycServiceFetchDisclaimersAction = {\n type: `KycService:fetchDisclaimers`;\n handler: KycService['fetchDisclaimers'];\n};\n\n/**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\nexport type KycServiceCreateSessionAction = {\n type: `KycService:createSession`;\n handler: KycService['createSession'];\n};\n\n/**\n * Checks whether KYC is required for the given access token, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\nexport type KycServiceCheckKycRequiredAction = {\n type: `KycService:checkKycRequired`;\n handler: KycService['checkKycRequired'];\n};\n\n/**\n * Creates (or resumes) an Iron empty-shell customer for the authenticated\n * canonical user. Must run before showing Iron T&C so the customer exists in\n * `SigningsRequired` and resume logic can key off Iron status.\n *\n * @param params - The parameters.\n * @param params.email - Email associated with the Iron customer.\n * @returns The Iron customer record (subset validated for controller use).\n */\nexport type KycServiceCreateIronCustomerAction = {\n type: `KycService:createIronCustomer`;\n handler: KycService['createIronCustomer'];\n};\n\n/**\n * Fetches Iron disclaimers / terms the customer must accept before consents\n * and the SumSub sub-flow.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\nexport type KycServiceFetchIronDisclaimersAction = {\n type: `KycService:fetchIronDisclaimers`;\n handler: KycService['fetchIronDisclaimers'];\n};\n\n/**\n * Checks whether Iron still requires KYC for the authenticated canonical\n * user. Unlike the MoonPay variant, this does not take an access token.\n *\n * @returns Whether KYC is required.\n */\nexport type KycServiceCheckIronKycRequiredAction = {\n type: `KycService:checkIronKycRequired`;\n handler: KycService['checkIronKycRequired'];\n};\n\n/**\n * Posts T&C1 (Iron signings) and T&C2 (Sumsub + idOS) consents for the\n * authenticated user. The API responds with 204 No Content on success.\n *\n * @param params - The consent parameters.\n */\nexport type KycServiceSubmitConsentsAction = {\n type: `KycService:submitConsents`;\n handler: KycService['submitConsents'];\n};\n\n/**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\nexport type KycServiceFetchKycStatusAction = {\n type: `KycService:fetchKycStatus`;\n handler: KycService['fetchKycStatus'];\n};\n\n/**\n * Requests a per-session wrapping key from the UKYC backend.\n *\n * The client sends its ephemeral X25519 public key; the backend responds with\n * its session public key (`sessionServerPublicKey`) and a `jwtChain` that\n * attests it. The caller must verify `jwtChain` against the Fractal JWKS\n * (see {@link KycService.fetchJwks}) before trusting the key to wrap the\n * `data_encryption_key`.\n *\n * @param params - The parameters.\n * @param params.sessionClientPublicKey - Our ephemeral X25519 public key\n * (base64url).\n * @returns The wrapping key id, `jwtChain`, and session server public key.\n */\nexport type KycServiceGetWrappingKeyAction = {\n type: `KycService:getWrappingKey`;\n handler: KycService['getWrappingKey'];\n};\n\n/**\n * Fetches the Fractal encryption service JWKS used to verify the `jwtChain`\n * returned by {@link KycService.getWrappingKey}.\n *\n * This is an unauthenticated request to a well-known path on the Fractal\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\nexport type KycServiceFetchJwksAction = {\n type: `KycService:fetchJwks`;\n handler: KycService['fetchJwks'];\n};\n\n/**\n * Creates a UKYC session for the SumSub document-verification sub-flow,\n * handing over the wrapped `data_encryption_key` and the client-signed,\n * read-only `ukyc_capability_token` that authorizes later storage access for\n * the session.\n *\n * @param params - The session parameters.\n * @returns The UKYC session identifiers.\n */\nexport type KycServiceCreateUkycSessionAction = {\n type: `KycService:createUkycSession`;\n handler: KycService['createUkycSession'];\n};\n\n/**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\nexport type KycServiceCreateJourneyAction = {\n type: `KycService:createJourney`;\n handler: KycService['createJourney'];\n};\n\n/**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\nexport type KycServiceGetSessionStatusAction = {\n type: `KycService:getSessionStatus`;\n handler: KycService['getSessionStatus'];\n};\n\n/**\n * Union of all KycService action types.\n */\nexport type KycServiceMethodActions =\n | KycServiceGetGeoCountryAction\n | KycServiceFetchDisclaimersAction\n | KycServiceCreateSessionAction\n | KycServiceCheckKycRequiredAction\n | KycServiceCreateIronCustomerAction\n | KycServiceFetchIronDisclaimersAction\n | KycServiceCheckIronKycRequiredAction\n | KycServiceSubmitConsentsAction\n | KycServiceFetchKycStatusAction\n | KycServiceGetWrappingKeyAction\n | KycServiceFetchJwksAction\n | KycServiceCreateUkycSessionAction\n | KycServiceCreateJourneyAction\n | KycServiceGetSessionStatusAction;\n"]}
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _KycService_instances, _KycService_fetch, _KycService_baseUrl, _KycService_fractalEncryptionBaseUrl, _KycService_validateResponse, _KycService_requestJson;
13
+ var _KycService_instances, _KycService_fetch, _KycService_baseUrl, _KycService_fractalEncryptionBaseUrl, _KycService_validateResponse, _KycService_getBearerToken, _KycService_requestJson;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.KycService = exports.serviceName = void 0;
16
16
  const base_data_service_1 = require("@metamask/base-data-service");
@@ -31,6 +31,11 @@ const MESSENGER_EXPOSED_METHODS = [
31
31
  'fetchDisclaimers',
32
32
  'createSession',
33
33
  'checkKycRequired',
34
+ 'createIronCustomer',
35
+ 'fetchIronDisclaimers',
36
+ 'checkIronKycRequired',
37
+ 'submitConsents',
38
+ 'fetchKycStatus',
34
39
  'getWrappingKey',
35
40
  'fetchJwks',
36
41
  'createUkycSession',
@@ -89,6 +94,25 @@ const SessionStatusResponseStruct = (0, superstruct_1.type)({
89
94
  vendor: (0, superstruct_1.string)(),
90
95
  vendorStatus: (0, superstruct_1.string)(),
91
96
  });
97
+ // Iron customer subset — `type` (not `object`) keeps extra Iron fields from
98
+ // failing validation while still requiring the fields the controller needs.
99
+ const IronCustomerResponseStruct = (0, superstruct_1.type)({
100
+ id: (0, superstruct_1.string)(),
101
+ email: (0, superstruct_1.string)(),
102
+ status: (0, superstruct_1.string)(),
103
+ });
104
+ const KYC_USER_STATUSES = [
105
+ 'not-started',
106
+ 'pending',
107
+ 'need-more-information',
108
+ 'terminal-failure',
109
+ 'completed',
110
+ ];
111
+ const KycUserStatusResponseStruct = (0, superstruct_1.type)({
112
+ status: (0, superstruct_1.enums)([...KYC_USER_STATUSES]),
113
+ sumsubSessionId: (0, superstruct_1.optional)((0, superstruct_1.string)()),
114
+ errorCode: (0, superstruct_1.optional)((0, superstruct_1.string)()),
115
+ });
92
116
  // === SERVICE DEFINITION ===
93
117
  /**
94
118
  * `KycService` communicates with the Universal KYC (UKYC) backend to drive the
@@ -235,6 +259,111 @@ class KycService extends base_data_service_1.BaseDataService {
235
259
  const { required } = __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, KycRequiredResponseStruct, 'kyc-required');
236
260
  return { kycRequired: required };
237
261
  }
262
+ /**
263
+ * Creates (or resumes) an Iron empty-shell customer for the authenticated
264
+ * canonical user. Must run before showing Iron T&C so the customer exists in
265
+ * `SigningsRequired` and resume logic can key off Iron status.
266
+ *
267
+ * @param params - The parameters.
268
+ * @param params.email - Email associated with the Iron customer.
269
+ * @returns The Iron customer record (subset validated for controller use).
270
+ */
271
+ async createIronCustomer(params) {
272
+ const url = new URL('/vendors/iron/customers', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
273
+ const data = await this.fetchQuery({
274
+ queryKey: [`${this.name}:createIronCustomer`, params.email],
275
+ queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
276
+ method: 'POST',
277
+ body: JSON.stringify({ email: params.email }),
278
+ }),
279
+ // Customer creation/resume must never serve a stale/cached result.
280
+ staleTime: 0,
281
+ cacheTime: 0,
282
+ });
283
+ return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, IronCustomerResponseStruct, 'iron customers');
284
+ }
285
+ /**
286
+ * Fetches Iron disclaimers / terms the customer must accept before consents
287
+ * and the SumSub sub-flow.
288
+ *
289
+ * @param params - The parameters.
290
+ * @param params.country - ISO 3166-1 alpha-3 country code.
291
+ * @returns The disclaimers.
292
+ */
293
+ async fetchIronDisclaimers({ country, }) {
294
+ const url = new URL('/vendors/iron/disclaimers', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
295
+ url.searchParams.set('country', country);
296
+ const data = await this.fetchQuery({
297
+ queryKey: [`${this.name}:fetchIronDisclaimers`, country],
298
+ queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'GET' }),
299
+ staleTime: (0, utils_1.inMilliseconds)(5, utils_1.Duration.Minute),
300
+ });
301
+ return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, DisclaimersResponseStruct, 'iron disclaimers');
302
+ }
303
+ /**
304
+ * Checks whether Iron still requires KYC for the authenticated canonical
305
+ * user. Unlike the MoonPay variant, this does not take an access token.
306
+ *
307
+ * @returns Whether KYC is required.
308
+ */
309
+ async checkIronKycRequired() {
310
+ const url = new URL('/vendors/iron/kyc-required', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
311
+ const data = await this.fetchQuery({
312
+ queryKey: [`${this.name}:checkIronKycRequired`],
313
+ queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'POST', body: '{}' }),
314
+ // The requirement can change server-side, so always re-check.
315
+ staleTime: 0,
316
+ cacheTime: 0,
317
+ });
318
+ const { required } = __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, KycRequiredResponseStruct, 'iron kyc-required');
319
+ return { kycRequired: required };
320
+ }
321
+ /**
322
+ * Posts T&C1 (Iron signings) and T&C2 (Sumsub + idOS) consents for the
323
+ * authenticated user. The API responds with 204 No Content on success.
324
+ *
325
+ * @param params - The consent parameters.
326
+ */
327
+ async submitConsents(params) {
328
+ const url = new URL('/consents', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
329
+ await this.fetchQuery({
330
+ queryKey: [
331
+ `${this.name}:submitConsents`,
332
+ params.ironDisclaimerIds,
333
+ params.sumsubTncSigned,
334
+ params.idosTncSigned,
335
+ params.kycLevel ?? 'standard',
336
+ ],
337
+ queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
338
+ method: 'POST',
339
+ body: JSON.stringify({
340
+ ironDisclaimerIds: params.ironDisclaimerIds,
341
+ sumsubTncSigned: params.sumsubTncSigned,
342
+ idosTncSigned: params.idosTncSigned,
343
+ kycLevel: params.kycLevel ?? 'standard',
344
+ }),
345
+ }),
346
+ staleTime: 0,
347
+ cacheTime: 0,
348
+ });
349
+ }
350
+ /**
351
+ * Fetches the user-keyed simplified KYC status used by Money toast / banner
352
+ * surfaces (`GET /kyc/status`).
353
+ *
354
+ * @returns The simplified status payload.
355
+ */
356
+ async fetchKycStatus() {
357
+ const url = new URL('/kyc/status', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
358
+ const data = await this.fetchQuery({
359
+ queryKey: [`${this.name}:fetchKycStatus`],
360
+ queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'GET' }),
361
+ // Status is polled for toast flips, so it must always be fresh.
362
+ staleTime: 0,
363
+ cacheTime: 0,
364
+ });
365
+ return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, KycUserStatusResponseStruct, 'kyc status');
366
+ }
238
367
  /**
239
368
  * Requests a per-session wrapping key from the UKYC backend.
240
369
  *
@@ -305,10 +434,10 @@ class KycService extends base_data_service_1.BaseDataService {
305
434
  queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
306
435
  method: 'POST',
307
436
  body: JSON.stringify({
308
- vendorId: 'moonpay',
437
+ vendorId: params.vendorId ?? 'moonpay',
309
438
  vendorUserId: 'mockedId',
310
439
  jwtToken: params.jwtToken,
311
- vendorMetadata: params.vendorMetadata,
440
+ vendorMetadata: params.vendorMetadata ?? {},
312
441
  wrappedEncryptionKey: params.wrappedEncryptionKey,
313
442
  ukycCapabilityToken: (0, storageAccessToken_js_1.encodeStorageAccessTokenForHeader)(params.ukycCapabilityToken),
314
443
  }),
@@ -372,6 +501,19 @@ _KycService_fetch = new WeakMap(), _KycService_baseUrl = new WeakMap(), _KycServ
372
501
  String(error);
373
502
  throw new Error(`Malformed response received from ${apiName} API: ${detail}`);
374
503
  }
504
+ }, _KycService_getBearerToken =
505
+ /**
506
+ * Gets the authenticated wallet bearer token.
507
+ *
508
+ * @returns The bearer token.
509
+ */
510
+ async function _KycService_getBearerToken() {
511
+ const bearerToken = await this.messenger.call('AuthenticationController:getBearerToken');
512
+ (0, superstruct_1.assert)(bearerToken, (0, superstruct_1.string)());
513
+ if (!bearerToken) {
514
+ throw new Error('Unable to obtain an authentication bearer token - is the wallet signed in?');
515
+ }
516
+ return bearerToken;
375
517
  }, _KycService_requestJson =
376
518
  /**
377
519
  * Performs a single JSON request.
@@ -398,19 +540,34 @@ async function _KycService_requestJson(url, init, options = {}) {
398
540
  headers['Content-Type'] = 'application/json';
399
541
  }
400
542
  if (authenticated) {
401
- const bearerToken = await this.messenger.call('AuthenticationController:getBearerToken');
402
- (0, superstruct_1.assert)(bearerToken, (0, superstruct_1.string)());
403
- if (!bearerToken) {
404
- throw new Error('Unable to obtain an authentication bearer token — is the wallet signed in?');
405
- }
406
- headers.Authorization = `Bearer ${bearerToken}`;
543
+ headers.Authorization = `Bearer ${await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_getBearerToken).call(this)}`;
407
544
  }
408
545
  const response = await __classPrivateFieldGet(this, _KycService_fetch, "f").call(this, url.toString(), {
409
546
  ...init,
410
547
  headers,
411
548
  });
412
549
  if (!response.ok) {
413
- throw new controller_utils_1.HttpError(response.status, `Fetching '${url.toString()}' failed with status '${response.status}'`);
550
+ let detail = '';
551
+ try {
552
+ const errorBody = await response.json();
553
+ if (errorBody && typeof errorBody === 'object') {
554
+ const record = errorBody;
555
+ if (typeof record.message === 'string') {
556
+ detail = record.message;
557
+ }
558
+ else if (typeof record.error === 'string') {
559
+ detail = record.error;
560
+ }
561
+ }
562
+ }
563
+ catch {
564
+ // Ignore body parse failures; status alone is still useful.
565
+ }
566
+ throw new controller_utils_1.HttpError(response.status, `Fetching '${url.toString()}' failed with status '${response.status}'${detail ? `: ${detail}` : ''}`);
567
+ }
568
+ // Consent (and similar) endpoints return 204 No Content.
569
+ if (response.status === 204) {
570
+ return null;
414
571
  }
415
572
  return (await response.json());
416
573
  };
@@ -1 +1 @@
1
- {"version":3,"file":"KycService.cjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mEAA8D;AAO9D,iEAAuD;AAKvD,uDAQ+B;AAE/B,2CAA2D;AAG3D,wDAAmD;AAGnD,uDAAqD;AACrD,yEAAiF;AAGjF,kBAAkB;AAElB;;GAEG;AACU,QAAA,WAAW,GAAG,YAAY,CAAC;AAExC,oBAAoB;AAEpB,MAAM,yBAAyB,GAAG;IAChC,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,kBAAkB;CACV,CAAC;AAkFX,+BAA+B;AAE/B,MAAM,gBAAgB,GAAG,IAAA,kBAAI,EAAC;IAC5B,EAAE,EAAE,IAAA,oBAAM,GAAE;IACZ,YAAY,EAAE,IAAA,oBAAM,GAAE;IACtB,GAAG,EAAE,IAAA,oBAAM,GAAE;CACd,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAG,IAAA,mBAAK,EAAC,gBAAgB,CAAC,CAAC;AAE1D,MAAM,2BAA2B,GAAG,IAAA,kBAAI,EAAC,EAAE,YAAY,EAAE,IAAA,oBAAM,GAAE,EAAE,CAAC,CAAC;AAErE,6EAA6E;AAC7E,gEAAgE;AAChE,MAAM,yBAAyB,GAAG,IAAA,kBAAI,EAAC,EAAE,QAAQ,EAAE,IAAA,qBAAO,GAAE,EAAE,CAAC,CAAC;AAEhE,wEAAwE;AACxE,8EAA8E;AAC9E,MAAM,4BAA4B,GAAG,IAAA,kBAAI,EAAC;IACxC,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,CAAC,EAAE,IAAA,oBAAM,GAAE;CACZ,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,IAAA,kBAAI,EAAC;IACrC,EAAE,EAAE,IAAA,oBAAM,GAAE;IACZ,QAAQ,EAAE,IAAA,oBAAM,GAAE;IAClB,sBAAsB,EAAE,4BAA4B;CACrD,CAAC,CAAC;AAGH,6EAA6E;AAC7E,iDAAiD;AACjD,MAAM,SAAS,GAAG,IAAA,kBAAI,EAAC;IACrB,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,CAAC,EAAE,IAAA,oBAAM,GAAE;IACX,GAAG,EAAE,IAAA,oBAAM,GAAE;CACd,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,IAAA,kBAAI,EAAC,EAAE,IAAI,EAAE,IAAA,mBAAK,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAG5D,MAAM,yBAAyB,GAAG,IAAA,kBAAI,EAAC;IACrC,SAAS,EAAE,IAAA,oBAAM,GAAE;IACnB,0EAA0E;IAC1E,+EAA+E;IAC/E,mEAAmE;IACnE,SAAS,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC7B,WAAW,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;CAChC,CAAC,CAAC;AAGH,MAAM,kCAAkC,GAAG,IAAA,kBAAI,EAAC;IAC9C,MAAM,EAAE,IAAA,oBAAM,GAAE;IAChB,oBAAoB,EAAE,IAAA,oBAAM,GAAE;CAC/B,CAAC,CAAC;AAKH,MAAM,2BAA2B,GAAG,IAAA,kBAAI,EAAC;IACvC,WAAW,EAAE,IAAA,oBAAM,GAAE;IACrB,aAAa,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACjC,cAAc,EAAE,IAAA,oBAAM,GAAE;IACxB,SAAS,EAAE,IAAA,oBAAM,GAAE;IACnB,MAAM,EAAE,IAAA,oBAAM,GAAE;IAChB,YAAY,EAAE,IAAA,oBAAM,GAAE;CACvB,CAAC,CAAC;AAkDH,6BAA6B;AAE7B;;;;;;;;;;;;GAYG;AACH,MAAa,UAAW,SAAQ,mCAG/B;IAOC;;;;;;;;;;;;;OAaG;IACH,YAAY,EACV,SAAS,EACT,KAAK,EAAE,aAAa,EACpB,OAAO,EACP,wBAAwB,EACxB,iBAAiB,GAAG,EAAE,EACtB,aAAa,GAAG,EAAE,GACA;QAClB,KAAK,CAAC;YACJ,IAAI,EAAE,mBAAW;YACjB,SAAS;YACT,iBAAiB;YACjB,aAAa;SACd,CAAC,CAAC;;QAjCI,oCAAqB;QAErB,sCAAiB;QAEjB,uDAAkC;QA8BzC,uBAAA,IAAI,qBAAU,aAAa,MAAA,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,uBAAA,IAAI,uBAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,wCAA6B,wBAAwB,IAAI,EAAE,MAAA,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,sCAAsC,CACvC,CAAC;QACF,0EAA0E;QAC1E,kEAAkE;QAClE,+DAA+D;QAC/D,uBAAuB;QACvB,MAAM,MAAM,GACV,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,sDAAsD,MAAM,CAC1D,QAAQ,CACT,KAAK,CACP,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,gCAAc,EAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,kCAAkC,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB,CAAC,EACrB,OAAO,GAGR;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,8BAA8B,EAAE,uBAAA,IAAI,2BAAS,CAAC,CAAC;QACnE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,EAAE,OAAO,CAAC;YACpD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC9D,SAAS,EAAE,IAAA,sBAAc,EAAC,CAAC,EAAE,gBAAQ,CAAC,MAAM,CAAC;SAC9C,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,yBAAyB,EACzB,aAAa,CACK,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CACjB,MAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,2BAA2B,EAAE,uBAAA,IAAI,2BAAS,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,IAAI,gBAAgB;gBAC5B,MAAM,CAAC,KAAK;gBACZ,MAAM,CAAC,eAAe;gBACtB,MAAM,CAAC,aAAa;aACrB;YACD,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE;gBACrB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;aAC7B,CAAC;YACJ,sEAAsE;YACtE,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,2BAA2B,EAC3B,UAAU,CACX,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAA8B;QAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+BAA+B,EAAE,uBAAA,IAAI,2BAAS,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,IAAI,mBAAmB;gBAC/B,MAAM,CAAC,WAAW;gBAClB,MAAM,CAAC,OAAO;gBACd,YAAY;aACb;YACD,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE;gBACrB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,YAAY;iBACb,CAAC;aACH,CAAC;YACJ,8DAA8D;YAC9D,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACvB,IAAI,EACJ,yBAAyB,EACzB,cAAc,CACf,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,cAAc,CAClB,MAA4B;QAE5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,uBAAA,IAAI,2BAAS,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,iBAAiB,EAAE,MAAM,CAAC,sBAAsB,CAAC;YACxE,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE;gBACrB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;iBACtD,CAAC;aACH,CAAC;YACJ,oDAAoD;YACpD,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,yBAAyB,EACzB,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,uBAAA,IAAI,4CAA0B,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,6BAAc,EAAE,uBAAA,IAAI,4CAA0B,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,YAAY,EAAE,uBAAA,IAAI,4CAA0B,CAAC;YACpE,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;YACrE,SAAS,EAAE,IAAA,sBAAc,EAAC,CAAC,EAAE,gBAAQ,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EAAmB,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,iBAAiB,CACrB,MAA+B;QAE/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,uBAAA,IAAI,2BAAS,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,IAAI,oBAAoB;gBAChC,MAAM,CAAC,oBAAoB,CAAC,SAAS;aACtC;YACD,OAAO,EAAE,KAAK,IAAI,EAAE,CAClB,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE;gBACrB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,QAAQ,EAAE,SAAS;oBACnB,YAAY,EAAE,UAAU;oBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;oBACjD,mBAAmB,EAAE,IAAA,yDAAiC,EACpD,MAAM,CAAC,mBAAmB,CAC3B;iBACF,CAAC;aACH,CAAC;YACJ,sEAAsE;YACtE,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,yBAAyB,EACzB,eAAe,CAChB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,SAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,aAAa,kBAAkB,CAAC,SAAS,CAAC,UAAU,EACpD,uBAAA,IAAI,2BAAS,CACd,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE,SAAS,CAAC;YACnD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC/D,mEAAmE;YACnE,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,kCAAkC,EAClC,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAA8B;QAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,aAAa,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAC1D,uBAAA,IAAI,2BAAS,CACd,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC9D,wEAAwE;YACxE,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,EACT,IAAI,EACJ,2BAA2B,EAC3B,gBAAgB,CACjB,CAAC;IACJ,CAAC;CA+FF;AAvbD,gCAubC;0OA9EG,IAAa,EACb,MAA4B,EAC5B,OAAe;IAEf,IAAI,CAAC;QACH,IAAA,oBAAM,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,KAAK,YAAY,yBAAW;YAC1B,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,eAAe,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;YACxD,CAAC,CAAC,qEAAqE;gBACrE,+DAA+D;gBAC/D,0BAA0B;gBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,oCAAoC,OAAO,SAAS,MAAM,EAAE,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,KAAK,kCACH,GAAQ,EACR,IAAiB,EACjB,UAAuC,EAAE;IAEzC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,0EAA0E;IAC1E,0DAA0D;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,yCAAyC,CAC1C,CAAC;QACF,IAAA,oBAAM,EAAC,WAAW,EAAE,IAAA,oBAAM,GAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,aAAa,GAAG,UAAU,WAAW,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,yBAAO,MAAX,IAAI,EAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE;QACjD,GAAG,IAAI;QACP,OAAO;KACR,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,4BAAS,CACjB,QAAQ,CAAC,MAAM,EACf,aAAa,GAAG,CAAC,QAAQ,EAAE,yBAAyB,QAAQ,CAAC,MAAM,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS,CAAC;AACzC,CAAC","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type { KycDisclaimer, KycSessionStatus } from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\nimport { encodeStorageAccessTokenForHeader } from './ukyc/storageAccessToken.js';\nimport type { UkycStorageAccessToken } from './ukyc/storageAccessToken.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'getWrappingKey',\n 'fetchJwks',\n 'createUkycSession',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent =\n DataServiceCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n fetch: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the Fractal encryption service, from which the JWKS used to\n * verify the `jwtChain` returned by {@link KycService.getWrappingKey} is\n * fetched. Required to run the wrapping-key exchange in\n * {@link KycService.fetchJwks}.\n */\n fractalEncryptionBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`cacheTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's X25519 public key, in JWK-like form, returned by\n// `/wrapping-key`. `x` is the base64url public key used to wrap the user key.\nconst SessionServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n});\n\nconst WrappingKeyResponseStruct = type({\n id: string(),\n jwtChain: string(),\n sessionServerPublicKey: SessionServerPublicKeyStruct,\n});\nexport type WrappingKeyResponse = Infer<typeof WrappingKeyResponseStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // The relay-side KYC decision (e.g. `approved`) and the vendor-side final\n // status (e.g. `pending`) at session-creation time. Present when the applicant\n // already has a session in flight; absent for a brand-new session.\n kycStatus: optional(string()),\n finalStatus: optional(string()),\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n accessToken: string;\n country: string;\n capabilities?: { product: string }[];\n};\n\nexport type GetWrappingKeyParams = {\n sessionClientPublicKey: string;\n};\n\n/**\n * The wrapped `data_encryption_key` sent to the UKYC backend when creating a\n * session. `encryptedKey` and `nonce` are produced by `wrapEncryptionKey`;\n * `sessionId` is the wrapping key id returned by `getWrappingKey`.\n */\nexport type WrappedEncryptionKey = {\n sessionId: string;\n encryptedKey: string;\n nonce: string;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n vendorMetadata: Record<string, unknown>;\n wrappedEncryptionKey: WrappedEncryptionKey;\n /**\n * The client-signed `ukyc_capability_token` (envelope: payload + Ed25519\n * signature) authorizing later storage access for this session. It is minted\n * by the client with `read`-only scope — see the UKYC storage-and-auth spec\n * for how it is formed. Only the client holds the signing key, so only the\n * client can mint it. The envelope is base64url-encoded into a compact string\n * before it is sent to the backend.\n */\n ukycCapabilityToken: UkycStorageAccessToken;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through an injected `fetch`, and the auth bearer token and\n * geolocation come from other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so every request is routed through\n * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit\n * breaker) and its result is exposed via the service's `QueryClient`. Read-only\n * endpoints (`fetchDisclaimers`, `fetchJwks`) are cached with a `staleTime`;\n * the session-creating and status-polling endpoints opt out of caching\n * (`staleTime`/`cacheTime` of `0`) so they never serve a stale result.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #fractalEncryptionBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.fractalEncryptionBaseUrl - Base URL of the Fractal\n * encryption service, from which the JWKS used to verify the wrapping-key\n * `jwtChain` is fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n fractalEncryptionBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n this.#fetch = fetchFunction;\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#fractalEncryptionBaseUrl = fractalEncryptionBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchDisclaimers({\n country,\n }: {\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL('/vendors/moonpay/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimers`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createSession`,\n params.email,\n params.termsAcceptedAt,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given access token, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const url = new URL('/vendors/moonpay/kyc-required', this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:checkKycRequired`,\n params.accessToken,\n params.country,\n capabilities,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }),\n }),\n // The requirement can change server-side, so always re-check.\n staleTime: 0,\n cacheTime: 0,\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Requests a per-session wrapping key from the UKYC backend.\n *\n * The client sends its ephemeral X25519 public key; the backend responds with\n * its session public key (`sessionServerPublicKey`) and a `jwtChain` that\n * attests it. The caller must verify `jwtChain` against the Fractal JWKS\n * (see {@link KycService.fetchJwks}) before trusting the key to wrap the\n * `data_encryption_key`.\n *\n * @param params - The parameters.\n * @param params.sessionClientPublicKey - Our ephemeral X25519 public key\n * (base64url).\n * @returns The wrapping key id, `jwtChain`, and session server public key.\n */\n async getWrappingKey(\n params: GetWrappingKeyParams,\n ): Promise<WrappingKeyResponse> {\n const url = new URL('/wrapping-key', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getWrappingKey`, params.sessionClientPublicKey],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n sessionClientPublicKey: params.sessionClientPublicKey,\n }),\n }),\n // A per-session key exchange must always run fresh.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n WrappingKeyResponseStruct,\n 'wrapping-key',\n );\n }\n\n /**\n * Fetches the Fractal encryption service JWKS used to verify the `jwtChain`\n * returned by {@link KycService.getWrappingKey}.\n *\n * This is an unauthenticated request to a well-known path on the Fractal\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchJwks(): Promise<JwksResponse> {\n if (!this.#fractalEncryptionBaseUrl) {\n throw new Error(\n 'KycService: fractalEncryptionBaseUrl is not configured; cannot fetch JWKS to verify the wrapping key.',\n );\n }\n const url = new URL(UKYC_JWKS_PATH, this.#fractalEncryptionBaseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchJwks`, this.#fractalEncryptionBaseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, 'JWKS');\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow,\n * handing over the wrapped `data_encryption_key` and the client-signed,\n * read-only `ukyc_capability_token` that authorizes later storage access for\n * the session.\n *\n * @param params - The session parameters.\n * @returns The UKYC session identifiers.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createUkycSession`,\n params.wrappedEncryptionKey.sessionId,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n vendorMetadata: params.vendorMetadata,\n wrappedEncryptionKey: params.wrappedEncryptionKey,\n ukycCapabilityToken: encodeStorageAccessTokenForHeader(\n params.ukycCapabilityToken,\n ),\n }),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createJourney`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'POST' }),\n // Journeys are (re)created on demand; do not reuse a cached token.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Performs a single JSON request.\n *\n * This is meant to be used as the `queryFn` for {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the Fractal JWKS endpoint).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n assert(bearerToken, string());\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token — is the wallet signed in?',\n );\n }\n headers.Authorization = `Bearer ${bearerToken}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'`,\n );\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
1
+ {"version":3,"file":"KycService.cjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n enums,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type {\n KycDisclaimer,\n KycSessionStatus,\n KycUserStatusResponse,\n KycVendor,\n} from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\nimport { encodeStorageAccessTokenForHeader } from './ukyc/storageAccessToken.js';\nimport type { UkycStorageAccessToken } from './ukyc/storageAccessToken.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'createIronCustomer',\n 'fetchIronDisclaimers',\n 'checkIronKycRequired',\n 'submitConsents',\n 'fetchKycStatus',\n 'getWrappingKey',\n 'fetchJwks',\n 'createUkycSession',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n fetch: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the Fractal encryption service, from which the JWKS used to\n * verify the `jwtChain` returned by {@link KycService.getWrappingKey} is\n * fetched. Required to run the wrapping-key exchange in\n * {@link KycService.fetchJwks}.\n */\n fractalEncryptionBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`cacheTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's X25519 public key, in JWK-like form, returned by\n// `/wrapping-key`. `x` is the base64url public key used to wrap the user key.\nconst SessionServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n});\n\nconst WrappingKeyResponseStruct = type({\n id: string(),\n jwtChain: string(),\n sessionServerPublicKey: SessionServerPublicKeyStruct,\n});\nexport type WrappingKeyResponse = Infer<typeof WrappingKeyResponseStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // The relay-side KYC decision (e.g. `approved`) and the vendor-side final\n // status (e.g. `pending`) at session-creation time. Present when the applicant\n // already has a session in flight; absent for a brand-new session.\n kycStatus: optional(string()),\n finalStatus: optional(string()),\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// Iron customer subset — `type` (not `object`) keeps extra Iron fields from\n// failing validation while still requiring the fields the controller needs.\nconst IronCustomerResponseStruct = type({\n id: string(),\n email: string(),\n status: string(),\n});\nexport type IronCustomerResponse = Infer<typeof IronCustomerResponseStruct>;\n\nconst KYC_USER_STATUSES = [\n 'not-started',\n 'pending',\n 'need-more-information',\n 'terminal-failure',\n 'completed',\n] as const;\n\nconst KycUserStatusResponseStruct = type({\n status: enums([...KYC_USER_STATUSES]),\n sumsubSessionId: optional(string()),\n errorCode: optional(string()),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n accessToken: string;\n country: string;\n capabilities?: { product: string }[];\n};\n\nexport type CreateIronCustomerParams = {\n email: string;\n};\n\nexport type SubmitConsentsParams = {\n ironDisclaimerIds: string[];\n sumsubTncSigned: boolean;\n idosTncSigned: boolean;\n kycLevel?: 'standard';\n};\n\nexport type GetWrappingKeyParams = {\n sessionClientPublicKey: string;\n};\n\n/**\n * The wrapped `data_encryption_key` sent to the UKYC backend when creating a\n * session. `encryptedKey` and `nonce` are produced by `wrapEncryptionKey`;\n * `sessionId` is the wrapping key id returned by `getWrappingKey`.\n */\nexport type WrappedEncryptionKey = {\n sessionId: string;\n encryptedKey: string;\n nonce: string;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n /**\n * Identity vendor for the UKYC session. Defaults to `moonpay` for the\n * existing Check/Auth flow. Pass `iron` for the Money/VBA path (no MoonPay\n * metadata required).\n */\n vendorId?: KycVendor;\n /**\n * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /\n * `moonPayUserId`); optional / omitted for Iron.\n */\n vendorMetadata?: Record<string, unknown>;\n wrappedEncryptionKey: WrappedEncryptionKey;\n /**\n * The client-signed `ukyc_capability_token` (envelope: payload + Ed25519\n * signature) authorizing later storage access for this session. It is minted\n * by the client with `read`-only scope — see the UKYC storage-and-auth spec\n * for how it is formed. Only the client holds the signing key, so only the\n * client can mint it. The envelope is base64url-encoded into a compact string\n * before it is sent to the backend.\n */\n ukycCapabilityToken: UkycStorageAccessToken;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through an injected `fetch`, and the auth bearer token and\n * geolocation come from other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so every request is routed through\n * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit\n * breaker) and its result is exposed via the service's `QueryClient`. Read-only\n * endpoints (`fetchDisclaimers`, `fetchJwks`) are cached with a `staleTime`;\n * the session-creating and status-polling endpoints opt out of caching\n * (`staleTime`/`cacheTime` of `0`) so they never serve a stale result.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #fractalEncryptionBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.fractalEncryptionBaseUrl - Base URL of the Fractal\n * encryption service, from which the JWKS used to verify the wrapping-key\n * `jwtChain` is fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n fractalEncryptionBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n this.#fetch = fetchFunction;\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#fractalEncryptionBaseUrl = fractalEncryptionBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchDisclaimers({\n country,\n }: {\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL('/vendors/moonpay/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimers`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createSession`,\n params.email,\n params.termsAcceptedAt,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given access token, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const url = new URL('/vendors/moonpay/kyc-required', this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:checkKycRequired`,\n params.accessToken,\n params.country,\n capabilities,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }),\n }),\n // The requirement can change server-side, so always re-check.\n staleTime: 0,\n cacheTime: 0,\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Creates (or resumes) an Iron empty-shell customer for the authenticated\n * canonical user. Must run before showing Iron T&C so the customer exists in\n * `SigningsRequired` and resume logic can key off Iron status.\n *\n * @param params - The parameters.\n * @param params.email - Email associated with the Iron customer.\n * @returns The Iron customer record (subset validated for controller use).\n */\n async createIronCustomer(\n params: CreateIronCustomerParams,\n ): Promise<IronCustomerResponse> {\n const url = new URL('/vendors/iron/customers', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createIronCustomer`, params.email],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ email: params.email }),\n }),\n // Customer creation/resume must never serve a stale/cached result.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n IronCustomerResponseStruct,\n 'iron customers',\n );\n }\n\n /**\n * Fetches Iron disclaimers / terms the customer must accept before consents\n * and the SumSub sub-flow.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchIronDisclaimers({\n country,\n }: {\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL('/vendors/iron/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchIronDisclaimers`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'iron disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Checks whether Iron still requires KYC for the authenticated canonical\n * user. Unlike the MoonPay variant, this does not take an access token.\n *\n * @returns Whether KYC is required.\n */\n async checkIronKycRequired(): Promise<{ kycRequired: boolean }> {\n const url = new URL('/vendors/iron/kyc-required', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:checkIronKycRequired`],\n queryFn: async () =>\n this.#requestJson(url, { method: 'POST', body: '{}' }),\n // The requirement can change server-side, so always re-check.\n staleTime: 0,\n cacheTime: 0,\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'iron kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Posts T&C1 (Iron signings) and T&C2 (Sumsub + idOS) consents for the\n * authenticated user. The API responds with 204 No Content on success.\n *\n * @param params - The consent parameters.\n */\n async submitConsents(params: SubmitConsentsParams): Promise<void> {\n const url = new URL('/consents', this.#baseUrl);\n await this.fetchQuery({\n queryKey: [\n `${this.name}:submitConsents`,\n params.ironDisclaimerIds,\n params.sumsubTncSigned,\n params.idosTncSigned,\n params.kycLevel ?? 'standard',\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n ironDisclaimerIds: params.ironDisclaimerIds,\n sumsubTncSigned: params.sumsubTncSigned,\n idosTncSigned: params.idosTncSigned,\n kycLevel: params.kycLevel ?? 'standard',\n }),\n }),\n staleTime: 0,\n cacheTime: 0,\n });\n }\n\n /**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\n async fetchKycStatus(): Promise<KycUserStatusResponse> {\n const url = new URL('/kyc/status', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchKycStatus`],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for toast flips, so it must always be fresh.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n KycUserStatusResponseStruct,\n 'kyc status',\n );\n }\n\n /**\n * Requests a per-session wrapping key from the UKYC backend.\n *\n * The client sends its ephemeral X25519 public key; the backend responds with\n * its session public key (`sessionServerPublicKey`) and a `jwtChain` that\n * attests it. The caller must verify `jwtChain` against the Fractal JWKS\n * (see {@link KycService.fetchJwks}) before trusting the key to wrap the\n * `data_encryption_key`.\n *\n * @param params - The parameters.\n * @param params.sessionClientPublicKey - Our ephemeral X25519 public key\n * (base64url).\n * @returns The wrapping key id, `jwtChain`, and session server public key.\n */\n async getWrappingKey(\n params: GetWrappingKeyParams,\n ): Promise<WrappingKeyResponse> {\n const url = new URL('/wrapping-key', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getWrappingKey`, params.sessionClientPublicKey],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n sessionClientPublicKey: params.sessionClientPublicKey,\n }),\n }),\n // A per-session key exchange must always run fresh.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n WrappingKeyResponseStruct,\n 'wrapping-key',\n );\n }\n\n /**\n * Fetches the Fractal encryption service JWKS used to verify the `jwtChain`\n * returned by {@link KycService.getWrappingKey}.\n *\n * This is an unauthenticated request to a well-known path on the Fractal\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchJwks(): Promise<JwksResponse> {\n if (!this.#fractalEncryptionBaseUrl) {\n throw new Error(\n 'KycService: fractalEncryptionBaseUrl is not configured; cannot fetch JWKS to verify the wrapping key.',\n );\n }\n const url = new URL(UKYC_JWKS_PATH, this.#fractalEncryptionBaseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchJwks`, this.#fractalEncryptionBaseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, 'JWKS');\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow,\n * handing over the wrapped `data_encryption_key` and the client-signed,\n * read-only `ukyc_capability_token` that authorizes later storage access for\n * the session.\n *\n * @param params - The session parameters.\n * @returns The UKYC session identifiers.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createUkycSession`,\n params.wrappedEncryptionKey.sessionId,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: params.vendorId ?? 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n vendorMetadata: params.vendorMetadata ?? {},\n wrappedEncryptionKey: params.wrappedEncryptionKey,\n ukycCapabilityToken: encodeStorageAccessTokenForHeader(\n params.ukycCapabilityToken,\n ),\n }),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createJourney`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'POST' }),\n // Journeys are (re)created on demand; do not reuse a cached token.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n cacheTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Gets the authenticated wallet bearer token.\n *\n * @returns The bearer token.\n */\n async #getBearerToken(): Promise<string> {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n assert(bearerToken, string());\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token - is the wallet signed in?',\n );\n }\n return bearerToken;\n }\n\n /**\n * Performs a single JSON request.\n *\n * This is meant to be used as the `queryFn` for {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the Fractal JWKS endpoint).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n headers.Authorization = `Bearer ${await this.#getBearerToken()}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n let detail = '';\n try {\n const errorBody: unknown = await response.json();\n if (errorBody && typeof errorBody === 'object') {\n const record = errorBody as Record<string, unknown>;\n if (typeof record.message === 'string') {\n detail = record.message;\n } else if (typeof record.error === 'string') {\n detail = record.error;\n }\n }\n } catch {\n // Ignore body parse failures; status alone is still useful.\n }\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'${\n detail ? `: ${detail}` : ''\n }`,\n );\n }\n\n // Consent (and similar) endpoints return 204 No Content.\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
@@ -7,7 +7,7 @@ import type { AuthenticationControllerGetBearerTokenAction } from "@metamask/pro
7
7
  import type { Infer, Struct } from "@metamask/superstruct";
8
8
  import type { QueryClientConfig } from "@tanstack/query-core";
9
9
  import type { KycServiceMethodActions } from "./KycService-method-action-types.cjs";
10
- import type { KycDisclaimer, KycSessionStatus } from "./types.cjs";
10
+ import type { KycDisclaimer, KycSessionStatus, KycUserStatusResponse, KycVendor } from "./types.cjs";
11
11
  import type { UkycStorageAccessToken } from "./ukyc/storageAccessToken.cjs";
12
12
  /**
13
13
  * The name of the {@link KycService}, used to namespace the service's actions.
@@ -142,6 +142,16 @@ declare const ApplicantAccessTokenResponseStruct: Struct<{
142
142
  applicantAccessToken: Struct<string, null>;
143
143
  }>;
144
144
  export type ApplicantAccessTokenResponse = Infer<typeof ApplicantAccessTokenResponseStruct>;
145
+ declare const IronCustomerResponseStruct: Struct<{
146
+ id: string;
147
+ status: string;
148
+ email: string;
149
+ }, {
150
+ id: Struct<string, null>;
151
+ email: Struct<string, null>;
152
+ status: Struct<string, null>;
153
+ }>;
154
+ export type IronCustomerResponse = Infer<typeof IronCustomerResponseStruct>;
145
155
  export type CreateSessionParams = {
146
156
  email: string;
147
157
  termsAcceptedAt: string;
@@ -154,6 +164,15 @@ export type CheckKycRequiredParams = {
154
164
  product: string;
155
165
  }[];
156
166
  };
167
+ export type CreateIronCustomerParams = {
168
+ email: string;
169
+ };
170
+ export type SubmitConsentsParams = {
171
+ ironDisclaimerIds: string[];
172
+ sumsubTncSigned: boolean;
173
+ idosTncSigned: boolean;
174
+ kycLevel?: 'standard';
175
+ };
157
176
  export type GetWrappingKeyParams = {
158
177
  sessionClientPublicKey: string;
159
178
  };
@@ -169,7 +188,17 @@ export type WrappedEncryptionKey = {
169
188
  };
170
189
  export type CreateUkycSessionParams = {
171
190
  jwtToken: string;
172
- vendorMetadata: Record<string, unknown>;
191
+ /**
192
+ * Identity vendor for the UKYC session. Defaults to `moonpay` for the
193
+ * existing Check/Auth flow. Pass `iron` for the Money/VBA path (no MoonPay
194
+ * metadata required).
195
+ */
196
+ vendorId?: KycVendor;
197
+ /**
198
+ * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /
199
+ * `moonPayUserId`); optional / omitted for Iron.
200
+ */
201
+ vendorMetadata?: Record<string, unknown>;
173
202
  wrappedEncryptionKey: WrappedEncryptionKey;
174
203
  /**
175
204
  * The client-signed `ukyc_capability_token` (envelope: payload + Ed25519
@@ -250,6 +279,50 @@ export declare class KycService extends BaseDataService<typeof serviceName, KycS
250
279
  checkKycRequired(params: CheckKycRequiredParams): Promise<{
251
280
  kycRequired: boolean;
252
281
  }>;
282
+ /**
283
+ * Creates (or resumes) an Iron empty-shell customer for the authenticated
284
+ * canonical user. Must run before showing Iron T&C so the customer exists in
285
+ * `SigningsRequired` and resume logic can key off Iron status.
286
+ *
287
+ * @param params - The parameters.
288
+ * @param params.email - Email associated with the Iron customer.
289
+ * @returns The Iron customer record (subset validated for controller use).
290
+ */
291
+ createIronCustomer(params: CreateIronCustomerParams): Promise<IronCustomerResponse>;
292
+ /**
293
+ * Fetches Iron disclaimers / terms the customer must accept before consents
294
+ * and the SumSub sub-flow.
295
+ *
296
+ * @param params - The parameters.
297
+ * @param params.country - ISO 3166-1 alpha-3 country code.
298
+ * @returns The disclaimers.
299
+ */
300
+ fetchIronDisclaimers({ country, }: {
301
+ country: string;
302
+ }): Promise<KycDisclaimer[]>;
303
+ /**
304
+ * Checks whether Iron still requires KYC for the authenticated canonical
305
+ * user. Unlike the MoonPay variant, this does not take an access token.
306
+ *
307
+ * @returns Whether KYC is required.
308
+ */
309
+ checkIronKycRequired(): Promise<{
310
+ kycRequired: boolean;
311
+ }>;
312
+ /**
313
+ * Posts T&C1 (Iron signings) and T&C2 (Sumsub + idOS) consents for the
314
+ * authenticated user. The API responds with 204 No Content on success.
315
+ *
316
+ * @param params - The consent parameters.
317
+ */
318
+ submitConsents(params: SubmitConsentsParams): Promise<void>;
319
+ /**
320
+ * Fetches the user-keyed simplified KYC status used by Money toast / banner
321
+ * surfaces (`GET /kyc/status`).
322
+ *
323
+ * @returns The simplified status payload.
324
+ */
325
+ fetchKycStatus(): Promise<KycUserStatusResponse>;
253
326
  /**
254
327
  * Requests a per-session wrapping key from the UKYC backend.
255
328
  *