@metamask-previews/kyc-controller 0.0.0-preview-abca9bcea → 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 -12
- package/dist/KycController-method-action-types.cjs.map +1 -1
- package/dist/KycController-method-action-types.d.cts +4 -6
- package/dist/KycController-method-action-types.d.cts.map +1 -1
- package/dist/KycController-method-action-types.d.mts +4 -6
- package/dist/KycController-method-action-types.d.mts.map +1 -1
- package/dist/KycController-method-action-types.mjs.map +1 -1
- package/dist/KycController.cjs +300 -191
- package/dist/KycController.cjs.map +1 -1
- package/dist/KycController.d.cts +40 -46
- package/dist/KycController.d.cts.map +1 -1
- package/dist/KycController.d.mts +40 -46
- package/dist/KycController.d.mts.map +1 -1
- package/dist/KycController.mjs +299 -188
- 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 +119 -100
- 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 +119 -100
- package/dist/KycService.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -53
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -53
- 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/dist/vendorDisclaimerAcceptance.cjs +0 -74
- package/dist/vendorDisclaimerAcceptance.cjs.map +0 -1
- package/dist/vendorDisclaimerAcceptance.d.cts +0 -39
- package/dist/vendorDisclaimerAcceptance.d.cts.map +0 -1
- package/dist/vendorDisclaimerAcceptance.d.mts +0 -39
- package/dist/vendorDisclaimerAcceptance.d.mts.map +0 -1
- package/dist/vendorDisclaimerAcceptance.mjs +0 -67
- package/dist/vendorDisclaimerAcceptance.mjs.map +0 -1
- package/dist/vendors/MoonPayFrameHandler.cjs +0 -235
- package/dist/vendors/MoonPayFrameHandler.cjs.map +0 -1
- package/dist/vendors/MoonPayFrameHandler.d.cts +0 -74
- package/dist/vendors/MoonPayFrameHandler.d.cts.map +0 -1
- package/dist/vendors/MoonPayFrameHandler.d.mts +0 -74
- package/dist/vendors/MoonPayFrameHandler.d.mts.map +0 -1
- package/dist/vendors/MoonPayFrameHandler.mjs +0 -230
- package/dist/vendors/MoonPayFrameHandler.mjs.map +0 -1
|
@@ -7,21 +7,26 @@ import { base64UrlToBytes, toBase64Url } from "../encoding.mjs";
|
|
|
7
7
|
* The box is sealed with NaCl's `crypto_box`, keyed by the X25519 shared secret
|
|
8
8
|
* between our session client private key and the session server public key
|
|
9
9
|
* from an encryption schema (`encryptionDataKey` or `ukycCapabilityToken`)
|
|
10
|
-
* returned by `createUkycSession`. The client public key is
|
|
11
|
-
* `data
|
|
10
|
+
* returned by `createUkycSession`. The 32-byte client public key is still
|
|
11
|
+
* prefixed onto `data` so the box is self-describing on the wire.
|
|
12
12
|
*
|
|
13
13
|
* @param sessionClientPrivateKey - Our session's X25519 private key.
|
|
14
14
|
* @param sessionServerPublicKey - The server's X25519 public key (base64url).
|
|
15
15
|
* @param plaintext - The raw bytes to encrypt (e.g. the `data_encryption_key`
|
|
16
16
|
* or the encoded `ukyc_capability_token`).
|
|
17
|
-
* @returns The base64url `data` (ciphertext+tag) and
|
|
17
|
+
* @returns The base64url `data` (`clientPublicKey || ciphertext+tag`) and
|
|
18
|
+
* `nonce`.
|
|
18
19
|
*/
|
|
19
20
|
export function wrapEncryptionKey(sessionClientPrivateKey, sessionServerPublicKey, plaintext) {
|
|
20
21
|
const serverPublicKey = base64UrlToBytes(sessionServerPublicKey);
|
|
22
|
+
const { publicKey: clientPublicKey } = box.keyPair.fromSecretKey(sessionClientPrivateKey);
|
|
21
23
|
const nonce = randomBytes(box.nonceLength);
|
|
22
24
|
const ciphertext = box(plaintext, nonce, serverPublicKey, sessionClientPrivateKey);
|
|
25
|
+
const data = new Uint8Array(clientPublicKey.length + ciphertext.length);
|
|
26
|
+
data.set(clientPublicKey, 0);
|
|
27
|
+
data.set(ciphertext, clientPublicKey.length);
|
|
23
28
|
return {
|
|
24
|
-
data: toBase64Url(
|
|
29
|
+
data: toBase64Url(data),
|
|
25
30
|
nonce: toBase64Url(nonce),
|
|
26
31
|
};
|
|
27
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapEncryptionKey.mjs","sourceRoot":"","sources":["../../src/ukyc/wrapEncryptionKey.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,wBAAuB;
|
|
1
|
+
{"version":3,"file":"wrapEncryptionKey.mjs","sourceRoot":"","sources":["../../src/ukyc/wrapEncryptionKey.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,wBAAuB;AAwB/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAC/B,uBAAmC,EACnC,sBAA8B,EAC9B,SAAqB;IAErB,MAAM,eAAe,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAC9D,uBAAuB,CACxB,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,CACpB,SAAS,EACT,KAAK,EACL,eAAe,EACf,uBAAuB,CACxB,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QACvB,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["import { randomBytes, box } from 'tweetnacl';\n\nimport { base64UrlToBytes, toBase64Url } from '../encoding.js';\n\n/**\n * Wraps a secret for the UKYC session server using NaCl's `crypto_box`\n * (X25519 + XSalsa20-Poly1305) established with a per-secret wrapping key\n * returned inside an encryption schema from `createUkycSession`.\n *\n * Reuses a session client keypair whose public half is registered on\n * `createUkycSession`. `data` is still `clientPublicKey (32) || ciphertext+tag`\n * so the box can be opened from `{ data, nonce }` alone. Used for both the\n * `data_encryption_key` and the `ukyc_capability_token`.\n */\n\n/**\n * The transmitted portion of a wrapped secret: the sender public key prefixed\n * to the `crypto_box` ciphertext (which includes the 16-byte Poly1305 auth\n * tag), and the nonce, both unpadded base64url-encoded. Matches the KYC API\n * `CapabilityAuthorization` wire shape.\n */\nexport type WrappedEncryptionKeyParts = {\n data: string;\n nonce: string;\n};\n\n/**\n * Wraps `plaintext` for the UKYC session server.\n *\n * The box is sealed with NaCl's `crypto_box`, keyed by the X25519 shared secret\n * between our session client private key and the session server public key\n * from an encryption schema (`encryptionDataKey` or `ukycCapabilityToken`)\n * returned by `createUkycSession`. The 32-byte client public key is still\n * prefixed onto `data` so the box is self-describing on the wire.\n *\n * @param sessionClientPrivateKey - Our session's X25519 private key.\n * @param sessionServerPublicKey - The server's X25519 public key (base64url).\n * @param plaintext - The raw bytes to encrypt (e.g. the `data_encryption_key`\n * or the encoded `ukyc_capability_token`).\n * @returns The base64url `data` (`clientPublicKey || ciphertext+tag`) and\n * `nonce`.\n */\nexport function wrapEncryptionKey(\n sessionClientPrivateKey: Uint8Array,\n sessionServerPublicKey: string,\n plaintext: Uint8Array,\n): WrappedEncryptionKeyParts {\n const serverPublicKey = base64UrlToBytes(sessionServerPublicKey);\n const { publicKey: clientPublicKey } = box.keyPair.fromSecretKey(\n sessionClientPrivateKey,\n );\n const nonce = randomBytes(box.nonceLength);\n const ciphertext = box(\n plaintext,\n nonce,\n serverPublicKey,\n sessionClientPrivateKey,\n );\n const data = new Uint8Array(clientPublicKey.length + ciphertext.length);\n data.set(clientPublicKey, 0);\n data.set(ciphertext, clientPublicKey.length);\n return {\n data: toBase64Url(data),\n nonce: toBase64Url(nonce),\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/kyc-controller",
|
|
3
|
-
"version": "0.0.0-preview-
|
|
3
|
+
"version": "0.0.0-preview-ec24abb79",
|
|
4
4
|
"description": "Shared KYC / identity verification controller used across MetaMask clients",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@metamask/messenger": "^2.0.0",
|
|
65
65
|
"@metamask/profile-sync-controller": "^29.0.0",
|
|
66
66
|
"@metamask/superstruct": "^3.4.1",
|
|
67
|
-
"@metamask/utils": "^11.
|
|
67
|
+
"@metamask/utils": "^11.11.0",
|
|
68
68
|
"@noble/ciphers": "^1.3.0",
|
|
69
69
|
"@noble/curves": "^1.9.2",
|
|
70
70
|
"@noble/hashes": "^1.8.0",
|
package/dist/logger.cjs
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/* istanbul ignore file */
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.createModuleLogger = exports.controllerLog = exports.projectLogger = void 0;
|
|
5
|
-
const utils_1 = require("@metamask/utils");
|
|
6
|
-
Object.defineProperty(exports, "createModuleLogger", { enumerable: true, get: function () { return utils_1.createModuleLogger; } });
|
|
7
|
-
exports.projectLogger = (0, utils_1.createProjectLogger)('kyc-controller');
|
|
8
|
-
exports.controllerLog = (0, utils_1.createModuleLogger)(exports.projectLogger, 'KycController');
|
|
9
|
-
//# sourceMappingURL=logger.cjs.map
|
package/dist/logger.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.cjs","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,0BAA0B;;;AAE1B,2CAA0E;AAMjE,mGANqB,0BAAkB,OAMrB;AAJd,QAAA,aAAa,GAAG,IAAA,2BAAmB,EAAC,gBAAgB,CAAC,CAAC;AAEtD,QAAA,aAAa,GAAG,IAAA,0BAAkB,EAAC,qBAAa,EAAE,eAAe,CAAC,CAAC","sourcesContent":["/* istanbul ignore file */\n\nimport { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('kyc-controller');\n\nexport const controllerLog = createModuleLogger(projectLogger, 'KycController');\n\nexport { createModuleLogger };\n"]}
|
package/dist/logger.d.cts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/// <reference types="debug" />
|
|
2
|
-
import { createModuleLogger } from "@metamask/utils";
|
|
3
|
-
export declare const projectLogger: import("debug").Debugger;
|
|
4
|
-
export declare const controllerLog: import("debug").Debugger;
|
|
5
|
-
export { createModuleLogger };
|
|
6
|
-
//# sourceMappingURL=logger.d.cts.map
|
package/dist/logger.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.cts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAEA,OAAO,EAAuB,kBAAkB,EAAE,wBAAwB;AAE1E,eAAO,MAAM,aAAa,0BAAwC,CAAC;AAEnE,eAAO,MAAM,aAAa,0BAAqD,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/logger.d.mts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/// <reference types="debug" />
|
|
2
|
-
import { createModuleLogger } from "@metamask/utils";
|
|
3
|
-
export declare const projectLogger: import("debug").Debugger;
|
|
4
|
-
export declare const controllerLog: import("debug").Debugger;
|
|
5
|
-
export { createModuleLogger };
|
|
6
|
-
//# sourceMappingURL=logger.d.mts.map
|
package/dist/logger.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.mts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAEA,OAAO,EAAuB,kBAAkB,EAAE,wBAAwB;AAE1E,eAAO,MAAM,aAAa,0BAAwC,CAAC;AAEnE,eAAO,MAAM,aAAa,0BAAqD,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/logger.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/* istanbul ignore file */
|
|
2
|
-
import { createProjectLogger, createModuleLogger } from "@metamask/utils";
|
|
3
|
-
export const projectLogger = createProjectLogger('kyc-controller');
|
|
4
|
-
export const controllerLog = createModuleLogger(projectLogger, 'KycController');
|
|
5
|
-
export { createModuleLogger };
|
|
6
|
-
//# sourceMappingURL=logger.mjs.map
|
package/dist/logger.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.mjs","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB;AAE1E,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["/* istanbul ignore file */\n\nimport { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('kyc-controller');\n\nexport const controllerLog = createModuleLogger(projectLogger, 'KycController');\n\nexport { createModuleLogger };\n"]}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.clearVendorDisclaimerAcceptance = exports.recordVendorDisclaimerAcceptance = exports.ironDisclaimerIds = exports.hasVendorDisclaimerAcceptance = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Returns whether persisted vendor disclaimer acceptance exists for `vendor`.
|
|
6
|
-
*
|
|
7
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
8
|
-
* @param vendor - Identity vendor to inspect.
|
|
9
|
-
* @returns Whether acceptance is present for the vendor.
|
|
10
|
-
*/
|
|
11
|
-
function hasVendorDisclaimerAcceptance(accepted, vendor) {
|
|
12
|
-
if (vendor === 'moonpay') {
|
|
13
|
-
return Boolean(accepted.moonpay?.termsAcceptedAt);
|
|
14
|
-
}
|
|
15
|
-
if (vendor === 'iron') {
|
|
16
|
-
return Boolean(accepted.iron?.disclaimerIds.length);
|
|
17
|
-
}
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
exports.hasVendorDisclaimerAcceptance = hasVendorDisclaimerAcceptance;
|
|
21
|
-
/**
|
|
22
|
-
* Returns persisted Iron disclaimer ids, if any.
|
|
23
|
-
*
|
|
24
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
25
|
-
* @returns The accepted disclaimer ids, or an empty array.
|
|
26
|
-
*/
|
|
27
|
-
function ironDisclaimerIds(accepted) {
|
|
28
|
-
return accepted.iron?.disclaimerIds ?? [];
|
|
29
|
-
}
|
|
30
|
-
exports.ironDisclaimerIds = ironDisclaimerIds;
|
|
31
|
-
/**
|
|
32
|
-
* Records vendor disclaimer acceptance for the active vendor.
|
|
33
|
-
*
|
|
34
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
35
|
-
* @param vendor - Identity vendor being accepted.
|
|
36
|
-
* @param params - Acceptance payload for the vendor.
|
|
37
|
-
* @param params.termsAcceptedAt - MoonPay acceptance timestamp.
|
|
38
|
-
* @param params.disclaimerIds - Iron disclaimer ids.
|
|
39
|
-
* @returns The updated acceptance map.
|
|
40
|
-
*/
|
|
41
|
-
function recordVendorDisclaimerAcceptance(accepted, vendor, params) {
|
|
42
|
-
if (vendor === 'moonpay') {
|
|
43
|
-
return {
|
|
44
|
-
...accepted,
|
|
45
|
-
moonpay: { termsAcceptedAt: params.termsAcceptedAt },
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
if (vendor === 'iron') {
|
|
49
|
-
return {
|
|
50
|
-
...accepted,
|
|
51
|
-
iron: { disclaimerIds: params.disclaimerIds },
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
return accepted;
|
|
55
|
-
}
|
|
56
|
-
exports.recordVendorDisclaimerAcceptance = recordVendorDisclaimerAcceptance;
|
|
57
|
-
/**
|
|
58
|
-
* Clears persisted vendor disclaimer acceptance for one vendor.
|
|
59
|
-
*
|
|
60
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
61
|
-
* @param vendor - Identity vendor whose acceptance should be cleared.
|
|
62
|
-
* @returns The updated acceptance map.
|
|
63
|
-
*/
|
|
64
|
-
function clearVendorDisclaimerAcceptance(accepted, vendor) {
|
|
65
|
-
if (vendor === 'moonpay') {
|
|
66
|
-
return { ...accepted, moonpay: null };
|
|
67
|
-
}
|
|
68
|
-
if (vendor === 'iron') {
|
|
69
|
-
return { ...accepted, iron: null };
|
|
70
|
-
}
|
|
71
|
-
return accepted;
|
|
72
|
-
}
|
|
73
|
-
exports.clearVendorDisclaimerAcceptance = clearVendorDisclaimerAcceptance;
|
|
74
|
-
//# sourceMappingURL=vendorDisclaimerAcceptance.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vendorDisclaimerAcceptance.cjs","sourceRoot":"","sources":["../src/vendorDisclaimerAcceptance.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,SAAgB,6BAA6B,CAC3C,QAAsC,EACtC,MAAiB;IAEjB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAXD,sEAWC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,QAAsC;IAEtC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;AAC5C,CAAC;AAJD,8CAIC;AAED;;;;;;;;;GASG;AACH,SAAgB,gCAAgC,CAC9C,QAAsC,EACtC,MAAiB,EACjB,MAA4D;IAE5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE;SACrD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;SAC9C,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAlBD,4EAkBC;AAED;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,QAAsC,EACtC,MAAiB;IAEjB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAXD,0EAWC","sourcesContent":["import type { KycVendor, KycVendorDisclaimersAccepted } from './types.js';\n\n/**\n * Returns whether persisted vendor disclaimer acceptance exists for `vendor`.\n *\n * @param accepted - Vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor to inspect.\n * @returns Whether acceptance is present for the vendor.\n */\nexport function hasVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n): boolean {\n if (vendor === 'moonpay') {\n return Boolean(accepted.moonpay?.termsAcceptedAt);\n }\n if (vendor === 'iron') {\n return Boolean(accepted.iron?.disclaimerIds.length);\n }\n return false;\n}\n\n/**\n * Returns persisted Iron disclaimer ids, if any.\n *\n * @param accepted - Vendor-disclaimer acceptance map.\n * @returns The accepted disclaimer ids, or an empty array.\n */\nexport function ironDisclaimerIds(\n accepted: KycVendorDisclaimersAccepted,\n): string[] {\n return accepted.iron?.disclaimerIds ?? [];\n}\n\n/**\n * Records vendor disclaimer acceptance for the active vendor.\n *\n * @param accepted - Existing vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor being accepted.\n * @param params - Acceptance payload for the vendor.\n * @param params.termsAcceptedAt - MoonPay acceptance timestamp.\n * @param params.disclaimerIds - Iron disclaimer ids.\n * @returns The updated acceptance map.\n */\nexport function recordVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n params: { termsAcceptedAt: string; disclaimerIds: string[] },\n): KycVendorDisclaimersAccepted {\n if (vendor === 'moonpay') {\n return {\n ...accepted,\n moonpay: { termsAcceptedAt: params.termsAcceptedAt },\n };\n }\n if (vendor === 'iron') {\n return {\n ...accepted,\n iron: { disclaimerIds: params.disclaimerIds },\n };\n }\n return accepted;\n}\n\n/**\n * Clears persisted vendor disclaimer acceptance for one vendor.\n *\n * @param accepted - Existing vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor whose acceptance should be cleared.\n * @returns The updated acceptance map.\n */\nexport function clearVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n): KycVendorDisclaimersAccepted {\n if (vendor === 'moonpay') {\n return { ...accepted, moonpay: null };\n }\n if (vendor === 'iron') {\n return { ...accepted, iron: null };\n }\n return accepted;\n}\n"]}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { KycVendor, KycVendorDisclaimersAccepted } from "./types.cjs";
|
|
2
|
-
/**
|
|
3
|
-
* Returns whether persisted vendor disclaimer acceptance exists for `vendor`.
|
|
4
|
-
*
|
|
5
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
6
|
-
* @param vendor - Identity vendor to inspect.
|
|
7
|
-
* @returns Whether acceptance is present for the vendor.
|
|
8
|
-
*/
|
|
9
|
-
export declare function hasVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor): boolean;
|
|
10
|
-
/**
|
|
11
|
-
* Returns persisted Iron disclaimer ids, if any.
|
|
12
|
-
*
|
|
13
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
14
|
-
* @returns The accepted disclaimer ids, or an empty array.
|
|
15
|
-
*/
|
|
16
|
-
export declare function ironDisclaimerIds(accepted: KycVendorDisclaimersAccepted): string[];
|
|
17
|
-
/**
|
|
18
|
-
* Records vendor disclaimer acceptance for the active vendor.
|
|
19
|
-
*
|
|
20
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
21
|
-
* @param vendor - Identity vendor being accepted.
|
|
22
|
-
* @param params - Acceptance payload for the vendor.
|
|
23
|
-
* @param params.termsAcceptedAt - MoonPay acceptance timestamp.
|
|
24
|
-
* @param params.disclaimerIds - Iron disclaimer ids.
|
|
25
|
-
* @returns The updated acceptance map.
|
|
26
|
-
*/
|
|
27
|
-
export declare function recordVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor, params: {
|
|
28
|
-
termsAcceptedAt: string;
|
|
29
|
-
disclaimerIds: string[];
|
|
30
|
-
}): KycVendorDisclaimersAccepted;
|
|
31
|
-
/**
|
|
32
|
-
* Clears persisted vendor disclaimer acceptance for one vendor.
|
|
33
|
-
*
|
|
34
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
35
|
-
* @param vendor - Identity vendor whose acceptance should be cleared.
|
|
36
|
-
* @returns The updated acceptance map.
|
|
37
|
-
*/
|
|
38
|
-
export declare function clearVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor): KycVendorDisclaimersAccepted;
|
|
39
|
-
//# sourceMappingURL=vendorDisclaimerAcceptance.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vendorDisclaimerAcceptance.d.cts","sourceRoot":"","sources":["../src/vendorDisclaimerAcceptance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B,EAAE,oBAAmB;AAE1E;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,GAChB,OAAO,CAQT;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,4BAA4B,GACrC,MAAM,EAAE,CAEV;AAED;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3D,4BAA4B,CAc9B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,GAChB,4BAA4B,CAQ9B"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { KycVendor, KycVendorDisclaimersAccepted } from "./types.mjs";
|
|
2
|
-
/**
|
|
3
|
-
* Returns whether persisted vendor disclaimer acceptance exists for `vendor`.
|
|
4
|
-
*
|
|
5
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
6
|
-
* @param vendor - Identity vendor to inspect.
|
|
7
|
-
* @returns Whether acceptance is present for the vendor.
|
|
8
|
-
*/
|
|
9
|
-
export declare function hasVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor): boolean;
|
|
10
|
-
/**
|
|
11
|
-
* Returns persisted Iron disclaimer ids, if any.
|
|
12
|
-
*
|
|
13
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
14
|
-
* @returns The accepted disclaimer ids, or an empty array.
|
|
15
|
-
*/
|
|
16
|
-
export declare function ironDisclaimerIds(accepted: KycVendorDisclaimersAccepted): string[];
|
|
17
|
-
/**
|
|
18
|
-
* Records vendor disclaimer acceptance for the active vendor.
|
|
19
|
-
*
|
|
20
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
21
|
-
* @param vendor - Identity vendor being accepted.
|
|
22
|
-
* @param params - Acceptance payload for the vendor.
|
|
23
|
-
* @param params.termsAcceptedAt - MoonPay acceptance timestamp.
|
|
24
|
-
* @param params.disclaimerIds - Iron disclaimer ids.
|
|
25
|
-
* @returns The updated acceptance map.
|
|
26
|
-
*/
|
|
27
|
-
export declare function recordVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor, params: {
|
|
28
|
-
termsAcceptedAt: string;
|
|
29
|
-
disclaimerIds: string[];
|
|
30
|
-
}): KycVendorDisclaimersAccepted;
|
|
31
|
-
/**
|
|
32
|
-
* Clears persisted vendor disclaimer acceptance for one vendor.
|
|
33
|
-
*
|
|
34
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
35
|
-
* @param vendor - Identity vendor whose acceptance should be cleared.
|
|
36
|
-
* @returns The updated acceptance map.
|
|
37
|
-
*/
|
|
38
|
-
export declare function clearVendorDisclaimerAcceptance(accepted: KycVendorDisclaimersAccepted, vendor: KycVendor): KycVendorDisclaimersAccepted;
|
|
39
|
-
//# sourceMappingURL=vendorDisclaimerAcceptance.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vendorDisclaimerAcceptance.d.mts","sourceRoot":"","sources":["../src/vendorDisclaimerAcceptance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B,EAAE,oBAAmB;AAE1E;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,GAChB,OAAO,CAQT;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,4BAA4B,GACrC,MAAM,EAAE,CAEV;AAED;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3D,4BAA4B,CAc9B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,4BAA4B,EACtC,MAAM,EAAE,SAAS,GAChB,4BAA4B,CAQ9B"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns whether persisted vendor disclaimer acceptance exists for `vendor`.
|
|
3
|
-
*
|
|
4
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
5
|
-
* @param vendor - Identity vendor to inspect.
|
|
6
|
-
* @returns Whether acceptance is present for the vendor.
|
|
7
|
-
*/
|
|
8
|
-
export function hasVendorDisclaimerAcceptance(accepted, vendor) {
|
|
9
|
-
if (vendor === 'moonpay') {
|
|
10
|
-
return Boolean(accepted.moonpay?.termsAcceptedAt);
|
|
11
|
-
}
|
|
12
|
-
if (vendor === 'iron') {
|
|
13
|
-
return Boolean(accepted.iron?.disclaimerIds.length);
|
|
14
|
-
}
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Returns persisted Iron disclaimer ids, if any.
|
|
19
|
-
*
|
|
20
|
-
* @param accepted - Vendor-disclaimer acceptance map.
|
|
21
|
-
* @returns The accepted disclaimer ids, or an empty array.
|
|
22
|
-
*/
|
|
23
|
-
export function ironDisclaimerIds(accepted) {
|
|
24
|
-
return accepted.iron?.disclaimerIds ?? [];
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Records vendor disclaimer acceptance for the active vendor.
|
|
28
|
-
*
|
|
29
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
30
|
-
* @param vendor - Identity vendor being accepted.
|
|
31
|
-
* @param params - Acceptance payload for the vendor.
|
|
32
|
-
* @param params.termsAcceptedAt - MoonPay acceptance timestamp.
|
|
33
|
-
* @param params.disclaimerIds - Iron disclaimer ids.
|
|
34
|
-
* @returns The updated acceptance map.
|
|
35
|
-
*/
|
|
36
|
-
export function recordVendorDisclaimerAcceptance(accepted, vendor, params) {
|
|
37
|
-
if (vendor === 'moonpay') {
|
|
38
|
-
return {
|
|
39
|
-
...accepted,
|
|
40
|
-
moonpay: { termsAcceptedAt: params.termsAcceptedAt },
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
if (vendor === 'iron') {
|
|
44
|
-
return {
|
|
45
|
-
...accepted,
|
|
46
|
-
iron: { disclaimerIds: params.disclaimerIds },
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return accepted;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Clears persisted vendor disclaimer acceptance for one vendor.
|
|
53
|
-
*
|
|
54
|
-
* @param accepted - Existing vendor-disclaimer acceptance map.
|
|
55
|
-
* @param vendor - Identity vendor whose acceptance should be cleared.
|
|
56
|
-
* @returns The updated acceptance map.
|
|
57
|
-
*/
|
|
58
|
-
export function clearVendorDisclaimerAcceptance(accepted, vendor) {
|
|
59
|
-
if (vendor === 'moonpay') {
|
|
60
|
-
return { ...accepted, moonpay: null };
|
|
61
|
-
}
|
|
62
|
-
if (vendor === 'iron') {
|
|
63
|
-
return { ...accepted, iron: null };
|
|
64
|
-
}
|
|
65
|
-
return accepted;
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=vendorDisclaimerAcceptance.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vendorDisclaimerAcceptance.mjs","sourceRoot":"","sources":["../src/vendorDisclaimerAcceptance.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAsC,EACtC,MAAiB;IAEjB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAsC;IAEtC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAAsC,EACtC,MAAiB,EACjB,MAA4D;IAE5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,QAAQ;YACX,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE;SACrD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;SAC9C,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAAsC,EACtC,MAAiB;IAEjB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type { KycVendor, KycVendorDisclaimersAccepted } from './types.js';\n\n/**\n * Returns whether persisted vendor disclaimer acceptance exists for `vendor`.\n *\n * @param accepted - Vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor to inspect.\n * @returns Whether acceptance is present for the vendor.\n */\nexport function hasVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n): boolean {\n if (vendor === 'moonpay') {\n return Boolean(accepted.moonpay?.termsAcceptedAt);\n }\n if (vendor === 'iron') {\n return Boolean(accepted.iron?.disclaimerIds.length);\n }\n return false;\n}\n\n/**\n * Returns persisted Iron disclaimer ids, if any.\n *\n * @param accepted - Vendor-disclaimer acceptance map.\n * @returns The accepted disclaimer ids, or an empty array.\n */\nexport function ironDisclaimerIds(\n accepted: KycVendorDisclaimersAccepted,\n): string[] {\n return accepted.iron?.disclaimerIds ?? [];\n}\n\n/**\n * Records vendor disclaimer acceptance for the active vendor.\n *\n * @param accepted - Existing vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor being accepted.\n * @param params - Acceptance payload for the vendor.\n * @param params.termsAcceptedAt - MoonPay acceptance timestamp.\n * @param params.disclaimerIds - Iron disclaimer ids.\n * @returns The updated acceptance map.\n */\nexport function recordVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n params: { termsAcceptedAt: string; disclaimerIds: string[] },\n): KycVendorDisclaimersAccepted {\n if (vendor === 'moonpay') {\n return {\n ...accepted,\n moonpay: { termsAcceptedAt: params.termsAcceptedAt },\n };\n }\n if (vendor === 'iron') {\n return {\n ...accepted,\n iron: { disclaimerIds: params.disclaimerIds },\n };\n }\n return accepted;\n}\n\n/**\n * Clears persisted vendor disclaimer acceptance for one vendor.\n *\n * @param accepted - Existing vendor-disclaimer acceptance map.\n * @param vendor - Identity vendor whose acceptance should be cleared.\n * @returns The updated acceptance map.\n */\nexport function clearVendorDisclaimerAcceptance(\n accepted: KycVendorDisclaimersAccepted,\n vendor: KycVendor,\n): KycVendorDisclaimersAccepted {\n if (vendor === 'moonpay') {\n return { ...accepted, moonpay: null };\n }\n if (vendor === 'iron') {\n return { ...accepted, iron: null };\n }\n return accepted;\n}\n"]}
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _MoonPayFrameHandler_instances, _MoonPayFrameHandler_getState, _MoonPayFrameHandler_update, _MoonPayFrameHandler_fail, _MoonPayFrameHandler_onAuthenticated, _MoonPayFrameHandler_requireTermsReacceptance, _MoonPayFrameHandler_frameKeypair, _MoonPayFrameHandler_authClientToken, _MoonPayFrameHandler_handleCheckOutcome, _MoonPayFrameHandler_handleAuthOutcome;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.clearMoonPaySession = exports.MoonPayFrameHandler = void 0;
|
|
16
|
-
const crypto_js_1 = require("../crypto.cjs");
|
|
17
|
-
const FRAMES_BASE_URL = 'https://blocks.moonpay.com/platform/v1';
|
|
18
|
-
const CHANNEL_CHECK = 'ch_1';
|
|
19
|
-
const CHANNEL_AUTH = 'ch_2';
|
|
20
|
-
const CHANNEL_RESET = 'ch_reset';
|
|
21
|
-
/**
|
|
22
|
-
* Owns MoonPay Check/Auth frame state and protocol handling.
|
|
23
|
-
*/
|
|
24
|
-
class MoonPayFrameHandler {
|
|
25
|
-
constructor({ getState, update, fail, onAuthenticated, requireTermsReacceptance, }) {
|
|
26
|
-
_MoonPayFrameHandler_instances.add(this);
|
|
27
|
-
_MoonPayFrameHandler_getState.set(this, void 0);
|
|
28
|
-
_MoonPayFrameHandler_update.set(this, void 0);
|
|
29
|
-
_MoonPayFrameHandler_fail.set(this, void 0);
|
|
30
|
-
_MoonPayFrameHandler_onAuthenticated.set(this, void 0);
|
|
31
|
-
_MoonPayFrameHandler_requireTermsReacceptance.set(this, void 0);
|
|
32
|
-
/** MoonPay Check/Auth frame X25519 keypair (never persisted). */
|
|
33
|
-
_MoonPayFrameHandler_frameKeypair.set(this, null);
|
|
34
|
-
/** Auth-frame client token, kept out of controller state. */
|
|
35
|
-
_MoonPayFrameHandler_authClientToken.set(this, null);
|
|
36
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_getState, getState, "f");
|
|
37
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_update, update, "f");
|
|
38
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_fail, fail, "f");
|
|
39
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_onAuthenticated, onAuthenticated, "f");
|
|
40
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_requireTermsReacceptance, requireTermsReacceptance, "f");
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Creates a fresh keypair for a new MoonPay flow.
|
|
44
|
-
*/
|
|
45
|
-
startFlow() {
|
|
46
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_frameKeypair, (0, crypto_js_1.generateKeyPair)(), "f");
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Ensures an in-progress MoonPay flow has a frame keypair.
|
|
50
|
-
*/
|
|
51
|
-
ensureKeypair() {
|
|
52
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_frameKeypair, __classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f") ?? (0, crypto_js_1.generateKeyPair)(), "f");
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Clears all non-persisted MoonPay frame artifacts.
|
|
56
|
-
*/
|
|
57
|
-
clear() {
|
|
58
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_frameKeypair, null, "f");
|
|
59
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_authClientToken, null, "f");
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Clears authentication associated with an earlier MoonPay session.
|
|
63
|
-
*/
|
|
64
|
-
clearAuthentication() {
|
|
65
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_authClientToken, null, "f");
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Handles a message posted by a MoonPay Check/Auth frame.
|
|
69
|
-
*
|
|
70
|
-
* @param message - The raw message posted by the frame.
|
|
71
|
-
* @returns An object whose optional `reply` should be posted back.
|
|
72
|
-
*/
|
|
73
|
-
async handleMessage(message) {
|
|
74
|
-
const payload = message;
|
|
75
|
-
if (!payload) {
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
if (payload.kind === 'handshake') {
|
|
79
|
-
const channelId = payload.meta?.channelId;
|
|
80
|
-
return { reply: { version: 2, meta: { channelId }, kind: 'ack' } };
|
|
81
|
-
}
|
|
82
|
-
if (payload.kind !== 'complete') {
|
|
83
|
-
return {};
|
|
84
|
-
}
|
|
85
|
-
const channelId = payload.meta?.channelId;
|
|
86
|
-
const state = __classPrivateFieldGet(this, _MoonPayFrameHandler_getState, "f").call(this);
|
|
87
|
-
// Only honor a completion for the MoonPay frame the flow is currently
|
|
88
|
-
// waiting on. This drops stale or duplicate messages after reset, phase
|
|
89
|
-
// advancement, or a vendor switch so they cannot restore tokens or rewind
|
|
90
|
-
// the flow. Unlike awaited controller work, external frame messages are
|
|
91
|
-
// not protected by the controller's generation guard.
|
|
92
|
-
let expectedPhase = null;
|
|
93
|
-
if (channelId === CHANNEL_CHECK) {
|
|
94
|
-
expectedPhase = 'check';
|
|
95
|
-
}
|
|
96
|
-
else if (channelId === CHANNEL_AUTH) {
|
|
97
|
-
expectedPhase = 'auth';
|
|
98
|
-
}
|
|
99
|
-
if (!expectedPhase ||
|
|
100
|
-
state.phase !== expectedPhase ||
|
|
101
|
-
state.activeVendor !== 'moonpay') {
|
|
102
|
-
return {};
|
|
103
|
-
}
|
|
104
|
-
const status = payload.payload?.status;
|
|
105
|
-
const credentialsEnvelope = payload.payload?.credentials;
|
|
106
|
-
const customerId = payload.payload?.customer?.id ?? null;
|
|
107
|
-
if (customerId) {
|
|
108
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_update, "f").call(this, (draft) => {
|
|
109
|
-
draft.moonpayCustomerId = customerId;
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
if (!status) {
|
|
113
|
-
return {};
|
|
114
|
-
}
|
|
115
|
-
let accessToken;
|
|
116
|
-
let clientToken;
|
|
117
|
-
if (credentialsEnvelope && __classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f")) {
|
|
118
|
-
try {
|
|
119
|
-
const { credentials } = (0, crypto_js_1.decryptCredentials)(credentialsEnvelope, __classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f").privateKey);
|
|
120
|
-
accessToken = credentials.accessToken;
|
|
121
|
-
clientToken = credentials.clientToken;
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_fail, "f").call(this, `Failed to decrypt frame credentials: ${String(error)}`);
|
|
125
|
-
return {};
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (channelId === CHANNEL_CHECK) {
|
|
129
|
-
await __classPrivateFieldGet(this, _MoonPayFrameHandler_instances, "m", _MoonPayFrameHandler_handleCheckOutcome).call(this, status, accessToken, clientToken);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
await __classPrivateFieldGet(this, _MoonPayFrameHandler_instances, "m", _MoonPayFrameHandler_handleAuthOutcome).call(this, status, accessToken);
|
|
133
|
-
}
|
|
134
|
-
return {};
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Builds the Check-frame URL, or `null` when no session exists yet.
|
|
138
|
-
*
|
|
139
|
-
* @returns The Check-frame URL or `null`.
|
|
140
|
-
*/
|
|
141
|
-
buildCheckFrameUrl() {
|
|
142
|
-
const state = __classPrivateFieldGet(this, _MoonPayFrameHandler_getState, "f").call(this);
|
|
143
|
-
if (state.activeVendor !== 'moonpay' ||
|
|
144
|
-
!state.moonpaySessionToken ||
|
|
145
|
-
!__classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f")) {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
const url = new URL(`${FRAMES_BASE_URL}/check-connection`);
|
|
149
|
-
url.searchParams.set('sessionToken', state.moonpaySessionToken);
|
|
150
|
-
url.searchParams.set('publicKey', __classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f").publicKeyHex);
|
|
151
|
-
url.searchParams.set('channelId', CHANNEL_CHECK);
|
|
152
|
-
url.searchParams.set('skipKyc', 'true');
|
|
153
|
-
return url.toString();
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Builds the Auth-frame URL, or `null` when no client token is available.
|
|
157
|
-
*
|
|
158
|
-
* @returns The Auth-frame URL or `null`.
|
|
159
|
-
*/
|
|
160
|
-
buildAuthFrameUrl() {
|
|
161
|
-
const state = __classPrivateFieldGet(this, _MoonPayFrameHandler_getState, "f").call(this);
|
|
162
|
-
if (state.activeVendor !== 'moonpay' ||
|
|
163
|
-
!__classPrivateFieldGet(this, _MoonPayFrameHandler_authClientToken, "f") ||
|
|
164
|
-
!__classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f")) {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
const url = new URL(`${FRAMES_BASE_URL}/auth`);
|
|
168
|
-
url.searchParams.set('clientToken', __classPrivateFieldGet(this, _MoonPayFrameHandler_authClientToken, "f"));
|
|
169
|
-
url.searchParams.set('publicKey', __classPrivateFieldGet(this, _MoonPayFrameHandler_frameKeypair, "f").publicKeyHex);
|
|
170
|
-
url.searchParams.set('channelId', CHANNEL_AUTH);
|
|
171
|
-
return url.toString();
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Builds the Reset-frame URL.
|
|
175
|
-
*
|
|
176
|
-
* @returns The Reset-frame URL.
|
|
177
|
-
*/
|
|
178
|
-
buildResetFrameUrl() {
|
|
179
|
-
const url = new URL(`${FRAMES_BASE_URL}/reset`);
|
|
180
|
-
url.searchParams.set('channelId', CHANNEL_RESET);
|
|
181
|
-
return url.toString();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
exports.MoonPayFrameHandler = MoonPayFrameHandler;
|
|
185
|
-
_MoonPayFrameHandler_getState = new WeakMap(), _MoonPayFrameHandler_update = new WeakMap(), _MoonPayFrameHandler_fail = new WeakMap(), _MoonPayFrameHandler_onAuthenticated = new WeakMap(), _MoonPayFrameHandler_requireTermsReacceptance = new WeakMap(), _MoonPayFrameHandler_frameKeypair = new WeakMap(), _MoonPayFrameHandler_authClientToken = new WeakMap(), _MoonPayFrameHandler_instances = new WeakSet(), _MoonPayFrameHandler_handleCheckOutcome = async function _MoonPayFrameHandler_handleCheckOutcome(status, accessToken, clientToken) {
|
|
186
|
-
if (status === 'active' && accessToken) {
|
|
187
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_update, "f").call(this, (state) => {
|
|
188
|
-
state.moonpayAccessToken = accessToken;
|
|
189
|
-
state.phase = 'form';
|
|
190
|
-
state.statusMessage = 'Already authenticated. Review to submit.';
|
|
191
|
-
});
|
|
192
|
-
await __classPrivateFieldGet(this, _MoonPayFrameHandler_onAuthenticated, "f").call(this);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (status === 'connectionRequired' && clientToken) {
|
|
196
|
-
__classPrivateFieldSet(this, _MoonPayFrameHandler_authClientToken, clientToken, "f");
|
|
197
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_update, "f").call(this, (state) => {
|
|
198
|
-
state.phase = 'auth';
|
|
199
|
-
state.statusMessage = 'Verify your email via OTP in the Auth frame.';
|
|
200
|
-
});
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (status === 'termsAcceptanceRequired') {
|
|
204
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_requireTermsReacceptance, "f").call(this);
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_fail, "f").call(this, `Check frame returned status: ${status}`);
|
|
208
|
-
}, _MoonPayFrameHandler_handleAuthOutcome = async function _MoonPayFrameHandler_handleAuthOutcome(status, accessToken) {
|
|
209
|
-
if (status === 'active' && accessToken) {
|
|
210
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_update, "f").call(this, (state) => {
|
|
211
|
-
state.moonpayAccessToken = accessToken;
|
|
212
|
-
state.phase = 'form';
|
|
213
|
-
state.statusMessage = 'Authenticated. Review to submit.';
|
|
214
|
-
});
|
|
215
|
-
await __classPrivateFieldGet(this, _MoonPayFrameHandler_onAuthenticated, "f").call(this);
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
if (status === 'termsAcceptanceRequired') {
|
|
219
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_requireTermsReacceptance, "f").call(this);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
__classPrivateFieldGet(this, _MoonPayFrameHandler_fail, "f").call(this, `Auth frame returned status: ${status}`);
|
|
223
|
-
};
|
|
224
|
-
/**
|
|
225
|
-
* Drops persisted-in-memory MoonPay session artifacts from controller state.
|
|
226
|
-
*
|
|
227
|
-
* @param state - The state to mutate.
|
|
228
|
-
*/
|
|
229
|
-
function clearMoonPaySession(state) {
|
|
230
|
-
state.moonpayCustomerId = null;
|
|
231
|
-
state.moonpaySessionToken = null;
|
|
232
|
-
state.moonpayAccessToken = null;
|
|
233
|
-
}
|
|
234
|
-
exports.clearMoonPaySession = clearMoonPaySession;
|
|
235
|
-
//# sourceMappingURL=MoonPayFrameHandler.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MoonPayFrameHandler.cjs","sourceRoot":"","sources":["../../src/vendors/MoonPayFrameHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { decryptCredentials, generateKeyPair } from '../crypto.js';\nimport type { EncryptedCredentialsEnvelope, X25519KeyPair } from '../crypto.js';\nimport type { KycPhase, KycVendor } from '../types.js';\n\nconst FRAMES_BASE_URL = 'https://blocks.moonpay.com/platform/v1';\nconst CHANNEL_CHECK = 'ch_1';\nconst CHANNEL_AUTH = 'ch_2';\nconst CHANNEL_RESET = 'ch_reset';\n\ntype MoonPayFrameState = {\n activeVendor: KycVendor;\n moonpayAccessToken: string | null;\n moonpayCustomerId: string | null;\n moonpaySessionToken: string | null;\n phase: KycPhase;\n statusMessage: string;\n};\n\ntype FrameMessage = {\n meta?: { channelId?: string };\n kind?: string;\n payload?: {\n status?:\n | 'active'\n | 'connectionRequired'\n | 'termsAcceptanceRequired'\n | 'pending'\n | 'unavailable'\n | 'failed';\n credentials?: EncryptedCredentialsEnvelope | string;\n customer?: { id?: string };\n };\n};\n\ntype FrameStatus = NonNullable<FrameMessage['payload']>['status'];\n\nexport type MoonPayFrameHandlerOptions = {\n getState: () => MoonPayFrameState;\n update: (updater: (state: MoonPayFrameState) => void) => void;\n fail: (message: string) => void;\n onAuthenticated: () => Promise<void>;\n requireTermsReacceptance: () => void;\n};\n\n/**\n * Owns MoonPay Check/Auth frame state and protocol handling.\n */\nexport class MoonPayFrameHandler {\n readonly #getState: MoonPayFrameHandlerOptions['getState'];\n\n readonly #update: MoonPayFrameHandlerOptions['update'];\n\n readonly #fail: MoonPayFrameHandlerOptions['fail'];\n\n readonly #onAuthenticated: MoonPayFrameHandlerOptions['onAuthenticated'];\n\n readonly #requireTermsReacceptance: MoonPayFrameHandlerOptions['requireTermsReacceptance'];\n\n /** MoonPay Check/Auth frame X25519 keypair (never persisted). */\n #frameKeypair: X25519KeyPair | null = null;\n\n /** Auth-frame client token, kept out of controller state. */\n #authClientToken: string | null = null;\n\n constructor({\n getState,\n update,\n fail,\n onAuthenticated,\n requireTermsReacceptance,\n }: MoonPayFrameHandlerOptions) {\n this.#getState = getState;\n this.#update = update;\n this.#fail = fail;\n this.#onAuthenticated = onAuthenticated;\n this.#requireTermsReacceptance = requireTermsReacceptance;\n }\n\n /**\n * Creates a fresh keypair for a new MoonPay flow.\n */\n startFlow(): void {\n this.#frameKeypair = generateKeyPair();\n }\n\n /**\n * Ensures an in-progress MoonPay flow has a frame keypair.\n */\n ensureKeypair(): void {\n this.#frameKeypair ??= generateKeyPair();\n }\n\n /**\n * Clears all non-persisted MoonPay frame artifacts.\n */\n clear(): void {\n this.#frameKeypair = null;\n this.#authClientToken = null;\n }\n\n /**\n * Clears authentication associated with an earlier MoonPay session.\n */\n clearAuthentication(): void {\n this.#authClientToken = null;\n }\n\n /**\n * Handles a message posted by a MoonPay Check/Auth frame.\n *\n * @param message - The raw message posted by the frame.\n * @returns An object whose optional `reply` should be posted back.\n */\n async handleMessage(message: unknown): Promise<{ reply?: unknown }> {\n const payload = message as FrameMessage | undefined;\n\n if (!payload) {\n return {};\n }\n\n if (payload.kind === 'handshake') {\n const channelId = payload.meta?.channelId;\n return { reply: { version: 2, meta: { channelId }, kind: 'ack' } };\n }\n\n if (payload.kind !== 'complete') {\n return {};\n }\n\n const channelId = payload.meta?.channelId;\n const state = this.#getState();\n\n // Only honor a completion for the MoonPay frame the flow is currently\n // waiting on. This drops stale or duplicate messages after reset, phase\n // advancement, or a vendor switch so they cannot restore tokens or rewind\n // the flow. Unlike awaited controller work, external frame messages are\n // not protected by the controller's generation guard.\n let expectedPhase: KycPhase | null = null;\n if (channelId === CHANNEL_CHECK) {\n expectedPhase = 'check';\n } else if (channelId === CHANNEL_AUTH) {\n expectedPhase = 'auth';\n }\n\n if (\n !expectedPhase ||\n state.phase !== expectedPhase ||\n state.activeVendor !== 'moonpay'\n ) {\n return {};\n }\n\n const status = payload.payload?.status;\n const credentialsEnvelope = payload.payload?.credentials;\n const customerId = payload.payload?.customer?.id ?? null;\n\n if (customerId) {\n this.#update((draft) => {\n draft.moonpayCustomerId = customerId;\n });\n }\n\n if (!status) {\n return {};\n }\n\n let accessToken: string | undefined;\n let clientToken: string | undefined;\n if (credentialsEnvelope && this.#frameKeypair) {\n try {\n const { credentials } = decryptCredentials(\n credentialsEnvelope,\n this.#frameKeypair.privateKey,\n );\n accessToken = credentials.accessToken;\n clientToken = credentials.clientToken;\n } catch (error) {\n this.#fail(`Failed to decrypt frame credentials: ${String(error)}`);\n return {};\n }\n }\n\n if (channelId === CHANNEL_CHECK) {\n await this.#handleCheckOutcome(status, accessToken, clientToken);\n } else {\n await this.#handleAuthOutcome(status, accessToken);\n }\n return {};\n }\n\n /**\n * Builds the Check-frame URL, or `null` when no session exists yet.\n *\n * @returns The Check-frame URL or `null`.\n */\n buildCheckFrameUrl(): string | null {\n const state = this.#getState();\n if (\n state.activeVendor !== 'moonpay' ||\n !state.moonpaySessionToken ||\n !this.#frameKeypair\n ) {\n return null;\n }\n const url = new URL(`${FRAMES_BASE_URL}/check-connection`);\n url.searchParams.set('sessionToken', state.moonpaySessionToken);\n url.searchParams.set('publicKey', this.#frameKeypair.publicKeyHex);\n url.searchParams.set('channelId', CHANNEL_CHECK);\n url.searchParams.set('skipKyc', 'true');\n return url.toString();\n }\n\n /**\n * Builds the Auth-frame URL, or `null` when no client token is available.\n *\n * @returns The Auth-frame URL or `null`.\n */\n buildAuthFrameUrl(): string | null {\n const state = this.#getState();\n if (\n state.activeVendor !== 'moonpay' ||\n !this.#authClientToken ||\n !this.#frameKeypair\n ) {\n return null;\n }\n const url = new URL(`${FRAMES_BASE_URL}/auth`);\n url.searchParams.set('clientToken', this.#authClientToken);\n url.searchParams.set('publicKey', this.#frameKeypair.publicKeyHex);\n url.searchParams.set('channelId', CHANNEL_AUTH);\n return url.toString();\n }\n\n /**\n * Builds the Reset-frame URL.\n *\n * @returns The Reset-frame URL.\n */\n buildResetFrameUrl(): string {\n const url = new URL(`${FRAMES_BASE_URL}/reset`);\n url.searchParams.set('channelId', CHANNEL_RESET);\n return url.toString();\n }\n\n async #handleCheckOutcome(\n status: FrameStatus,\n accessToken?: string,\n clientToken?: string,\n ): Promise<void> {\n if (status === 'active' && accessToken) {\n this.#update((state) => {\n state.moonpayAccessToken = accessToken;\n state.phase = 'form';\n state.statusMessage = 'Already authenticated. Review to submit.';\n });\n await this.#onAuthenticated();\n return;\n }\n if (status === 'connectionRequired' && clientToken) {\n this.#authClientToken = clientToken;\n this.#update((state) => {\n state.phase = 'auth';\n state.statusMessage = 'Verify your email via OTP in the Auth frame.';\n });\n return;\n }\n if (status === 'termsAcceptanceRequired') {\n this.#requireTermsReacceptance();\n return;\n }\n this.#fail(`Check frame returned status: ${status}`);\n }\n\n async #handleAuthOutcome(\n status: FrameStatus,\n accessToken?: string,\n ): Promise<void> {\n if (status === 'active' && accessToken) {\n this.#update((state) => {\n state.moonpayAccessToken = accessToken;\n state.phase = 'form';\n state.statusMessage = 'Authenticated. Review to submit.';\n });\n await this.#onAuthenticated();\n return;\n }\n if (status === 'termsAcceptanceRequired') {\n this.#requireTermsReacceptance();\n return;\n }\n this.#fail(`Auth frame returned status: ${status}`);\n }\n}\n\n/**\n * Drops persisted-in-memory MoonPay session artifacts from controller state.\n *\n * @param state - The state to mutate.\n */\nexport function clearMoonPaySession(state: MoonPayFrameState): void {\n state.moonpayCustomerId = null;\n state.moonpaySessionToken = null;\n state.moonpayAccessToken = null;\n}\n"]}
|