@metamask-previews/kyc-controller 0.0.0-preview-8bfa290fb → 0.0.0-preview-ec24abb79
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.
- package/CHANGELOG.md +0 -6
- package/dist/KycController.cjs +17 -31
- package/dist/KycController.cjs.map +1 -1
- package/dist/KycController.d.cts +3 -3
- package/dist/KycController.d.cts.map +1 -1
- package/dist/KycController.d.mts +3 -3
- package/dist/KycController.d.mts.map +1 -1
- package/dist/KycController.mjs +17 -31
- package/dist/KycController.mjs.map +1 -1
- package/dist/KycService-method-action-types.cjs.map +1 -1
- package/dist/KycService-method-action-types.d.cts +6 -23
- package/dist/KycService-method-action-types.d.cts.map +1 -1
- package/dist/KycService-method-action-types.d.mts +6 -23
- package/dist/KycService-method-action-types.d.mts.map +1 -1
- package/dist/KycService-method-action-types.mjs.map +1 -1
- package/dist/KycService.cjs +118 -91
- package/dist/KycService.cjs.map +1 -1
- package/dist/KycService.d.cts +12 -38
- package/dist/KycService.d.cts.map +1 -1
- package/dist/KycService.d.mts +12 -38
- package/dist/KycService.d.mts.map +1 -1
- package/dist/KycService.mjs +118 -91
- package/dist/KycService.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +6 -15
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +6 -15
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/ukyc/wrapEncryptionKey.cjs +9 -4
- package/dist/ukyc/wrapEncryptionKey.cjs.map +1 -1
- package/dist/ukyc/wrapEncryptionKey.d.cts +10 -8
- package/dist/ukyc/wrapEncryptionKey.d.cts.map +1 -1
- package/dist/ukyc/wrapEncryptionKey.d.mts +10 -8
- package/dist/ukyc/wrapEncryptionKey.d.mts.map +1 -1
- package/dist/ukyc/wrapEncryptionKey.mjs +9 -4
- package/dist/ukyc/wrapEncryptionKey.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/logger.cjs +0 -9
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.d.cts +0 -6
- package/dist/logger.d.cts.map +0 -1
- package/dist/logger.d.mts +0 -6
- package/dist/logger.d.mts.map +0 -1
- package/dist/logger.mjs +0 -6
- package/dist/logger.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -30,8 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
30
30
|
|
|
31
31
|
### Changed
|
|
32
32
|
|
|
33
|
-
- Add `KycService.fetchDisclaimersCatalog` / `KycService:fetchDisclaimersCatalog` (`GET /disclaimers?country=`, ISO 3166-1 alpha-3) for the pre-session idOS + KYC-provider catalog, plus the `KycDisclaimersCatalog` type (no `credentialReusabilityConsentGiven`). `fetchSessionDisclaimers` remains session-scoped (`GET /sessions/{sessionId}/disclaimers` → `KycSessionDisclaimers`). ([#10011](https://github.com/MetaMask/core/pull/10011))
|
|
34
|
-
- **BREAKING:** Rename `KycService.fetchDisclaimers` / `KycService:fetchDisclaimers` / `KycServiceFetchDisclaimersAction` to `fetchVendorDisclaimers` / `KycService:fetchVendorDisclaimers` / `KycServiceFetchVendorDisclaimersAction`. ([#10011](https://github.com/MetaMask/core/pull/10011))
|
|
35
33
|
- **BREAKING:** Rename `fractalEncryptionBaseUrl` to `idosEnclaveBaseUrl`, `KycService.fetchJwks` / `KycService:fetchJwks` / `KycServiceFetchJwksAction` to `fetchIdosEnclaveJwks` / `KycService:fetchIdosEnclaveJwks` / `KycServiceFetchIdosEnclaveJwksAction`, and related Fractal encryption naming to idOS enclave. ([#10008](https://github.com/MetaMask/core/pull/10008))
|
|
36
34
|
- **BREAKING:** Verify `encryptionDataKey` against idOS enclave JWKS (`KycService:fetchIdosEnclaveJwks` / `idosEnclaveBaseUrl`) and `ukycCapabilityToken` against idOS relay JWKS (`KycService:fetchIdosRelayJwks` / `idosRelayBaseUrl`) when wrapping UKYC authorizations, instead of validating both schemas against Fractal. Hosts must supply `idosRelayBaseUrl` on `KycService` construction (same class of requirement as `idosEnclaveBaseUrl`). ([#10008](https://github.com/MetaMask/core/pull/10008))
|
|
37
35
|
- **BREAKING:** Require `sessionClientPublicKey` (unpadded base64url X25519 public key) and `residenceCountry` (ISO 3166-1 alpha-3) on `KycService.createUkycSession` (`POST /sessions`). The controller generates the per-session keypair before creating the session and uses the private half to wrap authorizations; residence country is taken from the resolved geo country. ([#9993](https://github.com/MetaMask/core/pull/9993))
|
|
@@ -42,13 +40,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
42
40
|
- **BREAKING:** Require `sumsubTncSigned` and `idosTncSigned` on `acceptTermsAndStartSession` for every vendor, so callers explicitly declare T&C2 acceptance. Zero-argument calls and omitted flags fail instead of defaulting to `true`. ([#9908](https://github.com/MetaMask/core/pull/9908))
|
|
43
41
|
- Rename `CreateUkycSessionParams.vendorId` to `vendor` for consistency with other service methods. ([#9908](https://github.com/MetaMask/core/pull/9908))
|
|
44
42
|
- Bump `@metamask/base-data-service` from `^0.1.3` to `^1.0.0` ([#9972](https://github.com/MetaMask/core/pull/9972))
|
|
45
|
-
- Replace `KycController` `console.error` tracing with the `@metamask/utils` debug logger (`createProjectLogger` / `createModuleLogger`), so flow diagnostics are opt-in via `DEBUG=kyc-controller*` instead of always printing to the console. ([#10054](https://github.com/MetaMask/core/pull/10054))
|
|
46
|
-
- Bump `@metamask/utils` from `^11.11.0` to `^11.12.0` ([#10076](https://github.com/MetaMask/core/pull/10076))
|
|
47
43
|
|
|
48
44
|
### Fixed
|
|
49
45
|
|
|
50
|
-
- Stop routing `KycService` write endpoints through the query cache. Every `POST` (`createSession`, `checkKycRequired`, `createVendorCustomer`, `submitVendorDisclaimers`, `submitSessionDisclaimers`, `createUkycSession`, `setAuthorizations`, `createJourney`) now issues its request directly instead of via `fetchQuery`. Previously these were modelled as queries, so two overlapping calls sharing a `queryKey` were deduplicated into a single request — a second `createVendorCustomer` while the first was in flight never reached the API — and their responses were retained in the cache and published on the messenger as `cacheUpdated` payloads, which for these endpoints include session tokens and applicant access tokens. Writes are also no longer retried by the service policy, so a failed non-idempotent request cannot create duplicate records server-side. ([#10007](https://github.com/MetaMask/core/pull/10007))
|
|
51
|
-
- Stop incorrectly prefixing the session client public key onto wrapped `encryptionDataKey` and `ukycCapabilityToken` values from `wrapEncryptionKey`. `data` is now ciphertext+tag only; the server already has the client public key from session creation. ([#10036](https://github.com/MetaMask/core/pull/10036))
|
|
52
46
|
- Clear leftover MoonPay `sessionToken`, `accessToken`, and Check/Auth frame credentials when `initialize` or `createVendorCustomer` switches to another vendor, so `buildCheckFrameUrl` cannot return a MoonPay URL for a consents-path session. ([#9908](https://github.com/MetaMask/core/pull/9908))
|
|
53
47
|
- Rewind the consents path when SumSub fails before completion (thrown step or SDK close without `Completed`), instead of refreshing user status and forcing `phase` to `done`. A terminal UKYC rejection after the SDK completed still finishes as `done` so the decision can be reflected in user status. ([#9908](https://github.com/MetaMask/core/pull/9908))
|
|
54
48
|
- Make `createVendorCustomer` a no-op during in-progress phases (matching `initialize`), so a vendor switch cannot leave Check/Auth frames attached to the wrong vendor. ([#9908](https://github.com/MetaMask/core/pull/9908))
|
package/dist/KycController.cjs
CHANGED
|
@@ -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 _KycController_instances, _KycController_sumsubLauncher,
|
|
13
|
+
var _KycController_instances, _KycController_sumsubLauncher, _KycController_keypair, _KycController_authClientToken, _KycController_generation, _KycController_sessionStatusPollIntervalMs, _KycController_pollTimer, _KycController_pollToken, _KycController_userStatusPollIntervalMs, _KycController_userStatusPollTimer, _KycController_userStatusPolling, _KycController_userStatusPollToken, _KycController_localUserSecretStore, _KycController_startConsentsSession, _KycController_recordSessionDisclaimers, _KycController_createSession, _KycController_clearAcceptedTerms, _KycController_clearMoonPaySession, _KycController_dropTermsUnlessForVendor, _KycController_hasTermsForVendor, _KycController_handleCheckOutcome, _KycController_handleAuthOutcome, _KycController_continueAfterAuthentication, _KycController_requireTermsReacceptance, _KycController_buildUkycSessionVendorFields, _KycController_createUkycSession, _KycController_fetchAndApplyUserStatus, _KycController_applyUserStatus, _KycController_ensureUserStatusPolling, _KycController_stopUserStatusPolling, _KycController_startSessionStatusPolling, _KycController_pollSessionStatusOnce, _KycController_stopPolling, _KycController_cancelPendingSession, _KycController_updateIfCurrent, _KycController_applyUpdate, _KycController_assertAttestedServerPublicKey, _KycController_fail;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.KycController = exports.getDefaultKycControllerState = exports.controllerName = void 0;
|
|
16
16
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -18,7 +18,6 @@ const utils_1 = require("@metamask/utils");
|
|
|
18
18
|
const ed25519_1 = require("@noble/curves/ed25519");
|
|
19
19
|
const crypto_js_1 = require("./crypto.cjs");
|
|
20
20
|
const encoding_js_1 = require("./encoding.cjs");
|
|
21
|
-
const logger_js_1 = require("./logger.cjs");
|
|
22
21
|
const deriveClientMaterial_js_1 = require("./ukyc/deriveClientMaterial.cjs");
|
|
23
22
|
const jwtChain_js_1 = require("./ukyc/jwtChain.cjs");
|
|
24
23
|
const localUserSecret_js_1 = require("./ukyc/localUserSecret.cjs");
|
|
@@ -414,8 +413,8 @@ class KycController extends base_controller_1.BaseController {
|
|
|
414
413
|
});
|
|
415
414
|
_KycController_instances.add(this);
|
|
416
415
|
_KycController_sumsubLauncher.set(this, void 0);
|
|
417
|
-
/**
|
|
418
|
-
|
|
416
|
+
/** Ephemeral X25519 keypair for the frame key exchange (never persisted). */
|
|
417
|
+
_KycController_keypair.set(this, void 0);
|
|
419
418
|
/** Auth-frame client token, kept out of state. */
|
|
420
419
|
_KycController_authClientToken.set(this, null);
|
|
421
420
|
/**
|
|
@@ -454,6 +453,7 @@ class KycController extends base_controller_1.BaseController {
|
|
|
454
453
|
__classPrivateFieldSet(this, _KycController_sumsubLauncher, sumsubLauncher, "f");
|
|
455
454
|
__classPrivateFieldSet(this, _KycController_sessionStatusPollIntervalMs, sessionStatusPollIntervalMs, "f");
|
|
456
455
|
__classPrivateFieldSet(this, _KycController_userStatusPollIntervalMs, userStatusPollIntervalMs, "f");
|
|
456
|
+
__classPrivateFieldSet(this, _KycController_keypair, (0, crypto_js_1.generateKeyPair)(), "f");
|
|
457
457
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
458
458
|
}
|
|
459
459
|
/**
|
|
@@ -476,19 +476,10 @@ class KycController extends base_controller_1.BaseController {
|
|
|
476
476
|
// forces `phase` back through `session`/`check`, breaking an in-flight
|
|
477
477
|
// Check/Auth frame flow. Leave the active flow untouched and let the
|
|
478
478
|
// consumer drive it (or call `reset` first to start over).
|
|
479
|
-
const vendor = params?.vendor ?? 'moonpay';
|
|
480
479
|
if (IN_PROGRESS_PHASES.includes(this.state.phase)) {
|
|
481
|
-
if (vendor === 'moonpay' && !__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
|
|
482
|
-
__classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, (0, crypto_js_1.generateKeyPair)(), "f");
|
|
483
|
-
}
|
|
484
480
|
return;
|
|
485
481
|
}
|
|
486
|
-
|
|
487
|
-
__classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, (0, crypto_js_1.generateKeyPair)(), "f");
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
__classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, null, "f");
|
|
491
|
-
}
|
|
482
|
+
const vendor = params?.vendor ?? 'moonpay';
|
|
492
483
|
// `initialize` starts a fresh flow, so `activeProduct` is always reset to
|
|
493
484
|
// this call's product (or `null`). Otherwise a prior run's product could
|
|
494
485
|
// linger and cause `#continueAfterAuthentication` to auto-run the check /
|
|
@@ -611,7 +602,6 @@ class KycController extends base_controller_1.BaseController {
|
|
|
611
602
|
state.activeVendor = params.vendor;
|
|
612
603
|
if (params.vendor !== 'moonpay') {
|
|
613
604
|
__classPrivateFieldSet(this, _KycController_authClientToken, null, "f");
|
|
614
|
-
__classPrivateFieldSet(this, _KycController_moonpayFrameKeypair, null, "f");
|
|
615
605
|
__classPrivateFieldGet(this, _KycController_instances, "m", _KycController_clearMoonPaySession).call(this, state);
|
|
616
606
|
}
|
|
617
607
|
});
|
|
@@ -653,7 +643,7 @@ class KycController extends base_controller_1.BaseController {
|
|
|
653
643
|
state.geoCountry = country;
|
|
654
644
|
});
|
|
655
645
|
}
|
|
656
|
-
const disclaimers = await this.messenger.call('KycService:
|
|
646
|
+
const disclaimers = await this.messenger.call('KycService:fetchDisclaimers', {
|
|
657
647
|
vendor: this.state.activeVendor,
|
|
658
648
|
country,
|
|
659
649
|
});
|
|
@@ -784,9 +774,9 @@ class KycController extends base_controller_1.BaseController {
|
|
|
784
774
|
}
|
|
785
775
|
let accessToken;
|
|
786
776
|
let clientToken;
|
|
787
|
-
if (credsEnvelope
|
|
777
|
+
if (credsEnvelope) {
|
|
788
778
|
try {
|
|
789
|
-
const { credentials } = (0, crypto_js_1.decryptCredentials)(credsEnvelope, __classPrivateFieldGet(this,
|
|
779
|
+
const { credentials } = (0, crypto_js_1.decryptCredentials)(credsEnvelope, __classPrivateFieldGet(this, _KycController_keypair, "f").privateKey);
|
|
790
780
|
accessToken = credentials.accessToken;
|
|
791
781
|
clientToken = credentials.clientToken;
|
|
792
782
|
}
|
|
@@ -809,14 +799,12 @@ class KycController extends base_controller_1.BaseController {
|
|
|
809
799
|
* @returns The Check-frame URL or `null`.
|
|
810
800
|
*/
|
|
811
801
|
buildCheckFrameUrl() {
|
|
812
|
-
if (this.state.activeVendor !== 'moonpay' ||
|
|
813
|
-
!this.state.sessionToken ||
|
|
814
|
-
!__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
|
|
802
|
+
if (this.state.activeVendor !== 'moonpay' || !this.state.sessionToken) {
|
|
815
803
|
return null;
|
|
816
804
|
}
|
|
817
805
|
const url = new URL(`${FRAMES_BASE_URL}/check-connection`);
|
|
818
806
|
url.searchParams.set('sessionToken', this.state.sessionToken);
|
|
819
|
-
url.searchParams.set('publicKey', __classPrivateFieldGet(this,
|
|
807
|
+
url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_keypair, "f").publicKeyHex);
|
|
820
808
|
url.searchParams.set('channelId', CHANNEL_CHECK);
|
|
821
809
|
url.searchParams.set('skipKyc', 'true');
|
|
822
810
|
return url.toString();
|
|
@@ -827,14 +815,12 @@ class KycController extends base_controller_1.BaseController {
|
|
|
827
815
|
* @returns The Auth-frame URL or `null`.
|
|
828
816
|
*/
|
|
829
817
|
buildAuthFrameUrl() {
|
|
830
|
-
if (this.state.activeVendor !== 'moonpay' ||
|
|
831
|
-
!__classPrivateFieldGet(this, _KycController_authClientToken, "f") ||
|
|
832
|
-
!__classPrivateFieldGet(this, _KycController_moonpayFrameKeypair, "f")) {
|
|
818
|
+
if (this.state.activeVendor !== 'moonpay' || !__classPrivateFieldGet(this, _KycController_authClientToken, "f")) {
|
|
833
819
|
return null;
|
|
834
820
|
}
|
|
835
821
|
const url = new URL(`${FRAMES_BASE_URL}/auth`);
|
|
836
822
|
url.searchParams.set('clientToken', __classPrivateFieldGet(this, _KycController_authClientToken, "f"));
|
|
837
|
-
url.searchParams.set('publicKey', __classPrivateFieldGet(this,
|
|
823
|
+
url.searchParams.set('publicKey', __classPrivateFieldGet(this, _KycController_keypair, "f").publicKeyHex);
|
|
838
824
|
url.searchParams.set('channelId', CHANNEL_AUTH);
|
|
839
825
|
return url.toString();
|
|
840
826
|
}
|
|
@@ -1194,7 +1180,7 @@ class KycController extends base_controller_1.BaseController {
|
|
|
1194
1180
|
}
|
|
1195
1181
|
}
|
|
1196
1182
|
exports.KycController = KycController;
|
|
1197
|
-
_KycController_sumsubLauncher = new WeakMap(),
|
|
1183
|
+
_KycController_sumsubLauncher = new WeakMap(), _KycController_keypair = new WeakMap(), _KycController_authClientToken = new WeakMap(), _KycController_generation = new WeakMap(), _KycController_sessionStatusPollIntervalMs = new WeakMap(), _KycController_pollTimer = new WeakMap(), _KycController_pollToken = new WeakMap(), _KycController_userStatusPollIntervalMs = new WeakMap(), _KycController_userStatusPollTimer = new WeakMap(), _KycController_userStatusPolling = new WeakMap(), _KycController_userStatusPollToken = new WeakMap(), _KycController_instances = new WeakSet(), _KycController_localUserSecretStore = function _KycController_localUserSecretStore() {
|
|
1198
1184
|
return {
|
|
1199
1185
|
get: async (path, entropySourceId) => this.messenger.call('UserStorageController:performGetStorage', path, entropySourceId),
|
|
1200
1186
|
set: async (path, value, entropySourceId) => this.messenger.call('UserStorageController:performSetStorage', path, value, entropySourceId),
|
|
@@ -1256,7 +1242,7 @@ async function _KycController_startConsentsSession(consents) {
|
|
|
1256
1242
|
await this.refreshKycStatus();
|
|
1257
1243
|
}
|
|
1258
1244
|
catch (statusError) {
|
|
1259
|
-
|
|
1245
|
+
console.error('KYC status refresh failed:', statusError);
|
|
1260
1246
|
}
|
|
1261
1247
|
__classPrivateFieldGet(this, _KycController_instances, "m", _KycController_updateIfCurrent).call(this, generation, (state) => {
|
|
1262
1248
|
state.phase = 'done';
|
|
@@ -1292,7 +1278,7 @@ async function _KycController_startConsentsSession(consents) {
|
|
|
1292
1278
|
await this.refreshKycStatus();
|
|
1293
1279
|
}
|
|
1294
1280
|
catch (statusError) {
|
|
1295
|
-
|
|
1281
|
+
console.error('KYC status refresh failed:', statusError);
|
|
1296
1282
|
}
|
|
1297
1283
|
__classPrivateFieldGet(this, _KycController_instances, "m", _KycController_updateIfCurrent).call(this, generation, (state) => {
|
|
1298
1284
|
if (state.phase !== 'error' && state.phase !== 'done') {
|
|
@@ -1320,7 +1306,7 @@ async function _KycController_startConsentsSession(consents) {
|
|
|
1320
1306
|
});
|
|
1321
1307
|
return;
|
|
1322
1308
|
}
|
|
1323
|
-
|
|
1309
|
+
console.error('Consents session failed:', error);
|
|
1324
1310
|
if (__classPrivateFieldGet(this, _KycController_generation, "f") !== generation) {
|
|
1325
1311
|
return;
|
|
1326
1312
|
}
|
|
@@ -1451,7 +1437,7 @@ async function _KycController_createSession() {
|
|
|
1451
1437
|
});
|
|
1452
1438
|
}
|
|
1453
1439
|
catch (error) {
|
|
1454
|
-
|
|
1440
|
+
console.error('Session creation failed:', error);
|
|
1455
1441
|
// A reset() superseded this flow while the request was in flight; leave
|
|
1456
1442
|
// the idle controller alone rather than forcing it back to `terms`.
|
|
1457
1443
|
if (__classPrivateFieldGet(this, _KycController_generation, "f") !== generation) {
|